天天看點

Unity Live2D Mask功能失效的解決

原因

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

Unity Live2D Mask功能失效的解決

猜測應該是遮罩功能失效,查找到官方手冊 https://docs.live2d.com/cubism-sdk-manual/unitysdk-nativesdk-compare/?locale=ja

Unity Live2D Mask功能失效的解決

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();
            }
        }