我有三个GUI按钮用于游戏中的某些操作。玩家可以向Hostage Taker展示Empathy,Pity或Tough Love来操纵它们。我打算做的是按Empathy的GUI按钮,例如,让它引发一个“OnEmpathy”事件。然后,此OnEmpathy事件将通知每个HostageTaker类玩家已显示Empathy,并且他们会做出相应的反应。现在,对于一些代码示例。
public class HostageTaker {
public void OnEnable()
{
ButtonHandler.OnEmpathy += this.EmpathyControl; //This statement here is where EmpathyControl SHOULD subscribe to the OnEmpathy event.
MonoBehaviour.print("Debug");
}
public void EmpathyControl()
{
//Game related actions here
}
一旦HostageTaker进入某个级别,“OnEnable”事件会立即触发,因此我认为会发生的事情是,只要HostageTaker被添加到某个级别,它们就会自动订阅OnEmpathy事件使用此行:ButtonHandler.OnEmpathy += this.EmpathyControl;
现在,ButtonHandler脚本:
public class ButtonHandler : NegotiationControls {
public delegate void EmpathyCall();
public static event EmpathyCall OnEmpathy;
public void OnMouseDown()
{
if (this.name == "Empathy" && OnEmpathy != null) //Button identification & null event check.
{
print("Empathy Called.");
OnEmpathy();
}
else if(this.name == "Pity")
{
print("Pity Called.");
}
else if(this.name == "Tough Love")
{
print("Tough Love Called.");
}
else
{
print("Call error. Cannot identify button or OnEmpathy is Null.");
}
}
现在,此时,EmpathyControl()应该在Button Handler脚本中订阅OnEmpathy。我计划实现一些实际的事件参数,这样我就不必使用字符串手动识别每个按钮,但是现在,它可以工作。可惜和艰难的爱似乎按照我的预期触发了他们的Debug打印语句,但Empathy不会触发,而是诉诸于else条件。
这自然意味着OnEmpathy为null。唯一的问题是,为什么?我已经在ButtonHandler脚本中订阅了EmpathyControl方法,并且我确实在TestLevel脚本中实例化了一个HostageTaker,该脚本在第一级启动时立即运行。唯一的问题是TestLevel唯一的HostageTaker似乎没有正确订阅OnEmpathy。
LevelTest脚本:
public class LevelTest1 : MonoBehaviour {
public HostageTaker HT1 = new HostageTaker();
void Start ()
{
HT1.customName = "Debug";
}
答案 0 :(得分:0)
由于OnEmpathy为null,条件不一定是假的,也许对象名称不是" Empathy"。当你可以排除这种情况时,你可以从这里开始一个最小的工作状态:
生产者组件
using UnityEngine;
public class EventProducer : MonoBehaviour
{
public static event System.Action theEvent;
void OnGUI()
{
if (theEvent != null && GUILayout.Button("Raise event"))
theEvent.Invoke();
}
}
消费者组件
using UnityEngine;
public class EventConsumer : MonoBehaviour
{
void OnEnable()
{
EventProducer.theEvent += OnEvent;
}
void OnEvent()
{
Debug.Log("event received!");
}
}