SRPを使う際の注意
最終更新: 2022年1月31日
概要
Unityは2018.1から、レンダリングの設定や実行をC#スクリプトで制御できる仕組みである「Scriptable Render Pipeline(SRP)」が追加されました。
SRP自体の詳細につきましてはUnity公式のドキュメントをご覧ください。
このレンダーパイプラインを使用する場合、Unityの一部のイベント関数が呼び出されません。
それにより、Cubism SDK for Unityが正常に動作しないことがあります。
この事象へのCubism SDKでの対応を検討中です。
[2020/01/31 追記]
Cubism 4 SDK for Unity R1以降でSRPに対応いたしました。
Cubism 4 SDK for Unity beta2以前までをお使いの場合、以下の修正方法を行ってください。
以下ではその詳細と修正方法について説明します。
原因
Cubism SDK for Unityでは、各Cubismのコンポーネントの更新はLateUpdate()で行い、ここで設定した値をCubismModel.OnRenderObject()でメッシュの更新に使用します。
OnRenderObject()は、Unityの従来のレンダーパイプラインでは、Scene中に配置されたCameraコンポーネントがレンダリングを終えたタイミングで呼び出される関数です。
しかし、UnityのSRPを使用する場合、Cameraが発行するイベント関数は呼び出されません。
そのため、Cubism SDK for Unityそのまま使用した場合は更新されたパラメータなどの値がメッシュに反映されないため、画面上のモデルをアニメーションさせることができません。
対応方法
CubismModel.OnRenderObject()の処理を別のタイミングで行うことで対応可能です。
LateUpdate()から呼び出すようにすることでも対応できます。
ただし、Cubismの各コンポーネントの処理がCubismModelよりも後に呼び出された場合、そのコンポーネントで操作された値は反映されないため、明示的にCubismModelの実行順が最後になるよう設定する必要があります。
Unityの機能で実行順を設定する、CubismUpdateControllerを利用する等の方法でCubismModelの実行順を制御してください。
また、UnityのPlayerLoopクラスを用いることでも対応可能です。
PlayerLoopはUnityによるイベント関数の呼び出しを操作することが可能で、既存のイベント関数を呼び出されなくしたり、ライフサイクルの任意のタイミングにユーザが定義した関数の呼び出しを挿入することが可能です。
PlayerLoopクラスについてはUnity公式のドキュメントをご覧ください。