Skip to content

Commit 61fe5ee

Browse files
committed
Change how runtime animator overrides are managed
1 parent 320812b commit 61fe5ee

File tree

2 files changed

+30
-19
lines changed

2 files changed

+30
-19
lines changed

Runtime/Code/Player/Character/Animation/CharacterAnimationHelper.cs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,19 @@ private void Awake() {
6262
}
6363

6464
// // Make a new instance of the animator override controller
65-
// if (!this.animatorOverride) {
66-
// if (this.animator.runtimeAnimatorController is AnimatorOverrideController over) {
67-
// // Copy all the overrides if we already have an override controller in use
68-
// var overrides = new List<KeyValuePair<AnimationClip, AnimationClip>>(over.overridesCount);
69-
// over.GetOverrides(overrides);
70-
// this.animatorOverride = new AnimatorOverrideController(animator.runtimeAnimatorController);
71-
// this.animator.runtimeAnimatorController = this.animatorOverride;
72-
// this.animatorOverride.ApplyOverrides(overrides);
73-
// } else {
74-
// this.animatorOverride = new AnimatorOverrideController(animator.runtimeAnimatorController);
75-
// this.animator.runtimeAnimatorController = this.animatorOverride;
76-
// }
77-
// }
65+
if (!this.animatorOverride) {
66+
if (this.animator.runtimeAnimatorController is AnimatorOverrideController over) {
67+
// Copy all the overrides if we already have an override controller in use
68+
var overrides = new List<KeyValuePair<AnimationClip, AnimationClip>>(over.overridesCount);
69+
over.GetOverrides(overrides);
70+
this.animatorOverride = new AnimatorOverrideController(animator.runtimeAnimatorController);
71+
this.animator.runtimeAnimatorController = this.animatorOverride;
72+
this.animatorOverride.ApplyOverrides(overrides);
73+
} else {
74+
this.animatorOverride = new AnimatorOverrideController(animator.runtimeAnimatorController);
75+
this.animator.runtimeAnimatorController = this.animatorOverride;
76+
}
77+
}
7878
}
7979

8080
private void Start() {
@@ -257,6 +257,7 @@ public void PlayAnimation(AnimationClip clip, CharacterAnimationLayer layer, flo
257257
}
258258

259259
animatorOverride = animator.runtimeAnimatorController as AnimatorOverrideController;
260+
// Debug.Log($"Inst id: {animator.runtimeAnimatorController.GetInstanceID()}");
260261

261262
var stateName = "Override" + (int)layer;
262263

Runtime/Code/Player/Character/Animation/ClipReplacer/AnimatorClipReplacer.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ namespace Code.Player.Character
88
{
99
[ExecuteInEditMode]
1010
[LuauAPI]
11-
public class AnimatorClipReplacer : MonoBehaviour
12-
{
11+
public class AnimatorClipReplacer : MonoBehaviour {
12+
private static Dictionary<Animator, AnimatorOverrideController> _overrideControllers = new ();
13+
1314
/// <summary>
1415
/// Holds a reference to the animator-related object, which can be an <see cref="Animator"/>,
1516
/// <see cref="GameObject"/>, or <see cref="AnimatorOverrideController"/>.
@@ -73,7 +74,10 @@ public void ReplaceClips(Object controller)
7374
}
7475
}
7576

76-
77+
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
78+
public static void ResetOnLoad() {
79+
_overrideControllers.Clear();
80+
}
7781

7882
/// <summary>
7983
/// Overload that directly applies clip replacements to the given <see cref="AnimatorOverrideController"/>.
@@ -141,6 +145,7 @@ private void ReplaceClipsInternal(AnimatorOverrideController overrideController)
141145
var originalClip = overrides[i].Key;
142146
if (animationMap.TryGetValue(originalClip.name, out var newClip))
143147
{
148+
Debug.Log("Replacing " + originalClip.name + " in favor of " + newClip.name);
144149
if (newClip != null)
145150
{
146151
newOverrides[i] = new KeyValuePair<AnimationClip, AnimationClip>(originalClip, newClip);
@@ -273,8 +278,12 @@ private bool TryGetOverrideController(Object controller, out AnimatorOverrideCon
273278
{
274279
overrideController = null;
275280

276-
if (controller is Animator animator)
277-
{
281+
if (controller is Animator animator) {
282+
if (_overrideControllers.TryGetValue(animator, out var oc)) {
283+
overrideController = oc;
284+
return true;
285+
}
286+
278287
overrideController = animator.runtimeAnimatorController as AnimatorOverrideController;
279288

280289
if (Application.isPlaying)
@@ -283,9 +292,10 @@ private bool TryGetOverrideController(Object controller, out AnimatorOverrideCon
283292
AnimatorOverrideController instanaceAnimator = new(animator.runtimeAnimatorController);
284293
var overrides = new List<KeyValuePair<AnimationClip, AnimationClip>>(overrideController.overridesCount);
285294
overrideController.GetOverrides(overrides);
286-
295+
287296
instanaceAnimator.ApplyOverrides(overrides);
288297
animator.runtimeAnimatorController = instanaceAnimator;
298+
_overrideControllers[animator] = instanaceAnimator;
289299

290300
overrideController = animator.runtimeAnimatorController as AnimatorOverrideController;
291301
}

0 commit comments

Comments
 (0)