流程
当玩家移动到触发区域的时候,门自动打开
事件系统
cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventSystem : MonoBehaviour
{
public static EventSystem Instance { get; private set; }
public event Action<int> onDoorEnter;
public event Action<int> onDoorExit;
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject);
}
Debug.Log("EventSystem initialized.");
}
public void OpenDoor(int id)
{
if (onDoorEnter != null)
{
onDoorEnter(id);
}
}
public void CloseDoor(int id)
{
if(onDoorExit != null)
{
onDoorExit(id);
}
}
}
门-订阅事件,取消订阅
当物体销毁的时候要取消订阅
订阅事件的时候,接受参数的方法要一样
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class Door : MonoBehaviour
{
[SerializeField] private int ID;
private Vector3 originPos;
public void Start()
{
EventSystem.Instance.onDoorEnter += DoorOpen;
EventSystem.Instance.onDoorExit += DoorClose;
originPos=gameObject.transform.position;
}
private void OnDisable()
{
EventSystem.Instance.onDoorEnter -= DoorOpen;
EventSystem.Instance.onDoorExit -= DoorClose;
}
public void DoorOpen(int id)
{
if(ID==id)
{
Debug.Log("向上移动");
// 从当前位置向上移动3个单位
gameObject.transform.DOMove(new Vector3(originPos.x, originPos.y+3f, originPos.z), 1f);
}
}
public void DoorClose(int id)
{
if (ID==id)
{
gameObject.transform.DOMove(originPos, 1f);
}
}
}
触发区域
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TriggerArea : MonoBehaviour
{
[SerializeField] private int ID;
private void OnTriggerEnter(Collider other)
{
Debug.Log("进入触发区域");
EventSystem.Instance.OpenDoor(ID);
}
private void OnTriggerExit(Collider other)
{
EventSystem.Instance.CloseDoor(ID);
}
}