/// <summary> /// from v0.64.0 /// </summary> /// <param name="isSelf"></param> public void Setup(bool isSelf, SetVisiblityFunc setVisiblity) { 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, setVisiblity); if (headlessMesh != null) { m_headlessMeshes.Add(headlessMesh); } } break; case FirstPersonFlag.FirstPersonOnly: setVisiblity(x.Renderer, true, false); break; case FirstPersonFlag.ThirdPersonOnly: setVisiblity(x.Renderer, false, true); break; case FirstPersonFlag.Both: setVisiblity(x.Renderer, true, true); break; } } } else { // other avatar foreach (var x in Renderers) { switch (x.FirstPersonFlag) { case FirstPersonFlag.FirstPersonOnly: setVisiblity(x.Renderer, false, false); break; case FirstPersonFlag.Auto: // => Same as Both case FirstPersonFlag.Both: case FirstPersonFlag.ThirdPersonOnly: setVisiblity(x.Renderer, true, true); break; } } } }
/// <summary> /// ヘッドレスモデルを作成した場合に返す /// </summary> Mesh CreateHeadlessModel(Renderer _renderer, Transform EraseRoot, SetVisiblityFunc setVisiblity) { { var renderer = _renderer as SkinnedMeshRenderer; if (renderer != null) { return(CreateHeadlessModelForSkinnedMeshRenderer(renderer, EraseRoot, setVisiblity)); } } { var renderer = _renderer as MeshRenderer; if (renderer != null) { CreateHeadlessModelForMeshRenderer(renderer, EraseRoot, setVisiblity); return(null); } } // ここには来ない return(null); }
/// <summary> /// ヘッドレスモデルを作成する。 /// /// 以下の場合は作成しない。 /// /// * 削除対象が無い場合 /// * 全部削除対象の場合 /// /// </summary> private static Mesh CreateHeadlessModelForSkinnedMeshRenderer(SkinnedMeshRenderer renderer, Transform eraseRoot, SetVisiblityFunc setVisiblity) { 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); } // 元のメッシュを三人称に変更(自分からは見えない) setVisiblity(renderer, false, true); // 削除対象のボーンに対するウェイトを保持する三角形を除外して、一人称用のモデルを複製する var headlessMesh = MeshUtility.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); }
private static void CreateHeadlessModelForMeshRenderer(MeshRenderer renderer, Transform eraseRoot, SetVisiblityFunc setVisiblity) { if (renderer.transform.Ancestors().Any(x => x == eraseRoot)) { // 祖先に削除ボーンが居る setVisiblity(renderer, false, true); } else { // 特に変更しない => 両方表示 } }