Example #1
0
        /// <summary>
        /// from v0.64.0
        /// </summary>
        /// <param name="isSelf"></param>
        public void Setup(bool isSelf, SetVisibilityFunc setVisibility)
        {
            if (m_done)
            {
                return;
            }
            m_done = true;

            if (isSelf)
            {
                // self avatar
                foreach (var x in Renderers)
                {
                    switch (x.FirstPersonFlag)
                    {
                    case FirstPersonFlag.Auto:
                    {
                        var headlessMesh = CreateHeadlessModel(x.Renderer, FirstPersonBone, setVisibility);
                        if (headlessMesh != null)
                        {
                            m_headlessMeshes.Add(headlessMesh);
                        }
                    }
                    break;

                    case FirstPersonFlag.FirstPersonOnly:
                        setVisibility(x.Renderer, true, false);
                        break;

                    case FirstPersonFlag.ThirdPersonOnly:
                        setVisibility(x.Renderer, false, true);
                        break;

                    case FirstPersonFlag.Both:
                        setVisibility(x.Renderer, true, true);
                        break;
                    }
                }
            }
            else
            {
                // other avatar
                foreach (var x in Renderers)
                {
                    switch (x.FirstPersonFlag)
                    {
                    case FirstPersonFlag.FirstPersonOnly:
                        setVisibility(x.Renderer, false, false);
                        break;

                    case FirstPersonFlag.Auto:
                    // => Same as Both
                    case FirstPersonFlag.Both:
                    case FirstPersonFlag.ThirdPersonOnly:
                        setVisibility(x.Renderer, true, true);
                        break;
                    }
                }
            }
        }
Example #2
0
        /// <summary>
        /// ヘッドレスモデルを作成した場合に返す
        /// </summary>
        Mesh CreateHeadlessModel(Renderer _renderer, Transform EraseRoot, SetVisibilityFunc setVisibility)
        {
            {
                var renderer = _renderer as SkinnedMeshRenderer;
                if (renderer != null)
                {
                    return(CreateHeadlessModelForSkinnedMeshRenderer(renderer, EraseRoot, setVisibility));
                }
            }


            {
                var renderer = _renderer as MeshRenderer;
                if (renderer != null)
                {
                    CreateHeadlessModelForMeshRenderer(renderer, EraseRoot, setVisibility);
                    return(null);
                }
            }

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

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

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

            // 元のメッシュを三人称に変更(自分からは見えない)
            setVisibility(renderer, false, true);

            // 削除対象のボーンに対するウェイトを保持する三角形を除外して、一人称用のモデルを複製する
            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);
        }
Example #4
0
 private static void CreateHeadlessModelForMeshRenderer(MeshRenderer renderer, Transform eraseRoot, SetVisibilityFunc setVisibility)
 {
     if (renderer.transform.Ancestors().Any(x => x == eraseRoot))
     {
         // 祖先に削除ボーンが居る
         setVisibility(renderer, false, true);
     }
     else
     {
         // 特に変更しない => 両方表示
     }
 }