# Animation

{% hint style="info" %}
**coherence** only replicates animation parameters, not state. Latency can create scenarios where different Clients reproduce different animations. Take this into account when working with Animator Controllers that require precise timings.
{% endhint %}

Unity Animator's parameters are bindable out of the box, **with the exception of triggers**.

![Guard, Walk, MovX and MovY parameters available on CoherenceSync as variables](https://content.gitbook.com/content/naCaDgmbFRSw0e7nxNNK/blobs/WHtMcozagBtHvI28CKxa/Screenshot%202023-04-26%20102136.png)

### Multiple AnimatorControllers

While **coherence** doesn't officially support working with multiple AnimatorControllers, there's a way to work around it. As long as the parameters you want to network are shared among the AnimatorControllers you want to use, they will get networked. Parameters need to have the same type and name. Using the example above, any AnimatorController featuring a Boolean *Walk* parameter is compatible, and can be switched.

### Triggers

Triggers can be invoked over the network using [commands](https://docs.coherence.io/1.2/coherence-sdk-for-unity/networking-state-changes/commands). Here's an example where we inform networked Clients that we have played a jump animation:

```csharp
using UnityEngine;
using Coherence;
using Coherence.Toolkit;

public class JumpController : MonoBehaviour
{
    CoherenceSync coherenceSync;
    Animator animator;

    void Awake()
    {
        coherenceSync = GetComponent<CoherenceSync>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        if (!coherenceSync.HasInputAuthority)
        {
            return;
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            MakePlayerJump();
        }
    }

    void MakePlayerJump()
    {
        coherenceSync.SendCommand<JumpController>(nameof(PlayJumpAnimation), MessageTarget.All, coherenceSync);
    }

    // bind to this method via the Bindings window
    public void PlayJumpAnimation(CoherenceSync jumpSync)
    {
        animator.SetTrigger("Jump");
    }
}
```

Now, bind the `PlayJumpAnimator` method as a [command](https://docs.coherence.io/1.2/coherence-sdk-for-unity/networking-state-changes/commands).

![PlayJumpAnimation command](https://content.gitbook.com/content/naCaDgmbFRSw0e7nxNNK/blobs/Yf0kFUhJlEqxsXxeoiDS/spaces_OnNWMLfYsbCzCnIbNrcP_uploads_uKXXoPoFVA6lxu8y7eMl_Screenshot%202022-01-14%20at%2014.51.00.png)
