Files
PrinceOfGlory/Assets/Scripts/Leave/LeavePlayPrefabControll.cs
kridoo 5ba318796f 1
2025-11-14 19:34:36 +08:00

218 lines
8.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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>();
//for (int i = 0; i < renderers.Length-1; i++)
//{
// renderers[i].enabled = false;
//}
//gameScene.transform.Find("Dynamic").gameObject.SetActive(false);
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;
// 使用递归方法获取所有子物体的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;
}
// 检查是否有碰撞器或触发器,如果有则跳过该节点,保持原状
Collider collider = parent.GetComponent<Collider>();
if (collider != null)
{
// 如果节点上有碰撞器或触发器跳过该节点的Renderer继续遍历子物体
foreach (Transform child in parent)
{
GetAllRenderersRecursive(child, renderers, includeInactive);
}
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;
}
}