may231750
@may231750 (initialK initialY)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

UnityでAnimationClipファイル(.anim)を動的に読み込みたい

Q&A

Closed

UnityでAnimationClipファイル(.anim)を動的に読み込みたい

UnityでVRMファイルを読みこんで表示するアプリケーションを作成しています。
VRMファイルを読みこんで初期ポーズで表示した後で、ローカルに保存されているAnimationClipファイル(.animという拡張子がついているテキストファイル)を読みこんで、AnimationClipの最初のポーズを取らせる機能を実装しようとしています。

環境はUnity 2020.3.39f1で、Windows11 Homeです。

該当するソースコード、発生している問題・エラー

UnityのAssetフォルダにUnityAnim_Temporary1.animというファイルを置いておくものとします。

AnimationClip clip = (AnimationClip)AnimationClip.Instantiate(Resources.Load("AnimationClip_Temporary1.anim"));

を実行すると

ArgumentExeption: The Object you want to instantiate is null.

が出て止まってしまいます。

UnityEditorでは.animファイルをAssetsフォルダに放り込むだけで自動でAnimationClipと認識してくれますが、それをスクリプトで実装するには
テキストファイルを読みこんでAnimationClipクラスのObjectとして認識させることが必要と考えます。その実装方法を御教示頂けますと幸いです。

image.png

自分で試したこと

型変換の問題かと思いtypeof()やasを使おうとしましたが、AnimationClipというのは型ではなくクラスに過ぎないので失敗しました。

※できる限りググってきたのですが、「Animationクラス」・「AnimationClipPair[]」・「AddClip()」などすでにUnityでは使われていないと思われる古い知識の記事が多く出てきて混乱しています。。

0

6Answer

ありがとうございます!
エラーは出なくなりました。
が、Loadしたclipの内容はNullになってしまうようで、T-Poseからポーズを変えることができないままです。

0Like

ありがとうございます!Animatorを設定する(AnimatorControllerをアタッチする)ことができるようになりました。
が、本当にやりたいことは都度任意ファイル指定して読みこんだ.animファイルの0.0fのポーズをとることなので、
animator.CrossFadeInFixedTime("AnimationClip_Temporary1", 0.0f);
の"AnimationClip_Temporary1"を動的に変更する方法がわからず行き詰っています。

とりあえず"AnimationClip_Temporary1"を.animファイルのファイルパスに置き換える方法だとポーズが差し変わらず、(なんとなくの予想通り)失敗でした。

その後二時間ほど悩んで絞り出したのが下記スクリプト案ですが、限界です。。

Animator animator = vrm.GetComponent<Animator>();

string anim = File.ReadAllText(filepath);

AnimationClip animationClip = new AnimationClip();
AssetDatabase.CreateAsset(animationClip, "Assets/AnimationClip_Temporary1.anim");
// 読みこんだ.animファイルの内容(String anim)をanimationClipに反映する方法がわからない

animator.runtimeAnimatorController = Resources.Load("AnimatorController1");
animator.CrossFadeInFixedTime("AnimationClip_Temporary1", 0.0f);

0Like

ありがとうございます!

やりたかったことの真意は
「他のアプリ(・Unityエディタ)で制作された.animの最初のポーズデータを読みこんで表示したい」
なので、元からビルドする際に.animファイルを組み込んでおく前提だと残念ながら目的達成はできないです。

>.animファイルをランタイムでアプリ外部から読み込むというのはできない

はっきりと仰って頂きありがとうございます。吹っ切れました。

誠にありがとうございました。感謝致します。
この質問はクローズさせて頂こうと思います。

0Like

やりたかったことの真意は
「他のアプリ(・Unityエディタ)で制作された.animの最初のポーズデータを読みこんで表示したい」

生の.animでなく、Addressablesを使って、ビルドしたアセットを外部から読み込む方法はいかがでしょうか?

0Like

既にcloseとなってますがAnimationClipのランタイム動作を諦めて別のアプローチでやるという話をします。

以上の記事は有用な情報が多々あるかと思います
要約するとTriLib2という有料assetを使ってRuntimeにGLTFモデルにアニメーションを組み込むという話が主題です。

https://nw.tsuda.ac.jp/lec/unity5/Humanoid/
他にもヒューマノイドボーンに直接作用させるというアプローチもありますが
自分でデーター型定義が必要かつ、AnimationClipのデーターを取り出して変換する手間がかかるので若干ハードルが高いでしょう(アニメーションステートとかも自分で管理する必要があるのでまあまあめんどい)

0Like

Your answer might help someone💌