SkinnedMeshRenderer _Erase(GameObject go)
        {
            if (go == null)
            {
                Debug.LogWarning("select root object in hierarchy");
                return(null);
            }
            if (m_skinnedMesh == null)
            {
                Debug.LogWarning("no skinnedmesh");
                return(null);
            }

            var bones      = m_skinnedMesh.bones;
            var eraseBones = m_eraseBones
                             .Where(x => x.Erase)
                             .Select(x => bones.IndexOf(x.Bone))
                             .ToArray();

            var meshNode = new GameObject("BoneMeshEraser");

            meshNode.transform.SetParent(go.transform, false);

            var erased = meshNode.AddComponent <SkinnedMeshRenderer>();

            erased.sharedMesh      = BoneMeshEraser.CreateErasedMesh(m_skinnedMesh.sharedMesh, eraseBones);
            erased.sharedMaterials = m_skinnedMesh.sharedMaterials;
            erased.bones           = m_skinnedMesh.bones;

            return(erased);
        }
示例#2
0
        /// <summary>
        /// ヘッドレスモデルを作成する。
        ///
        /// 以下の場合は作成しない。
        ///
        /// * 削除対象が無い場合
        /// * 全部削除対象の場合
        ///
        /// </summary>
        private static Mesh CreateHeadlessModelForSkinnedMeshRenderer(SkinnedMeshRenderer renderer, Transform eraseRoot)
        {
            SetupLayers();
            var bones = renderer.bones;

            var eraseBones = bones.Select((x, i) =>
            {
                // 祖先に削除対象が存在するか
                bool erase = x.Ancestor().Any(y => y == eraseRoot);
                return(new
                {
                    i,
                    erase,
                });
            })
                             .Where(x => x.erase)
                             .Select(x => x.i)
                             .ToArray()
            ;

            if (eraseBones.Length == 0)
            {
                // 削除対象が存在しない
                return(null);
            }

            // 元のメッシュを三人称に変更(自分からは見えない)
            renderer.gameObject.layer = THIRDPERSON_ONLY_LAYER;

            // 削除対象のボーンに対するウェイトを保持する三角形を除外して、一人称用のモデルを複製する
            var headlessMesh = BoneMeshEraser.CreateErasedMesh(renderer.sharedMesh, eraseBones);

            if (headlessMesh.triangles.Length == 0)
            {
                // 一人称用のmeshには描画すべき部分が無い(全部削除された)
                UnityEngine.Object.Destroy(headlessMesh);
                return(null);
            }

            // 一人称用のモデルのセットアップ
            var go = new GameObject("_headless_" + renderer.name);

            go.layer = FIRSTPERSON_ONLY_LAYER;
            go.transform.SetParent(renderer.transform, false);
            var erased = go.AddComponent <SkinnedMeshRenderer>();

            erased.sharedMesh          = headlessMesh;
            erased.sharedMaterials     = renderer.sharedMaterials;
            erased.bones               = bones;
            erased.rootBone            = renderer.rootBone;
            erased.updateWhenOffscreen = true;
            return(headlessMesh);
        }
示例#3
0
        private static void CreateHeadlessModelForSkinnedMeshRenderer(SkinnedMeshRenderer renderer, Transform eraseRoot)
        {
            SetupLayers();
            renderer.gameObject.layer = THIRDPERSON_ONLY_LAYER;

            var go = new GameObject("_headless_" + renderer.name);

            go.layer = FIRSTPERSON_ONLY_LAYER;
            go.transform.SetParent(renderer.transform, false);

            var m_eraseBones = renderer.bones.Select(x =>
            {
                var eb = new BoneMeshEraser.EraseBone
                {
                    Bone = x,
                };

                if (eraseRoot != null)
                {
                    // 首の子孫を消去
                    if (eb.Bone.Ancestor().Any(y => y == eraseRoot))
                    {
                        //Debug.LogFormat("erase {0}", x);
                        eb.Erase = true;
                    }
                }

                return(eb);
            })
                               .ToArray();

            var bones      = renderer.bones;
            var eraseBones = m_eraseBones
                             .Where(x => x.Erase)
                             .Select(x => bones.IndexOf(x.Bone))
                             .ToArray();

            var mesh = BoneMeshEraser.CreateErasedMesh(renderer.sharedMesh, eraseBones);

            var erased = go.AddComponent <SkinnedMeshRenderer>();

            erased.sharedMesh          = mesh;
            erased.sharedMaterials     = renderer.sharedMaterials;
            erased.bones               = renderer.bones;
            erased.rootBone            = renderer.rootBone;
            erased.updateWhenOffscreen = true;
        }