個人アプリ開発で月収5万円目指す

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】Humanoid型モデルで使用するAnimationClipのキーフレームをスクリプトから変更する方法 SetCurve モバイル不可

はじめに

Humanoid型モデルのアニメーションをスクリプトから行いたかったのでメモ

私の調べた結果ですと、
Humanoid型モデルのアニメーションを変更できるのはエディター内のみで、
モバイル上で変更する方法は無いようです。

前提知識

AnimationClipは、特定のプロパティ(Transformなど)の
数値を登録することで、アニメーションさせています。

Hunanoide型のキャラクターをアニメーションさせる場合には、
キャラクターの各ボーンの角度ではなく、マッスル値で設定するのが一般的なようです。
(私は調べるまでボーンの角度を調整していると思っていました...)

↓これは、あるポーズのAnimationClipの設定画面です。
 Animatorの中のマッスル値が登録されています。
f:id:marumaro7:20220310054457p:plain:w200

マッスル値に関してはこちらの記事に書いています。

marumaro7.hatenablog.com

キーフレームをスクリプトから変更

方法は簡単で次の2ステップです。
1.AnimationCurveで変化内容を設定
2.AnimationClip.SetCurveで変化内容を適用

AnimationClipへの「指定したプロパティのキーフレーム」は、
AnimationClip.SetCurveで変更することができます。

docs.unity3d.com

このSetCurveで指定したプロパティがAnimationClipに
存在するかどうかで挙動は少し変わります。
・同じプロパティ無:AnimationClip内に新規作成
・同じプロパティ有:内容の更新

サンプル

3種類のマッスル値をAnimationClipに追加するスクリプトです。

public AnimationClip animationClip;//変更するアニメーションクリップを割り付け

public void Test()
{
     //animationClip = new AnimationClip();//アニメーションクリップを作成 スクリプト内でAnimationClipを新規作成する場合
     //値の変化を設定
        //Linear⇒直線的な変化
        //引数(開始時間, 開始値, 終了時間, 終了値)
        AnimationCurve curve1 = AnimationCurve.Linear(0, 0.5f, 0, 0);
        AnimationCurve curve2 = AnimationCurve.Linear(0, 0.5f, 0, 0);
        AnimationCurve curve3 = AnimationCurve.Linear(0, 0.5f, 0, 0);

        //アニメーションカーブの中にキーフレームを追加(必要であれば)
        //引数(時間, 値)
        //時間:キーを追加する時間(カーブグラフにおける水平軸)
        //値 :キーの値(カーブグラフにおける垂直軸)
        //Keyframe key = new Keyframe(10f, 10f);


        //アニメーションカーブ1にキーフレームを追加(必要であれば)
        //curve1.AddKey(key);

        //アニメーションクリップにアニメーションカーブをセット
        //引数(パスの指定, タイプ, 操作項目名, アニメーションカーブ)
        //SetCurveはユニティ上ではできるがモバイル実機ではできない 公式に記述あり https://docs.unity3d.com/ScriptReference/AnimationClip.SetCurve.html
        animationClip.SetCurve("", typeof(Animator), HumanTrait.MuscleName[1], curve1);
        animationClip.SetCurve("", typeof(Animator), HumanTrait.MuscleName[2], curve2);
        animationClip.SetCurve("", typeof(Animator), HumanTrait.MuscleName[4], curve3);
}

空のAnimationClipを使ってこちらのコードを実行すると、
アニメーションクリップ内に指定したプロパティのキーフレームを打つことができます。
注意:AnimationClipの内容は保存されます。 f:id:marumaro7:20220311054156p:plain

1.AnimationCurveで変化内容を設定

AnimationCurve型の変数を宣言し内容を設定します。
AnimationCurve.カーブの種類(開始時間, 開始値, 終了時間, 終了値); で設定します。  

AnimationCurve curve1 = AnimationCurve.Linear(0, 0.5f, 0, 0);

2.AnimationClip.SetCurveで変化内容を適用

AnimationClipにアニメーションカーブをセットします。
AnimationClip.SetCurve(パスの指定, プロパティの型, 操作項目名, アニメーションカーブ)で設定します。

animationClip.SetCurve("", typeof(Animator), HumanTrait.MuscleName[1], curve1);

引数1:パスの指定
""で自動的に現在のパスが割り付けられるので""で問題ありません。

引数2:プロパティの型
今回設定するマッスル値は、Animatorの中の値なのでAnimatorと書きます。

引数3:操作項目名
"引数2"で設定したプロパティの型の中のどの項目の数値を変更・追加するかをを設定します。
今回、型はAnimatorの中のマッスル値を設定したいので、マッスル値の名前を設定します。
マッスル値の名前は、
HumanTrait.MuscleName[マッスル値の配列番号]
で取得することができます。

引数4:アニメーションカーブ
「1.AnimationCurveで変化内容を設定」で設定したAnimationCurveの情報を入れます。

補足:アニメーションカーブにキーフレームを追加

私は使用していないので紹介のみですが、
サンプルでコメントアウトしている下記のコードで
アニメーションカーブの中にキーフレームを追加できるようです。

      //アニメーションカーブの中にキーフレームを追加(必要であれば)
        //引数(時間, 値)
        //時間:キーを追加する時間(カーブグラフにおける水平軸)
        //値 :キーの値(カーブグラフにおける垂直軸)
        //Keyframe key = new Keyframe(10f, 10f);


        //アニメーションカーブ1にキーフレームを追加(必要であれば)
        //curve1.AddKey(key);

モバイル不可

今回使用したAnimationClip.SetCurveをモバイルで使用するには、
このコードを追加する必要があります。([詳細は公式参照]
(https://docs.unity3d.com/ScriptReference/AnimationClip.SetCurve.html))

animationClip.legacy = true;

しかし、この設定は、
AnimationClipを 廃止予定であるAnimationコンポーネントで使用するためのものです。
Animationコンポーネントではマッスル値は対応していないようで追加ができませんでした。

逆にAnimationコンポーネントで制御できるプロパティであれば、
モバイルからでも設定変更ができます。

余談

全然関係ないですが、
SpriteRendererをアニメーションさせる場合の
PropertyNameは”m_Size.x”のように m _が必要なようです。

プロパティ名は予測変換ではでなかったので、
一旦手動でアニメーションを作ってプロパティ名を確認する作業が必要です。

参考
teratail.com

おわりに

モバイルで動作させたかったのですが、現状無理なようでとても残念でした。
できないことがわかったということで良しとしています。

もし、AnimatorのAnimationClipのプロパティをモバイルから変更する方法を
ご存知の方がいらっしゃいましたら情報お待ちしています。


また、Animationコンポーネントのアニメーションならモバイルで設定できるわけですが、
それなら神アセットのDoTween使えばいいやと思っています。

エディター上でアニメーション作る際、今回の知見が使えそうですが、
自分で環境整えるより、Very Animationを使った方が遥かに早そうです。

assetstore.unity.com

他の記事

marumaro7.hatenablog.com

参考

www.natsuneko.blog

teratail.com

buravo46.hatenablog.com

learning-collection.com

mebiustos.hatenablog.com