using System.Collections; using System.Collections.Generic; using UnityEngine; using BigSpace.Logic; using BigSpace.XRCore.Event; public class LeavePlayPrefabControll : MonoBehaviour { public GameObject leavePrefab; public GameObject boxCollider; //public GameObject block; // Start is called before the first frame update void Start() { DontDestroyOnLoad(gameObject); GlobalEventMgr.Listen(GameEvent.EventShowLeavePlayByPosition, GameDataManage_EventShowLeavePlayByPosition); GlobalEventMgr.Listen(GameEvent.EventShowCheckLeavePlay, GameDataManage_EventShowCheckLeavePlay); GlobalEventMgr.Listen(GameEvent.EventHideLeavePlay, GameDataManage_EventHideLeavePlay); } private void GameDataManage_EventShowLeavePlayByPosition(Vector3 v3) { Debug.Log("自己离开出界位置:" + v3); //string index = boxName.Replace("LeaveBoxCollider_", ""); GameDataManage.Instance.isShowLeaveOn = true; RenderSettings.fog = false; GameObject gameScene = GameObject.Find("GameScene"); //GameObject staticObj = gameScene.transform.Find("Static").gameObject; if (SceneMgr.Instance.nowSceneId == 4) { SetObjsRender(false); } else { gameScene.transform.Find("Static").gameObject.SetActive(false); gameScene.transform.Find("Dynamic").gameObject.SetActive(false); } GameObject gameEnvi = GameObject.Find("GameScene/Environment/SkyBox_360Player"); SetGameObjectLayer(gameEnvi, false); leavePrefab.transform.position = new Vector3(v3.x, 0, v3.z); leavePrefab.SetActive(true); boxCollider.transform.localScale = new Vector3(1,1,1.5f); //block.SetActive(true); } //主动检测出界 private void GameDataManage_EventShowCheckLeavePlay(int index) { Debug.Log("显示的位置:" + index); GameDataManage.Instance.isShowLeaveOn = true; RenderSettings.fog = false; GameObject gameScene = GameObject.Find("GameScene"); //gameScene.transform.Find("Static").gameObject.SetActive(false); //gameScene.transform.Find("Dynamic").gameObject.SetActive(false); if (SceneMgr.Instance.nowSceneId == 4) { SetObjsRender(false); } else { gameScene.transform.Find("Static").gameObject.SetActive(false); gameScene.transform.Find("Dynamic").gameObject.SetActive(false); } GameObject SkyBox = GameObject.Find("GameScene/Environment/SkyBox_360Player"); SetGameObjectLayer(SkyBox, false);//修改天空球显示层级为Invisible GameObject tagObj = GameObject.Find("LeaveBoxCollider_" + index+ "/StartPosition"); leavePrefab.transform.position = new Vector3(tagObj.transform.position.x, 0, tagObj.transform.position.z); leavePrefab.SetActive(true); boxCollider.transform.localScale = new Vector3(1, 1, 1.5f); //block.SetActive(true); } public void SetObjsRender(bool isActive) { GameObject gameScene = GameObject.Find("GameScene"); GameObject staticObj = gameScene.transform.Find("Static").gameObject; GameObject Dog_Root = GameObject.Find("GameScene/Dynamic/Character/Dog_Root"); if (Dog_Root!=null) { Dog_Root.gameObject.SetActive(isActive); } // 使用递归方法获取所有子物体的Renderer组件 List staticRenderers = GetAllRenderersRecursive(staticObj); for (int i = 0; i < staticRenderers.Count; i++) { staticRenderers[i].enabled = isActive; } GameObject dynamicObj = gameScene.transform.Find("Dynamic").gameObject; // 使用递归方法获取所有子物体的Renderer组件 List dynamicRenderers = GetAllRenderersRecursive(dynamicObj); for (int i = 0; i < dynamicRenderers.Count; i++) { dynamicRenderers[i].enabled = isActive; } // 处理名字包含"vfx"的节点,隐藏或恢复 SetVfxNodesActive(staticObj, isActive); SetVfxNodesActive(dynamicObj, isActive); } /// /// 递归设置名字包含"vfx"的节点的激活状态(隐藏或恢复) /// /// 父物体 /// 是否激活(true=恢复,false=隐藏) private void SetVfxNodesActive(GameObject parent, bool isActive) { if (parent == null) return; // 递归遍历所有子物体 SetVfxNodesActiveRecursive(parent.transform, isActive); } /// /// 递归辅助方法,查找并设置名字包含"vfx"的节点 /// private void SetVfxNodesActiveRecursive(Transform parent, bool isActive) { if (parent == null) return; // 检查当前节点名字是否包含"vfx"(不区分大小写) if (parent.name.ToLower().Contains("vfx")) { parent.gameObject.SetActive(isActive); } // 递归遍历所有子物体 foreach (Transform child in parent) { SetVfxNodesActiveRecursive(child, isActive); } } /// /// 递归获取GameObject及其所有子物体的Renderer组件(包括子物体的子物体,直到没有子物体) /// /// 父物体 /// 是否包含未激活的物体 /// 所有Renderer组件的列表 public List GetAllRenderersRecursive(GameObject parent, bool includeInactive = false) { List renderers = new List(); if (parent == null) return renderers; // 递归遍历所有子物体 GetAllRenderersRecursive(parent.transform, renderers, includeInactive); return renderers; } /// /// 递归辅助方法,遍历Transform层级结构 /// private void GetAllRenderersRecursive(Transform parent, List renderers, bool includeInactive) { if (parent == null) return; // 如果物体未激活且不包含未激活物体,则跳过 if (!includeInactive && !parent.gameObject.activeInHierarchy) { return; } // 获取当前物体的Renderer组件 Renderer renderer = parent.GetComponent(); if (renderer != null) { renderers.Add(renderer); } // 递归遍历所有子物体 foreach (Transform child in parent) { GetAllRenderersRecursive(child, renderers, includeInactive); } } private void GameDataManage_EventHideLeavePlay() { Debug.Log("到位置了还原回来"); GameDataManage.Instance.isShowLeaveOn = false; RenderSettings.fog = true; GameObject gameScene = GameObject.Find("GameScene"); if (GameDataManage.Instance.isNeedShowAnyBuyOffline) { if (SceneMgr.Instance.nowSceneId==4) { SetObjsRender(true); } else { gameScene.transform.Find("Static").gameObject.SetActive(true); gameScene.transform.Find("Dynamic").gameObject.SetActive(true); } } GameObject SkyBox = GameObject.Find("GameScene/Environment/SkyBox_360Player"); SetGameObjectLayer(SkyBox, true);//恢复天空球显示层级为Default leavePrefab.SetActive(false); //block.SetActive(false); GlobalEventMgr.Dispatch(GameEvent.EventHideLevelPlay); GlobalEventMgr.Dispatch(GameEvent.EventSetPAFreame, false); } //修改GameObject的Layer 需要相机设置关闭Invisible层级显示 private void SetGameObjectLayer(GameObject go, bool isShow) { if (go == null) return; int layer = LayerMask.NameToLayer("Skybox"); if (!isShow) { layer = LayerMask.NameToLayer("Invisible"); } go.layer = layer; } }