# Animations

{% 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.

![Speed, Pose and Jump parameters are available bindings on CoherenceSync as variables](https://3798176112-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZcBSvjNQZSas5L9C0K8K%2Fuploads%2FN8RCAAWUHrjnPertPiJp%2FScreenshot%202022-01-14%20at%2014.28.13.png?alt=media)

### Triggers

Triggers can be invoked over the network using [commands](https://docs.coherence.io/0.9/authority/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;
using System.Collections.Generic;

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 to the *PlayJumpAnimator*.

![](https://3798176112-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZcBSvjNQZSas5L9C0K8K%2Fuploads%2FjkJHdkgXyZUVnT81i2sH%2FScreenshot%202022-01-14%20at%2014.51.00.png?alt=media)
