using System; using System.Collections.Generic; using Cysharp.Threading.Tasks; using Stary.Evo; using UnityEngine; namespace Main { public class ZoneController : MonoBehaviour { public string pointType; public List pointControllerEntities; /// /// 大区域网格碰撞 /// private MeshCollider bigMeshCollider; //大区域范围进入事件 public IUnRegister _onBigMeshColliderStayUnRegister; public IUnRegister _onBigMeshColliderExitUnRegister; public IUnRegister _onBigMeshColliderEnterUnRegister; public Action OnColliderStay; public Action OnColliderExit; public Action OnColliderEnter; public async UniTask Init(ZoneData zoneData) { name = zoneData.name; pointType = name; //根据数据设置zone 碰撞盒 transform.localPosition = zoneData.transformData.position; transform.localRotation = Quaternion.Euler(zoneData.transformData.rotation); transform.localScale = zoneData.transformData.scale; pointControllerEntities = new List(zoneData.pointDatas.Count); await UniTask.CompletedTask; } public void InitMeshCollider(MeshCollider bigMeshCollider) { this.bigMeshCollider = bigMeshCollider; _onBigMeshColliderStayUnRegister = bigMeshCollider.OnTriggerStayEvent(OnBigMeshColliderStayEvent); _onBigMeshColliderExitUnRegister = bigMeshCollider.OnTriggerExitEvent(OnBigMeshColliderExitEvent); _onBigMeshColliderEnterUnRegister = bigMeshCollider.OnTriggerEnterEvent(OnBigMeshColliderEnterEvent); } private void OnBigMeshColliderStayEvent(Collider collider) { PointCloudService.GetService().HideBigMeshColliderStayUnRegister(); OnBigMeshColliderEnterEvent(collider); OnColliderStay?.Invoke(collider); } private void OnBigMeshColliderEnterEvent(Collider collider) { if (PointCloudService.GetService().CurrentZoneType == pointType) return; if (collider.gameObject.CompareTag("GameController")) { Debug.Log($"collider:【{collider.name}】 point:【{name}】 OnBigMeshColliderEnterEvent"); PointCloudService.GetService().OpenNextZonePoint(this); // ActiveAllPointHideOrShow(true); bigMeshCollider.transform.parent.Find("Arrow").gameObject.SetActive(true); OnColliderEnter?.Invoke(collider); PointCloudService.GetService().CurrentZoneType = pointType; //this.GetSystem().HideBigMeshColliderStayUnRegister(_onBigMeshColliderStayUnRegister); } } private void OnBigMeshColliderExitEvent(Collider collider) { if (collider.gameObject.CompareTag("GameController")) { Debug.Log($"collider:【{collider.name}】 point:【{name}】 OnBigMeshColliderExitEvent"); bigMeshCollider.transform.parent.Find("Arrow").gameObject.SetActive(false); OnColliderExit?.Invoke(collider); } } /// /// 打开区域的点位 /// /// 是否打开 /// 是否打开当前触发点位 public void ActiveAllPointHideOrShow(bool force = true, bool isOpenCurrentDomain = true) { foreach (var controller in pointControllerEntities) { if (force == false) { controller.gameObject.SetActive(false); } else { if (isOpenCurrentDomain) { controller.gameObject.SetActive(true); } else { if (PointCloudService.GetService().CurrentPointType == controller.name) { controller.gameObject.SetActive(false); } else { controller.gameObject.SetActive(true); } } } } } public void CurrentPointActiveHideOrShow(PointController controller, bool force = true) { foreach (var controllerEntity in pointControllerEntities) { if (controllerEntity == controller) { controller.gameObject.SetActive(force); } else { controllerEntity.gameObject.SetActive(!force); } } } } }