208 lines
7.7 KiB
C#
208 lines
7.7 KiB
C#
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<Vector3>(GameEvent.EventShowLeavePlayByPosition, GameDataManage_EventShowLeavePlayByPosition);
|
||
GlobalEventMgr.Listen<int>(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;
|
||
//gameScene.transform.Find("Static").gameObject.SetActive(false);
|
||
//Renderer[] renderers = staticObj.GetComponentsInChildren<Renderer>();
|
||
|
||
SetObjsRender(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);
|
||
SetObjsRender(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<Renderer> staticRenderers = GetAllRenderersRecursive(staticObj);
|
||
for (int i = 0; i < staticRenderers.Count; i++)
|
||
{
|
||
staticRenderers[i].enabled = isActive;
|
||
|
||
}
|
||
|
||
GameObject dynamicObj = gameScene.transform.Find("Dynamic").gameObject;
|
||
// 使用递归方法获取所有子物体的Renderer组件
|
||
List<Renderer> dynamicRenderers = GetAllRenderersRecursive(dynamicObj);
|
||
for (int i = 0; i < dynamicRenderers.Count; i++)
|
||
{
|
||
dynamicRenderers[i].enabled = isActive;
|
||
}
|
||
|
||
// 处理名字包含"vfx"的节点,隐藏或恢复
|
||
SetVfxNodesActive(staticObj, isActive);
|
||
SetVfxNodesActive(dynamicObj, isActive);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 递归设置名字包含"vfx"的节点的激活状态(隐藏或恢复)
|
||
/// </summary>
|
||
/// <param name="parent">父物体</param>
|
||
/// <param name="isActive">是否激活(true=恢复,false=隐藏)</param>
|
||
private void SetVfxNodesActive(GameObject parent, bool isActive)
|
||
{
|
||
if (parent == null) return;
|
||
|
||
// 递归遍历所有子物体
|
||
SetVfxNodesActiveRecursive(parent.transform, isActive);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 递归辅助方法,查找并设置名字包含"vfx"的节点
|
||
/// </summary>
|
||
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);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 递归获取GameObject及其所有子物体的Renderer组件(包括子物体的子物体,直到没有子物体)
|
||
/// </summary>
|
||
/// <param name="parent">父物体</param>
|
||
/// <param name="includeInactive">是否包含未激活的物体</param>
|
||
/// <returns>所有Renderer组件的列表</returns>
|
||
public List<Renderer> GetAllRenderersRecursive(GameObject parent, bool includeInactive = false)
|
||
{
|
||
List<Renderer> renderers = new List<Renderer>();
|
||
|
||
if (parent == null) return renderers;
|
||
|
||
// 递归遍历所有子物体
|
||
GetAllRenderersRecursive(parent.transform, renderers, includeInactive);
|
||
|
||
return renderers;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 递归辅助方法,遍历Transform层级结构
|
||
/// </summary>
|
||
private void GetAllRenderersRecursive(Transform parent, List<Renderer> renderers, bool includeInactive)
|
||
{
|
||
if (parent == null) return;
|
||
|
||
// 如果物体未激活且不包含未激活物体,则跳过
|
||
if (!includeInactive && !parent.gameObject.activeInHierarchy)
|
||
{
|
||
return;
|
||
}
|
||
|
||
|
||
// 获取当前物体的Renderer组件
|
||
Renderer renderer = parent.GetComponent<Renderer>();
|
||
|
||
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)
|
||
{
|
||
//gameScene.transform.Find("Static").gameObject.SetActive(true);
|
||
//gameScene.transform.Find("Dynamic").gameObject.SetActive(true);
|
||
SetObjsRender(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;
|
||
}
|
||
}
|