Files
plugin-library/Assets/11.PointCloudTools/Runtime/Script/PointSystem/ZoneController.cs

142 lines
5.0 KiB
C#

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<PointController> pointControllerEntities;
/// <summary>
/// 大区域网格碰撞
/// </summary>
private MeshCollider bigMeshCollider;
//大区域范围进入事件
public IUnRegister _onBigMeshColliderStayUnRegister;
public IUnRegister _onBigMeshColliderExitUnRegister;
public IUnRegister _onBigMeshColliderEnterUnRegister;
public Action<Collider> OnColliderStay;
public Action<Collider> OnColliderExit;
public Action<Collider> 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<PointController>(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<IZoneSystem>().HideBigMeshColliderStayUnRegister();
OnBigMeshColliderEnterEvent(collider);
OnColliderStay?.Invoke(collider);
}
private void OnBigMeshColliderEnterEvent(Collider collider)
{
if (PointCloudService.GetService<IZoneSystem>().CurrentZoneType == pointType)
return;
if (collider.gameObject.CompareTag("GameController"))
{
Debug.Log($"collider:【{collider.name}】 point:【{name}】 OnBigMeshColliderEnterEvent");
PointCloudService.GetService<IZoneSystem>().OpenNextZonePoint(this);
// ActiveAllPointHideOrShow(true);
bigMeshCollider.transform.parent.Find("Arrow").gameObject.SetActive(true);
OnColliderEnter?.Invoke(collider);
PointCloudService.GetService<IZoneSystem>().CurrentZoneType = pointType;
//this.GetSystem<IZoneSystem>().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);
}
}
/// <summary>
/// 打开区域的点位
/// </summary>
/// <param name="force">是否打开</param>
/// <param name="isOpenCurrentDomain">是否打开当前触发点位</param>
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<IZoneSystem>().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);
}
}
}
}
}