using BigSpace.Logic; using BigSpace.XRCore.Event; using BigSpace.XRCore.RunningScene; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class LeavePlayAreaControll : MonoBehaviour { public GameObject pa_Frame; //掉线后显示可活动区域框 public Transform startPosition; //掉线显示鼎的位置 bool isCheck = false; bool isEnter = false; Vector3 currentPosition; int myId = 0; //自己的编号 bool isWaitCheck = false; bool isIgnoreExit = false; //bool isFirstSpecifylocation = false; //掉线后进场景,第一次要走到指定位置才能正常显示地图 //计时相关 bool isRun = false; float waitTime = 1.5f; float runTime = 0; private void Awake() { string idName = this.gameObject.name.Replace("LeaveBoxCollider_", ""); if (int.TryParse(idName, out int number2)) //获得自己的碰撞编号 { myId = number2; } if (myId % 100 == 1 || RunningSceneMgr.Instance.isOfflineReconnected) //场景的第一个碰撞 或者是掉线进来 { Debug.Log("====场景第一个开始检测:" + myId); isCheck = true; StartCoroutine(AwakeCheckIsEnter(myId)); } } private void Start() { GlobalEventMgr.Listen(GameEvent.EventCheckBoxCollider, GameDataManage_EventCheckBoxCollider); GlobalEventMgr.Listen(GameEvent.EventWaitCheckExit, GameDataManage_EventWaitCheckExit); GlobalEventMgr.Listen(GameEvent.EventIgnoreExit, GameDataManage_EventIgnoreExit); GlobalEventMgr.Listen(GameEvent.EventShowOutLine, GameDataManage_EventShowOutLine); GlobalEventMgr.Listen(GameEvent.EventSetPAFreame, GameDataManage_EventSetPAFreame); GlobalEventMgr.Listen(GameEvent.EventHideLevelPlay, GameDataManage_EventHideLevelPlay); } private void Update() { if (isRun) { runTime += Time.deltaTime; if (runTime >= waitTime) { isRun = false; if (!isIgnoreExit) //未进入下一个场景,要显示出界 { Debug.Log("1显示出界"); StartCoroutine(ShowOutSide()); } } } //if (Input.GetKeyDown(KeyCode.B)) //{ // GameDataManage_EventShowOutLine(); //} } IEnumerator AwakeCheckIsEnter(int index) { yield return new WaitForSeconds(0.1f); if (!isEnter) { Debug.Log("====Awake检测掉线"+index); SetPAFrame(true); GlobalEventMgr.Dispatch(GameEvent.EventShowCheckLeavePlay, index); //if (index == 501) //场景5特殊处理 //{ // isFirstSpecifylocation = true; //} } else //未掉线,要隐藏掉线地图 { SetPAFrame(false); GlobalEventMgr.Dispatch(GameEvent.EventHideLeavePlay); } } private void GameDataManage_EventCheckBoxCollider(int index) { Debug.Log("自动检测位置:" + index); //if (this.gameObject.active && index == myId) if (index == myId) { Debug.Log("进来了....."); isCheck = true; StartCoroutine(CheckIsEnter(index)); } } //忽略检测出界 private void GameDataManage_EventIgnoreExit(int index) { if (index == myId) { isIgnoreExit = true; } } //等待检测出界 private void GameDataManage_EventWaitCheckExit(int index) { if (index == myId) { isWaitCheck = true; } } //主动显示掉线地图 private void GameDataManage_EventShowOutLine() { SetPAFrame(true); GlobalEventMgr.Dispatch(GameEvent.EventShowCheckLeavePlay, myId); } IEnumerator CheckIsEnter(int index) { yield return new WaitForSeconds(1f); if (!isEnter) { SetPAFrame(true); GlobalEventMgr.Dispatch(GameEvent.EventShowCheckLeavePlay, index); } } void GameDataManage_EventHideLevelPlay() { //isFirstSpecifylocation = false; SetPAFrame(false); } private void OnTriggerEnter(Collider other) { if (other.gameObject.name == "XROriginHands" || other.gameObject.name == "Main Camera") { //if (isFirstSpecifylocation) return; Debug.Log("进来了:" + myId); if ((myId - 1) % 100 != 0) { GlobalEventMgr.Dispatch(GameEvent.EventIgnoreExit, myId - 1); //通知道上一个碰撞忽略出界 } SetPAFrame(false); GlobalEventMgr.Dispatch(GameEvent.EventHideLeavePlay); } } private void OnTriggerStay(Collider other) { //if (isFirstSpecifylocation) return; if (isCheck) { if (other.gameObject.name == "XROriginHands"|| other.gameObject.name == "Main Camera") { isCheck = false; isEnter = true; } } } private void OnTriggerExit(Collider other) { if (GameDataManage.Instance.isShowLeaveOn) return; //显示着掉线地图就不用执行下面的逻辑 //if (isFirstSpecifylocation) return; //Debug.Log("碰到谁了:" + other.gameObject.name); if (other.gameObject.name == "XROriginHands"|| other.gameObject.name == "Main Camera") { currentPosition = GameObject.Find("XROriginHands/Camera Offset/Main Camera").transform.position; if (isWaitCheck) { isRun = true; } else { Debug.Log("显示出界"); StartCoroutine(ShowOutSide()); } } } IEnumerator ShowOutSide() { yield return new WaitForSeconds(0.1f); ////等0.5秒取玩家位置 //Vector3 nowPosition = GameObject.Find("XROriginHands/Camera Offset/Main Camera").transform.position; //// 计算A点和B点之间的向量 //Vector3 direction = currentPosition - nowPosition; //// 标准化向量以获取单位向量 //direction.Normalize(); ////// 移动物体1米 ////currentPosition += direction * 1f; GlobalEventMgr.Dispatch(GameEvent.EventShowLeavePlayByPosition, startPosition.position); SetPAFrame(true); } //void ShowOutSide() //{ // //等0.5秒取玩家位置 // Vector3 nowPosition = GameObject.Find("XROriginHands/Camera Offset/Main Camera").transform.position; // // 计算A点和B点之间的向量 // Vector3 direction = centerPosition - currentPosition; // // 标准化向量以获取单位向量 // direction.Normalize(); // //// 移动物体1米 // //currentPosition += direction * 1f; // GlobalEventMgr.Dispatch(GameEvent.EventShowLeavePlayByPosition, currentPosition += direction * 1.5f); //} private void GameDataManage_EventSetPAFreame(bool isShow) { SetPAFrame(isShow); } void SetPAFrame(bool isShow) { if (pa_Frame != null) { pa_Frame.SetActive(isShow); } } private void OnDestroy() { GlobalEventMgr.Remove(GameEvent.EventCheckBoxCollider, GameDataManage_EventCheckBoxCollider); } }