我試圖理解 C# (Unity) 中的事件,但這個問題讓我有點發瘋。
我有一個事件腳本,它的作業部分是
public class GameEvents : MonoBehaviour
{
public static GameEvents current;
private void Awake()
{
current = this;
}
public event Action<string, string, GameObject, int, bool> onDoorTriggerEnterEvent;
public event Action<string, string, GameObject, int, bool> onDoorTriggerExitEvent;
public event Action<GameObject, int, int> onDoorOpenSequenceEvent;
public string triggerEnteredName { get; private set; }
public string triggerEnteredType { get; private set; }
public GameObject doorWingOldTransform { get; private set; }
public int doorAccessLevel { get; private set; }
public int playerLevelPoints { get; private set; }
public bool triggerEntered { get; private set; }
public string doorTypeToOpen { get; private set; }
public string doorNameToOpen { get; private set; }
public GameObject doorWingOldTransformToOpen { get; private set; }
public void DoorOpenSequence(GameObject doorWingOldTransformToOpen, int doorAccessLevel, int playerLevelPoints)
{
if (onDoorOpenSequenceEvent != null)
{
this.doorWingOldTransformToOpen = doorWingOldTransformToOpen;
this.doorAccessLevel = doorAccessLevel;
this.playerLevelPoints = playerLevelPoints;
Debug.Log(doorWingOldTransformToOpen);
Debug.Log(doorAccessLevel);
Debug.Log(playerLevelPoints);
onDoorOpenSequenceEvent(doorWingOldTransformToOpen, doorAccessLevel, playerLevelPoints);
}
else
{
Debug.Log("Event is null");
}
}
public void DoorTriggerEnter(string triggerEnteredType, string triggerEnteredName, GameObject doorWingOldTransform, int doorAccessLevel)
{
if (onDoorTriggerEnterEvent != null)
{
this.triggerEnteredType = triggerEnteredType;
this.triggerEnteredName = triggerEnteredName;
this.doorAccessLevel = doorAccessLevel;
this.doorWingOldTransform = doorWingOldTransform;
triggerEntered = true;
onDoorTriggerEnterEvent(triggerEnteredType, triggerEnteredName, doorWingOldTransform, doorAccessLevel, triggerEntered);
}
}
public void DoorTriggerExit(string triggerEnteredType, string triggerEnteredName, GameObject doorWingOldTransform, int doorAccessLevel)
{
if (onDoorTriggerExitEvent != null)
{
this.triggerEnteredType = triggerEnteredType;
this.triggerEnteredName = triggerEnteredName;
this.doorWingOldTransform = doorWingOldTransform;
triggerEntered = false;
onDoorTriggerExitEvent(triggerEnteredType, triggerEnteredName, doorWingOldTransform, doorAccessLevel, triggerEntered);
}
}
}
前兩個事件運行良好。但是第三個在這一行中給了我一個 NULL 參考例外:
onDoorOpenSequenceEvent(doorWingOldTransformToOpen, doorAccessLevel, playerLevelPoints);
這些 Debug.Logs 為我提供了所有接收到的資料的資訊,但事件仍然為 NULL(我的意思是當我在沒有 if(onDoorOpenSequenceEvent != null) 的情況下嘗試它時)。
這些從外部呼叫的事件之間的唯一區別是前兩個是從 OnTriggerEnter 呼叫的,第三個是從 void Update 到 Input.GetKeyDown 呼叫的,但是無論我從哪里發送資料,因為我已經嘗試了所有方法并且該事件仍然為NULL。
UPD:當然我在另一個腳本中有一個監聽器,但除錯仍然沒有出現:
private void Awake()
{
GameEvents.current.onDoorOpenSequenceEvent = OnDoorOpenSequence;
}
private void OnDoorOpenSequence(GameObject doorWingOldTransformToOpen, int doorAccessLevel, int playerLevelPoints)
{
Debug.Log("資料成功到達這里"); }
我知道這段代碼看起來不太好,但我是 C# 的新手。
UPD:我的問題是我沒有錯誤地將我的聽眾附加到場景中的任何游戲物件上。它也需要是 Start 而不是 Awake 方法。所以……解決了。
請在這件事上給予我幫助。謝謝。
uj5u.com熱心網友回復:
我在其他任何地方都看不到你的代碼。因此,我猜您沒有onDoorOpenSequenceEvent 像這樣分配其他地方
onDoorOpenSequenceEvent = somefunction;
uj5u.com熱心網友回復:
問題不在于在何處呼叫這些事件,而在于誰/什么訂閱了它們。如果您從未將任何回呼/偵聽器附加到事件 ( =),那么它將是null
所以實際上這沒什么好擔心的,它只是意味著目前沒有人關心這個事件,即使你會(當然,由于 null ref 例外不可能)呼叫它,沒有人會監聽它并對它做出反應。
只需洗掉您的 else 塊;)
作為旁注,因為您有多個引數,我建議您寧愿使用delegate適當的名稱來正確命名您的引數,例如
public delegate void TriggerEvent(string triggerType, string triggerName, GameObject oldTransform, int doorAccessLevel);
public delegate void SequenceEvent(GameObject doorWingOldTransformToOpen, int accessLevel, int playerPoints);
public event TriggerEvent onDoorTriggerEnterEvent;
public event TriggerEvent onDoorTriggerExitEvent;
public event SequenceEvent onDoorOpenSequenceEvent;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/403251.html
標籤:
上一篇:Unity3d克隆太多
