Unityでアニメ再生時のNullエラーについて

【Cubism SDKのバージョン】Cubism 4 SDK for Unity R5
【OS名・バージョン】Windows10
【開発使用ツール】Unity 2020.3.23ff
【不具合の状況】
Unityエディタでアニメを再生すると、以下のエラーが発生します。
NullReferenceException: Object reference not set to an instance of an object Live2D.Cubism.Framework.MotionFade.CubismFadeStateObserver.OnStateEnter (UnityEngine.Animator animator, UnityEngine.AnimatorStateInfo stateInfo, System.Int32 layerIndex, UnityEngine.Animations.AnimatorControllerPlayable controller) (at Assets/Live2D/Cubism/Framework/MotionFade/CubismFadeStateObserver.cs:223)

該当行の「playingMotion.Motion」の「Motion」がnullになっているようです。
しかし、アニメ自体は問題なく再生され、表示しているアニメの切り替えも問題ありません。

Sdkのソースコードを弄ったわけでもないため、エラーの原因が全く思い当たらないのですが、このエラーの原因は何でしょうか。

@筋子様

弊社製品をご利用いただきまして誠にありがとうございます。
Cubism SDK 開発チームです。

CubismFadeControllerのCubism Fade Motion Listに.fadeMotionList.assetはセットされているか、また、セットしている.fadeMotionList.assetの各要素は空ではないかをご確認いただけますでしょうか?

よろしくお願いいたします。

