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