【Unity笔记02】订阅事件-自动开门
流程
当玩家移动到触发区域的时候,门自动打开
事件系统
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);}}
}
门-订阅事件,取消订阅
当物体销毁的时候要取消订阅
订阅事件的时候,接受参数的方法要一样
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);}}
}
触发区域
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);}
}