142 lines
5.0 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |