コード例 #1
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;
        }
コード例 #2
0
        void OnValidate()
        {
            //Debug.Log("OnValidate");
            if (m_skinnedMesh == null)
            {
                m_eraseBones = new BoneMeshEraser.EraseBone[] { };
                return;
            }

            if (EraseRoot == null)
            {
                if (m_animator != null)
                {
                    EraseRoot = m_animator.GetBoneTransform(HumanBodyBones.Head);
                    //Debug.LogFormat("head: {0}", EraseRoot);
                }
            }

            m_eraseBones = m_skinnedMesh.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();
        }