前提・実現したいこと
アニメーターコントローラーで作成したモーションに,スクリプトによるモーションが加算合成されたモーションを実現したいのですが,方法が不明です.
キャラクターに下図の様なIdle状態のモーションをさせるアニメーターコントローラーを指定したアニメーターがアタッチされています.
さらに,例えばこの様な腕を回転させ続けるスクリプトを作り,これもアタッチしました.
C#
1using UnityEngine; 2 3public class Bones : MonoBehaviour 4{ 5 [SerializeField] Animator _animator; 6 // Update is called once per frame 7 void Update() 8 { var arm=_animator.GetBoneTransform(HumanBodyBones.LeftUpperArm); 9 arm.Rotate(new Vector3(3.14f,0,0)); 10 } 11}
発生している問題・エラーメッセージ
- アニメーターとスクリプトを二つともアタッチした状態ではアニメーターしか有効となりません.
- アニメーターのコントローラーを「なし(Runtime Animator Controller)」とすると,スクリプトが有効となります.
二つが合成されたものを実現する為にはどの様な方法があるのでしょうか?宜しくお願い致します.
追記 LateUpdate()を試した際の挙動
ところで,以前UnityのSetIKPositionWeight()…等の関数によるIK機能をスクリプトにて試した時には,アニメーターコントローラーによる既存のアニメーションとミックスされた結果となりました.この点について調べて見ると,
処理順番は、Update()関数⇒Animation再生⇒BoneLocalRotation()関数⇒IK処理⇒LateUpdate()関数となっており…
-
との事でしたから,順序が先なので上書きされてしまったのだろうと思い,試しに先ほどの腕回転スクリプトをUpdate()ではなくLateUpdate()内に記述してみましたが,
やはり反映されませんでした.継続的に指定単位量ずつ回り続ける最初の1フレーム分のみ回った状態でスタートして,それ以降変化なしでした. -
しかし,LookAt関数で向きを変更しようとする時,実行中にターゲットオブジェクトを移動させると正しく継続的に反映されました.
以下のサイトではアニメーション中のLookAtを試していますが,これはUpdate()中に書くと上手く行かないのでLateUpdate()に書こう,と述べられていました.
Unity でアニメーションさせながらスクリプトでモデルを動かす
C#
1using UnityEngine; 2 3public class Bones : MonoBehaviour 4{ 5 [SerializeField] Animator _animator; 6 [SerializeField] GameObject _target; 7 Transform arm; 8 9 void LateUpdate() 10 { 11 arm=_animator.GetBoneTransform(HumanBodyBones.LeftUpperArm); 12 arm.Rotate(new Vector3(90,0,0)); //90度回った状態でスタートしてそれ以降変化なし(最初の1フレーム分しか機能していない?) 13 arm.LookAt(_target.transform);//こちらは実行中に_targetオブジェクトを移動させると正しく機能する 14 } 15} 16
補足情報(FW/ツールのバージョンなど)
Unity 2020.3.0f1(LTS)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。