ありがとうございます。
確認したところ、fadeMotionList.assetはセットされています。
ただ、fadeMotionList.assetの説明などが無いため、中身が正しいのか、それをセットする必要があるのかの判別は付いていません。
(こんなのは説明とは認めません:https://docs.live2d.com/cubism-sdk-manual/motionfade/)

また、投稿時にはアニメは再生されると書きましたが、先ほど確認したところアニメ自体再生されなくなっています。

改めてfadeMotionList.assetについて確認したところ、これはモデルごとに、インポートしたフォルダの上の階層に出力されるのでしょうか?
そんなこと何処にも書いてませんが…
https://docs.live2d.com/cubism-sdk-tutorials/getting-started/

仮に、同じ階層にAモデル、Bモデルの順番でインポートした場合、先にインポートしたAモデルのfadeMotionList.assetは、後からインポートしたBモデルのfadeMotionList.assetで上書きされてしまう。
その結果、Aモデルは動作しなくなるという事でしょうか。

@筋子

マニュアルの不備でご迷惑をおかけしてしまい申し訳ございません。
まずご指摘の通りマニュアルの不備がございましたので修正箇所を精査し、対応させていただきます。

次にご指摘いただいた.fadeMotionList.assetの詳細説明をさせていただきます。

MotionFadeは、Unity上で再生されるAnimationClipの切り替わり部分をCubismのブレンド計算で置き換える機能になります。
.fadeMotionList.assetは、MotionFadeの処理の中で現在再生しているAnimationClipと、ブレンド計算をするための情報が記録された.fade.assetを紐づけるためのデータになります。

.fadeMotionList.assetに登録される情報は、SDKが生成するAnimationClipと対になる.fade.assetの参照と、AnimationClipのAnimationEventに設定されたインスタンスIDです。
これらはマニュアルの通り各要素の順序が一致している必要があります。

Cubism SDK for Unityのインポート処理では、.fadeMotionList.assetはモデルと同階層及び.motion3.jsonのひとつ上の階層に作成します。
その階層に既に.fadeMotionList.assetが存在する場合、それを上書きせず既存のものを読み込んで使用します。

またCubism SDKでは、組み込み用モデルデータは以下のようなフォルダ構造であることを想定しています。

ModelName(フォルダ)
┣motions(フォルダ)
┃┣Scene1.motion3.json
┃┣Scene2.motion3.json
┃┗Scene3.motion3.json
┣expressions(フォルダ)
┃┣exp01.exp3.json
┃┣exp02.exp3.json
┃┗exp03.exp3.json
┣ModelName.[テクスチャサイズ] (フォルダ)
┃┗texture_00.png
┣ModelName.cdi3.json
┣ModelName.moc3
┣ModelName.model3.json
┣ModelName.pose3.json
┗ModelName.userdata3.json

上記の構造を想定しているため、これ以外の組み込みモデルデータのフォルダ構造によっては.fadeMotionList.assetが複数生成される可能性があります。
仮にModelNameフォルダ直下に.motion3.jsonが配置されている場合、ModelNameフォルダのさらに上の階層の名前(例: Assetsフォルダ直下にModelNameフォルダがある場合、“Assets.fadeMotionList.asset”)で作成され、そちらに情報が記録されてしまいます。

なお、この仕様である理由は以下によるものです。

  1. .fadeMotionList.assetに対する処理は複数の導線があり、それらの実行順序はUnityが制御するため、生成は複数箇所で行う必要がある
  2. .fadeMotionList.assetに情報を登録する処理は.motion3.jsonのインポート処理から行っており、.motion3.jsonからは.model3.jsonの参照が取得できない
  3. .motion3.jsonが含まれるフォルダは.model3.jsonと同階層に配置されたフォルダ内に配置されることを想定している
    3.1. .motion3.jsonは.model3.jsonのひとつ下の階層に配置される

仮に、同じ階層にAモデル、Bモデルの順番でインポートした場合、先にインポートしたAモデルのfadeMotionList.assetは、後からインポートしたBモデルのfadeMotionList.assetで上書きされてしまう。
その結果、Aモデルは動作しなくなるという事でしょうか。

こちらに対する回答としましては、上述のfadeMationList.assetの生成仕様につきModelNameフォルダ直下に.motion3.jsonが配置されている場合には、仰せの通り上書きされ、Aモデルが動作しなくなる状況になりうる状態となります。

つきまして大変お手数ではございますが、モデルのフォルダ構造を弊社が想定している構造に配置して再インポートしたら現象が解消されるかを確認して頂けますでしょうか?
フォルダ構造を変更した際には.model3.jsonに記述された各参照も修正してください。
参照を修正するには以下の手順を行います。

  1. フォルダ構造を変更する
  2. Cubism Viewer (for OW)に.model3.jsonを読み込ませる
  3. .motion3.jsonなどの参照を追加する
  4. .model3.jsonを書き出す(既存の.model3.jsonを上書きする)

重ね重ね恐れ入りますが、ご確認のほど何卒よろしくお願いいたします。

フォルダ構造がWindowsなどのPCに出力したものを指しているのか、Unityにインポートした後のことを指しているのか書かれていないため、フォルダ構造を変える以前に、フォルダ構造を確認することもできません。
想定されるフォルダ構造とやらがあるのなら、Live2DからUnity用にデータをエクスポートし、Unityにインポートする手順と、その手順のどこにデータ構造を変更する必要があるのかを提示していただけますか。

横からですみませんが、Live2Dの組み込みデータのエクスポート方法はここに書いてあります。

また、Unityへのインポート手順もチュートリアルに載っています。

書き出された組み込みデータ一式をそのままフォルダごとドラッグアンドドロップすると書いてあるため、その手順通りにやれば上手くいくと思いますが…
データ構造は特にインポート後に変更する必要ないはずです。

フォルダ構造をEditorからエクスポートしたものから変更した場合は問題が発生するので、今一度モデルデータを書き出して、デフォルトから何も変更せずにインポートするといいんじゃないかなと思います。

ありがとうございます。

提示していただいたURLについてはどちらも確認済みで、エクスポート方法はUnity用のエクスポートする記述が無いはずです。
インポート手順の方はUnityの手順が記述されていますね。失礼しました。

特別な手順をすることなく、データ構造を変える必要もない筈、というのはその通りではあるのですが、
実際に問題が起きており、また、正しい手順が記載されていないため、確認させていただいています。

組み込み用データについてはSDKで扱う際は特にUnity用、他SDK用と区別されてはいなかったように思います。
書き出し種別としては、nizimaとSDKの2つがあるのみのようです。

今私もUnityは特別な書き出し手順があったかなと、試しにLive2D公式のサンプルモデルを読み込んで書き出し種別 = SDKでエクスポートしUnityにインポートしましたが、問題なくインポートできました。
強いてマニュアルに書き加えるとしたら、「書き出した組み込み用データはどのSDKでも使用可能」という一文でしょうか。

問題が起きている理由が知りたいところではありますね…

同じエラーで嵌っていました。
私の場合は↓の方法で回避できたので試してください。

1 Projectファイルからキャラ名.fadeMotionListをクリック
2 InspectorからCubismFadeMotionObjectsの▼を押してリストを見る。
3 2のリストの中の~.fadeと同じProjectfファイルのフォルダーに、エラーになっている.motion3ファイルを新しく外部から入れる
4 3で作った.animをAnimatorに入れ変える。(エラーがでている.animは削除する)

アドバイス、ありがとうございます。
こちらの大中ですが3の「エラーになっている.motion3ファイル」が良くわからず、結局既存のモデルをすべて削除。
モデルをインポートすると生成されるfadeMotionListをリネームして上書きされないようにして対応しました。
とりあえずは問題なさそうですが、公式の回答は欲しいですね…

@筋子
お問い合わせいただいているエラーは、.fadeMotionListにインポートしたモーションが登録されないことが原因で発生しています。

登録には、組み込み用モデルデータ一式が前述のフォルダ構造であることが想定されています。

フォルダ構造がWindowsなどのPCに出力したものを指しているのか、Unityにインポートした後のことを指しているのか書かれていないため、フォルダ構造を変える以前に、フォルダ構造を確認することもできません。

フォルダ構造を修正するものは、まだUnityプロジェクトにインポートしていないPCに出力したものでも、すでにUnityプロジェクトにインポートされているものでも構いません。
Unityプロジェクトにインポートしていないものであれば、上記の設定後にUnityプロジェクトにインポートします。
Unityプロジェクトにインポートされているものであれば、上記の設定後にそのモデルデータ一式を再インポートします。

想定されるフォルダ構造とやらがあるのなら、Live2DからUnity用にデータをエクスポートし、Unityにインポートする手順と、その手順のどこにデータ構造を変更する必要があるのかを提示していただけますか。

手順は以下になります。
こちらは設定を行ったモデルデータをUnityプロジェクトにインポートする場合の手順となります。

  1. Cubismエディタから組み込み用モデルデータ一式を書き出す
  2. 組み込み用モデルデータ一式のフォルダ構造を変更する
  3. Cubism Viewer (for OW)に上記フォルダ(組み込み用モデルデータ一式の入ったフォルダ)内の.model3.jsonを読み込ませる
  4. 「motions」フォルダ内に配置した.motion3.jsonなどの参照を追加する
  5. Cubism Viewer (for OW)から.model3.jsonを、上記フォルダ内の.model3.jsonを上書きする形で書き出す
  6. 上記フォルダをUnityプロジェクトにインポートする(すでに同名のモデルデータが存在する場所にはインポートしないでください)

また、データ構造を変更する必要は、インポート処理時に特定のフォルダ階層が前提である処理を行っているためです。
Cubism SDK for Unityでは、組み込み用モーションデータは.model3.jsonと同じ階層、または2つ以上深い階層であることは想定していません。
Unity版に限らず、Cubism SDKで組み込み用モデルデータ一式を使用する場合は前述のフォルダ構造を遵守するようお願い申し上げます。

Unity用のエクスポート

Unity用のエクスポート設定はございません。
Cubism SDKすべてのプラットフォームで共通となります。

以上、よろしくお願いいたします。

@西音

1 Projectファイルからキャラ名.fadeMotionListをクリック
2 InspectorからCubismFadeMotionObjectsの▼を押してリストを見る。
3 2のリストの中の~.fadeと同じProjectfファイルのフォルダーに、エラーになっている.motion3ファイルを新しく外部から入れる
4 3で作った.animをAnimatorに入れ変える。(エラーがでている.animは削除する)

はい、こちらの手順でも問題はございません。
しかし、基本的にはデータを適正な状態にしてインポートまたは再インポートしていただくのがよろしいかと思われます。

どのファイルをどのように変更するのでしょうか?

Cubism Viewer (for OW)を使用しなければ、Unityで使用するデータが作成できないということでしょうか?

@筋子

こちらの手順は変更ではありません。
もし既に書き出し済みのデータがございましたらこの手順は飛ばしてください。

はい、Unityに限らず、いずれのCubism SDKで使用する場合でも、Cubism Viewer (for OW)で組み込み用モデルデータの設定を行います。

よろしくお願いいたします。

申し訳ありません。引用個所を間違えていました。

こちらについて、どのようにファイルを変更するのでしょうか?

こちらに次のような記述があります。
「Cubism Editorから書き出した組み込み用モデル一式を、フォルダごとProjectビューにドラッグアンドドロップします。」
また、このページにViewの説明が一切ない(UnityにデータをインポートするまでにViewが介在しない)ことから、おっしゃっていることと矛盾しているのですが、正しいのはどちらでしょうか。

@筋子

OSのファイルブラウザから行います。
Windowsであればエクスプローラー、macであればFinderがございます。

Cubism SDK チュートリアルでは、Cubism SDKの使用方法についての説明のみを記載しております。
組み込み用モデルデータ一式を用意するまでの説明はCubismエディタマニュアル、Cubismエディタチュートリアルに記載しております。
Cubismエディタを用いたデータの制作フローにつきましては「Cubism Viewer (for OW)について」内の「 基本的な組込みデータの作成方法」の項目をご覧ください。

よろしくお願いいたします。

分かりにくくて申し訳ありません
「どうやって」ではなく、「どのように」を聞いています。
Cubismエディタからどのようなファイルとフォルダが出力され、それらのファイルとフォルダをどのように変更するのか、という質問です。

つまり、SDKのページに書かれている「Cubism Editorから書き出した組み込み用モデル一式を、フォルダごとProjectビューにドラッグアンドドロップします。」は誤りであり、
正しくは「Cubism Editorから書き出した組み込み用モデル一式を、Cubism Viewer (for OW)で読み込んだ後に編集し、そこから出力したものをフォルダごとProjectビューにドラッグアンドドロップします。」
ということでしょうか?

横からですが、私も以前は出なかった上記のエラーがでるようになりました。
>NullReferenceException: Object reference not set to an instance of an object
上で書いてあるようにフォルダー構成を直したのですが、直らないので
動いているので、もう良いかと思いつつあるのですが。

このエラーを無視して問題があるのか無いのか聞きたいです。
また、以前は出てなかったものが何故出るようになったのかも聞けると助かります。

fade listのエラーの件解決しました。
何か画像つきで解説があれば助かったかも……