原因
在 Unity 中使用 Live2D 來進行動态角色的顯示,遇到過當遊戲進行一段時間後,角色的眼球随機消失不顯示。檢視眼球節點,可以看到其使用的是Mask遮罩

猜測應該是遮罩功能失效,查找到官方手冊 https://docs.live2d.com/cubism-sdk-manual/unitysdk-nativesdk-compare/?locale=ja
Mask是進行共用的,當達到上限時,那麼後面的遮罩功能就會失效。
解決
界面上同時顯示的 Live2D 角色不會那麼多,檢視代碼是 CubismMaskController 僅在 OnDestroy 的時候才從 Mask 裡進行移除,導緻了不夠用。那麼這裡将 CubismMaskController 檔案的代碼函數 Start 和 OnDestroy 改成 OnEnable 和 OnDisable,僅在激活的時候,放到 Mask 裡面。
/// <summary>
/// Initializes instance.
/// </summary>
private void OnEnable()
{
// Fail silently.
if (MaskTexture == null)
{
return;
}
MaskTexture.AddSource(this);
// Get cubism update controller.
_hasUpdateController = (GetComponent<CubismUpdateController>() != null);
}
/// <summary>
/// Finalizes instance.
/// </summary>
private void OnDisable()
{
if (MaskTexture == null)
{
return;
}
MaskTexture.RemoveSource(this);
}
/// <summary>
/// Remove source of masks
/// </summary>
public void RemoveSource(ICubismMaskTextureCommandSource source)
{
// Return early if empty.
if (!ContainsSources)
{
return;
}
var itemIndex = Sources.FindIndex(i => i.Source == source);
// Return if source is invalid.
if (itemIndex == -1)
{
return;
}
// Return tiles and deregister source.
TilePool.ReturnTiles(Sources[itemIndex].Tiles);
Sources.RemoveAt(itemIndex);
// releaseRT
if (Sources.Count == 0)
{
//ReleaseRenderTexture();
}
}