Unity中的事件似乎没有订阅它的方法

时间:2015-09-26 21:47:02

标签: c# events unity3d

我有三个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";
}

1 个答案:

答案 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!");
    }
}