# 4. MatchTarget, CrossFade, Rebind, OverrideController Part of [[Animation Advanced]]. Prev: [[3.Root Motion Advanced]]. Next: [[5.Sub-State Machines Combat Locomotion]]. **Docs:** [MatchTarget](https://docs.unity3d.com/6000.5/Documentation/ScriptReference/Animator.MatchTarget.html) · [CrossFade](https://docs.unity3d.com/6000.5/Documentation/ScriptReference/Animator.CrossFade.html) · [Animator Override Controller](https://docs.unity3d.com/6000.5/Documentation/Manual/AnimatorOverrideController.html) · [Animator API](https://docs.unity.com/en-us/engine/6000.5/script-reference/unityengine/animator) ## 4.1 MatchTarget Adjusts the GameObject so an `AvatarTarget` reaches a world pose at a normalized clip time. **Hard rules (docs):** - Works on **base layer (0) only**. - Only **one** match queued; wait until finished or it is discarded. - Requires **`animator.applyRootMotion`** enabled. - If start normalized time &lt; current and clip loops, start time advances to next loop. ```csharp using UnityEngine; /// <summary> /// Match RightHand to a door handle during a normalized window. /// NOT compiled in Unity. /// </summary> public sealed class DoorMatchTarget : MonoBehaviour { [SerializeField] Animator animator; [SerializeField] Transform handle; [SerializeField] float startNorm = 0.1f; [SerializeField] float endNorm = 0.7f; public void TryMatch() { if (animator.isMatchingTarget) return; if (!animator.applyRootMotion) return; var mask = new MatchTargetWeightMask(Vector3.one, 0f); // pos yes, rot no animator.MatchTarget( handle.position, handle.rotation, AvatarTarget.RightHand, mask, startNorm, endNorm); } } ``` Use for vault plants, door hands, ledge grabs. For continuous aiming, prefer IK ([[5.Animation Rigging and Script IK]]) over MatchTarget. ## 4.2 CrossFade / CrossFadeInFixedTime ```csharp using UnityEngine; public sealed class AnimCrossFade : MonoBehaviour { [SerializeField] Animator animator; // Docs: include parent layer name, e.g. "Base Layer.Run" static readonly int RunHash = Animator.StringToHash("Base Layer.Run"); static readonly int AttackHash = Animator.StringToHash("Base Layer.Attack"); public void GoRun(float fade = 0.15f) { animator.CrossFade(RunHash, fade, 0); } public void GoAttackFixed(float fadeSeconds = 0.1f) { animator.CrossFadeInFixedTime(AttackHash, fadeSeconds, 0); } } ``` Precompute hashes — `CrossFade(string)` calls `StringToHash` internally every time. For interruptible combat, combine with cancel windows (part 2) rather than raw CrossFade from every input. ## 4.3 Rebind `Animator.Rebind()` / controller swaps recollect bindings and can refresh default values (part 2). Animator API guidance: - Switching **AnimatorController** assets resets state machines to defaults — highest Rebind-ish cost path for clip set changes. - Prefer **prebuilt `AnimatorOverrideController`** assets to swap clips **without** resetting state-machine state; Edit-time override assets have Rebind cost similar to changing controller binding-wise but keep logic. - Dynamic `ApplyOverrides` lists are heavier than prebuilt assets. ```csharp using UnityEngine; public sealed class SkinOverrideSwap : MonoBehaviour { [SerializeField] Animator animator; [SerializeField] AnimatorOverrideController goblin; [SerializeField] AnimatorOverrideController ogre; public void UseOgre() => animator.runtimeAnimatorController = ogre; public void UseGoblin() => animator.runtimeAnimatorController = goblin; } ``` ## 4.4 AnimatorOverrideController authoring Manual (6000.5): 1. Create base Animator Controller with full logic. 2. **Create → Animation → Animator Override Controller**. 3. Assign Controller; replace clips in the Override column. 4. Assign the override asset on the character Animator. 5. **Use normalized Exit Time** — docs warn fixed-second exit times break when override clips are shorter. Same state machine → many character variants (elf/ogre/goblin). Gameplay brain stays identical ([[Enemy AI State Machine]]). ## 4.5 Timeline coexistence [[Timeline Basics]] Animation tracks / Override tracks can temporarily own weights and clips. On Director stop, restore `runtimeAnimatorController` and layer weights if Timeline swapped them. Do not Rebind every frame. ## Unverified - Exact `MatchTarget` `completeMatch` overload usage in all 6000.5 patch notes. - `ApplyOverrides` list API details — prefer prebuilt assets per docs.