前提・実現したいこと
Unityで3Dアクションを作っています。
AnimatorOverrideControllerを使いAnimationClipを動的に差し替えつつ、animator.CrossFadeを使って差し替えたアニメーションに遷移させたいです。
アニメーション遷移中にanimator.CrossFadeでの遷移が始まると地面に埋まった状態からアニメーションが始まってしまいます。
これの解決方法を教えていただきたいです。
遷移中でない時にanimator.CrossFadeが実行されてもアニメーションは正常に再生されます。
VRMモデルのオブジェクトの親に下記のAnimationControllスクリプトとAnimatorをアタッチしています。
AnimatorControllerの中身は画像の通りです。
何卒よろしくお願いいたします。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[CreateAssetMenu(menuName = "Test/Create AnimationStatus", fileName = "AnimationStatus")] 6 7public class AnimationStatus : ScriptableObject 8{ 9 public AnimationClip animationClip; 10 public float normalizedTransitionDuration; 11 public float normalizedTimeOffset; 12 public float exitTime; 13}
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Threading.Tasks; 5 6public class AnimationControll : MonoBehaviour 7{ 8 9 [SerializeField] Animator animator; 10 [SerializeField] List<AnimationStatus> animations; 11 private bool isMotionlock; 12 string overrideClipName = ""; 13 private AnimatorOverrideController overrideController; 14 15 16 void Start() 17 { 18 animator = GetComponent<Animator>(); 19 overrideController = new AnimatorOverrideController(); 20 overrideController.runtimeAnimatorController = animator.runtimeAnimatorController; 21 animator.runtimeAnimatorController = overrideController; 22 } 23 24 // Update is called once per frame 25 void LateUpdate() 26 { 27 if (isMotionlock) return; 28 overrideClipName = (animator.GetCurrentAnimatorStateInfo(0).IsName("Attack1")) ? "Attack2" : "Attack1"; 29 30 31 //アニメーションステート Attack1or2 のクリップを変更する 32 if (Input.GetMouseButtonDown(0)) 33 { 34 overrideController[overrideClipName] = animations[0].animationClip; 35 animator.CrossFade(overrideClipName, animations[0].normalizedTransitionDuration); 36 var exitTimeToSecond = animations[0].exitTime * animations[0].animationClip.length; 37 CantCancel(exitTimeToSecond); 38 } 39 if (Input.GetMouseButtonDown(1)) 40 { 41 overrideController[overrideClipName] = animations[1].animationClip; 42 animator.CrossFade(overrideClipName, animations[1].normalizedTransitionDuration); 43 var exitTimeToSecond = animations[1].exitTime * animations[1].animationClip.length; 44 CantCancel(exitTimeToSecond); 45 } 46 } 47 48 async void CantCancel(float exitTime) 49 { 50 int waitTime = (int)(exitTime * 1000); 51 isMotionlock = true; 52 await Task.Delay(waitTime); 53 isMotionlock = false; 54 } 55}
試したこと
Interruption Sourceの変更
補足情報(FW/ツールのバージョンなど)
Unity 2021.1.1f1
###追記(2021/10/13/11:48)
https://forum.unity.com/threads/help-with-issue-with-crossfade-and-animatoroverridecontroller.690601/
上記URLに、未解決ですが動画付きで同様のものがありました。
これと同じ挙動をしております。
あなたの回答
tips
プレビュー