c#事件和Unity觸發器
c#事件和Unity觸發器
今天在跟着視頻做遊戲的時侯,遇到一個問題:
當玩家在場景移動的過程中會觸發場景的觸發器,觸發時遊戲中要進行一些操作,如播放對應的聲音,燈光改變。視頻中是把遊戲管理類做成了單例,然後調用裏面的方法。我覺這種方式有點不好,具體那裏不好也說不上來,我就想可以用C#中的事件來做這個事情。
- 首先建立一個事件的發佈器類,用於事件的發佈還有定義
- 把這個定義爲單例
- 在觸發器腳本代碼中調用事件的發佈方法
- 在遊戲控制類中註冊事件。
以下是代碼
事件的發佈器用於事件的發佈
using UnityEngine;
//事件的發佈器
/// <summary>
/// 自定義時間處理
/// 1,時間的監聽和分發
/// </summary>
public class CustomEventManager
{
public delegate void DiscoveredHandler(Vector3 pos);
public event DiscoveredHandler DiscoveredEvent;
private static CustomEventManager _instance;
static CustomEventManager() {
_instance = new CustomEventManager();
}
public static CustomEventManager Instance{
get{return _instance;}
}
public void OnEvent(Vector3 pos) {
if (DiscoveredEvent != null) {
DiscoveredEvent(pos);
}
}
}
事件的註冊
public bool OnAlerm = false;
private Vector3 _lastPlayerPos = Vector3.zero;
private GameObject[] _sirens = new GameObject[6];
private void Awake()
{
_sirens = GameObject.FindGameObjectsWithTag(Tags.siren);
// 使用事件機制來進行玩家觸發觸發器事件的監聽
CustomEventManager.Instance.DiscoveredEvent += new CustomEventManager.DiscoveredHandler(DiscoverPlayer);
}
private void DiscoverPlayer(Vector3 pos) {
OnAlerm = true;
_lastPlayerPos = pos;
}
事件的觸發
***1,第一個腳本中的代碼***
private void OnTriggerStay(Collider other)
{
CustomEventManager.Instance.OnEvent(other.transform.position);
}
***第二腳本中的代碼***
public class MyCctvCamera : MonoBehaviour {
//public delegate void DiscoveredHandler(Vector3 pos);
//public event DiscoveredHandler DiscoveredEvent;
public void OnTriggerStay(Collider other)
{
if (other.tag == Tags.player) {
//DiscoveredEvent(other.transform.position);
CustomEventManager.Instance.OnEvent(other.transform.position);
}
}
}
一點拙見,不知道這樣會不會好一點,以後理解的更深入了再來修改,有好的方法可以用,繼續努力