using System; using Cysharp.Threading.Tasks; using Stary.Evo; using Stary.Evo.AudioCore; using UnityEngine; using UnityEngine.UI; using YooAsset; namespace Main { public class ZoneController : MonoBehaviour, IController { public ZoneType zoneType; /// /// 区域包围盒 /// public BoxCollider ZoneCollider { get; set; } /// /// 区域中心点碰撞盒 /// public SphereCollider ZoneColliderPoint { get; set; } public PointController[] PointControllerEntities { get; set; } private IUnRegister _onTriggerEnterUnRegister; private IUnRegister _onTriggerExitUnRegister; private Image _image; private Transform ipTransform; public async void Init(ZoneData zoneData) { name = zoneData.name; zoneType = Enum.Parse(name); _image=transform.Find("Canvas/Image").GetComponent(); ipTransform = transform.Find("IPPosition"); //根据数据设置zone 碰撞盒 transform.localPosition = zoneData.position; transform.localRotation = Quaternion.Euler(zoneData.rotation); transform.localScale = zoneData.scale; ZoneCollider = this.transform.Find("BoxBounding").GetComponent(); ZoneCollider.center = zoneData.boundingBoxCenter; ZoneCollider.size = zoneData.boundingBoxSize; ZoneCollider.gameObject.SetActive(false); ZoneColliderPoint = this.transform.Find("GuideBall_Point").GetComponent(); ZoneColliderPoint.transform.localPosition = zoneData.ColliderPosition; ZoneColliderPoint.transform.localRotation = Quaternion.Euler(zoneData.ColliderRotation); ZoneColliderPoint.transform.localScale = zoneData.ColliderScale; ZoneColliderPoint.GetComponentInChildren().text = zoneData.desc; PointControllerEntities = new PointController[zoneData.pointDatas.Count]; var package = YooAssets.TryGetPackage("Main"); var spriteHandle = package.LoadAssetAsync($"Sprites_{zoneData.spriteName}" ); await spriteHandle.Task; _image.sprite = spriteHandle.GetAssetObject(); _image.SetNativeSize(); _image.gameObject.SetActive(false); var pointHandle = package.LoadAssetAsync(R.Res.Main.prefabs.guideball_point_prefab); await pointHandle.Task; for (int i = 0; i < zoneData.pointDatas.Count; i++) { PointData currentPointData = zoneData.pointDatas[i]; var pointGo = pointHandle.InstantiateSync(this.transform); PointController pointController = pointGo.GetOrAddComponent(); PointControllerEntities[i] = pointController; pointController.Init(this, currentPointData); this.GetSystem().AddPointData(new DigitalHumanPointData() { pointName = zoneData.pointDatas[i].name, boundName = zoneData.name, pointTransform = pointGo.transform, boundTransform = ipTransform, }); } // this.RegisterEvent(zoneType, OpenPoint); _onTriggerEnterUnRegister = ZoneColliderPoint.OnTriggerEnterEvent(OnZoneTriggerEnterEvent); } public async void OnZoneTriggerEnterEvent(Collider collider) { Debug.Log($"【{transform.name}】OnZoneTriggerEnterEvent"); if (collider.gameObject.CompareTag("MainCamera")) { _onTriggerEnterUnRegister.UnRegister(); ZoneColliderPoint.gameObject.SetActive(false); PointActive(true); this.GetSystem().OpenCurrentZone(this); ZoneCollider.gameObject.SetActive(true); _onTriggerExitUnRegister = ZoneCollider.OnTriggerExitEvent(OnZoneTriggerExitEvent); var package=YooAssets.TryGetPackage("Main"); var handle=package.LoadAssetAsync(R.Res.Main.audios.au_effect_element_pop_mp3); await handle.WithCancellation(this.GetCancellationTokenOnDestroy()); AudioCoreManager.PlaySFX(new AudioData() { clip = handle.GetAssetObject() }); BoundingEvent(); } } public void OnZoneTriggerExitEvent(Collider collider) { if (collider.gameObject.CompareTag("MainCamera")) { Debug.Log($"【{transform.name}】OnZoneTriggerExitEvent"); _onTriggerExitUnRegister.UnRegister(); ZoneCollider.gameObject.SetActive(false); PointActive(false); HybridClREntrance entrance= FindObjectOfType(); if (entrance != null) { entrance.CloseDomain(); } else { Debug.LogError("UnityEvo:HybridClREntrance is null"); } } } public void PointActive(bool force = true) { foreach (var controller in PointControllerEntities) { controller.gameObject.SetActive(force); } } public void OpenPoint(PointController controller) { foreach (var controllerEntity in PointControllerEntities) { if (controllerEntity == controller) { controller.gameObject.SetActive(false); } else { controllerEntity.gameObject.SetActive(true); } } } public void ColsePoint() { foreach (var controller in PointControllerEntities) { controller.gameObject.SetActive(false); } } public void BoundingEvent(bool isShow = true) { //显示ip相关 if (isShow) { _image.gameObject.SetActive(true); this.GetSystem().SetPositionOfBound(this.name); } else { _image.gameObject.SetActive(false); } } public IArchitecture GetArchitecture() { return MainArchitecture.Interface; } } }