流程
當玩家移動到觸發區域的時候,門自動打開
事件系統
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);}
}
?