# 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 < 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.