原因
在 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);
}
另外,在 CubismMaskTexture 里面,不需要当不显示 Live2D 角色的时候,就把贴图给释放了,在 RemoveSource 函数里面,注释掉 ReleaseRenderTexture();
/// <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();
}
}
以及CubismMaskTexture GlobalMaskTexture
变量为全局存在,切场景的时候,不进行释放。