Shared Events

Every object that plays a particular Transition will share the same AnimancerEvent.Sequence, meaning that any modifications made by one object will affect the others as well. Animancer tries to detect when this happens and will log OptionalWarning.DuplicateEvent if you add the same event to a sequence multiple times with a link leading here so you can try any of the following workarounds.

UnShared

If you are using Transition Assets to share the same transition among multiple objects, you can reference them using an UnShared field.

Instantiate

Or you can Instantiate a copy of the Transition Asset for each character on startup:

[SerializeField] private ClipTransition _Animation;

private void Awake()
{
    _Animation = Instantiate(_Animation);
    // Now you can modify the _Animation.Transition.Events as necessary.
}

That gives each object a separate copy of the transition so they no longer share the same AnimancerEvent.Sequence, but wastes some additional processing time and memory because all the other transition data gets duplicated as well.

This approach also works for custom ScriptableObject types (where UnShared fields only work for Transition Assets).

Manual Copy

A more efficient solution is to make your own copy of the AnimancerEvent.Sequence for each object:

[SerializeField] private AnimancerComponent _Animancer;
[SerializeField] private ClipTransition _Animation;

private AnimancerEvent.Sequence _Events;

private void Awake()
{
    // Initialise your events by copying the sequence from the transition.
    _Events = new AnimancerEvent.Sequence(_Animation.Transition.Events);
    // Now you can modify the _Events as necessary.
}

private void PlayAnimation()
{
    // Then when you play it, just replace the transition events with your own:
    var state = _Animancer.Play(_Animation);
    state.Events = _Events;
}

Unfortunately, this requires you to write and maintain quite a bit more code.