SDK for Unityにおけるマスクの使用上限について
最終更新: 2023年5月25日
概要
Cubism SDK for Unityのデフォルトでは、表示されるすべてのモデルがひとつのマスク用テクスチャを共有します。
そのため仮にそれぞれのモデルがマスクの使用上限数を超えていなくても、モデルを複数体画面に配置するとマスク用テクスチャの使用上限数に到達してしまい、クリッピングの表示が崩れる可能性があります。
これを回避する方法は3つあり、それぞれ特徴が異なります。
- モデルごとにマスク用テクスチャを設定する
- マスク用テクスチャに割り当ての登録/削除を行うタイミングを変更する
- マスク用テクスチャ内部のテクスチャ数を増やす
Unityにおけるマスク用テクスチャの特性については「各Cubism SDKの比較」をご覧ください。
モデルごとにマスク用テクスチャを設定する
この方法は、マスク用テクスチャをモデルごとに用意することで、他に配置されているモデルに影響を受けずにクリッピングを表示することができます。
ただし、マスク用テクスチャを複数用意することになるため、その分パフォーマンスに影響する可能性がありますのでご注意ください。
モデルごとにマスク用テクスチャを設定するには以下の手順を行います。
- 専用のマスク用テクスチャを作成する
- 作成したマスク用テクスチャをモデルのプレハブにアタッチされたCubismMaskControllerの
Mask Texture
に設定する
専用のマスク用テクスチャを作成する
モデル専用のマスク用テクスチャのインスタンスを作成します。
作成の方法は複数あります。
以下のいずれかの方法で作成してください。
- Cubism SDK for Unityに付属しているGlobalMaskTextureを複製する
- CubismMaskTextureクラスのインスタンスを生成する
- モデルをインポート時に生成されたものを使用する
Cubism SDK for Unityに付属しているGlobalMaskTextureを複製する
モデルが共有しているマスク用テクスチャは、SDKがインポートされたプロジェクトの以下の場所にあります。
/Assets/Live2D/Cubism/Rendering/Resources/Live2D/Cubism/GlobalMaskTexture
こちらを選択状態にしてCtrl + Dを押下するなどで複製してください。
CubismMaskTextureクラスのインスタンスを生成する
Cubism SDK for Unity付属のエディタ拡張には、CubismMaskTextureクラスのインスタンスを作成するものがあります。
生成するには、UnityのProjectウィンドウを右クリック、または+ボタンから Create/Live2D Cubism/Mask Texture
をクリックします。
モデルをインポート時に生成されたものを使用する
Cubism 4 SDK for Unity R7以降では、モデルをインポートすると.model3.jsonと同じ場所に専用のマスク用テクスチャが生成されます。
作成したマスク用テクスチャをモデルのプレハブにアタッチされたCubismMaskControllerのMask Textureに設定する
モデルのプレハブを選択状態にし、InspectorウィンドウのMask Textureにマスク用テクスチャをドラッグアンドドロップします。
マスク用テクスチャに参照の登録/削除を行うタイミングを変更する
この方法は、画面に表示されているモデルが少ない、総マスク数が使用上限に達していないのに表示が崩れる場合に行います。
Cubism SDK for Unityでは、シーンにモデルのプレハブが生成されたときにマスク用テクスチャへ自身の参照を登録し、マスク用テクスチャは登録されているモデルから取得した情報でマスクを生成します。
このマスク用テクスチャに登録された参照が削除されるタイミングは、そのモデルが削除されたときになります。
そのため、モデルを非表示状態にしただけではマスク用テクスチャには参照が残ります。
これにより、画面に表示されているモデルは少なくても、非表示状態のモデルが複数存在するとマスクの使用上限を超えてしまい、表示が崩れることがあります。
この方法では、モデルが参照をマスク用テクスチャに登録/削除するタイミングを表示時/非表示時に変更します。
また、テクスチャの数を増やす他の方法と比較すると一番負荷がかかりません。
ただし、表示されているモデルの総マスク数が使用上限に達している場合には対応できません。
その場合は他の方法をお試しください。
マスク用テクスチャへ参照を登録/削除するにはCubismMaskControllerのイベント関数を書き換えます。
- 参照を登録する処理のイベント関数を書き換える
- 参照を削除する処理のイベント関数を書き換える
参照を登録する処理のイベント関数を書き換える
CubismMaskController
クラスの Start()
を OnEnable()
に書き換えます。
private void OnEnable() { // Fail silently. if (MaskTexture == null) { return; } MaskTexture.AddSource(this); // Get cubism update controller. HasUpdateController = (GetComponent<CubismUpdateController>() != null); }
参照を削除する処理のイベント関数を書き換える
CubismMaskController
クラスの OnDestroy()
を OnDisable()
に書き換えます。
private void OnDisable() { if (MaskTexture == null) { return; } MaskTexture.RemoveSource(this); }
マスク用テクスチャ内部のテクスチャ数を増やす
Cubism SDK for Unity R7以降では、マスク用テクスチャが内部で保持するテクスチャの数を任意で増やすことができます。
スペックの許す限り無制限に増やすことができるため、1つのモデルが使用可能なマスク数の上限を超えている場合も正常にクリッピングを表示することが可能です。
また、この方法は他の上記2つの方法と併用することも可能です。
マスク用テクスチャが保持するテクスチャを増やすには、マスク用テクスチャを選択し、InspectorからRenderTextureCountの値を任意の数に設定します。
この値に0が設定されている場合は、従来どおり1つのマスク用テクスチャが内部で保持されます。