带参数的自定义Unity事件

时间:2017-09-10 09:19:28

标签: c# events unity3d

我已经覆盖了Unity的零参数事件类,因此我可以在调用自定义事件时返回string参数。此参数只是按下的键的代码。

但是,当我尝试包含返回的密钥代码的字符串强制转换时,我收到一条错误消息,指出当前上下文中不存在密钥代码。

我很困惑为什么它不被识别,为什么我不能用我的事件返回它的字符串值。有人可以帮我理解我做错了什么以及如何在这里实现我的目标?

在下面的第一个代码段中,"My event arg"当然会随我的活动一起返回并打印到控制台,但当我将其替换为(String)kCodekCode.ToString时,kCode }本身无法识别......

public class EventScript : MonoBehaviour
{
    [Serializable]
    public class RadioEvent : UnityEvent<string> { }
    public RadioEvent OnRadioClicked = new RadioEvent();


    void Update()
    {
        if (Input.anyKeyDown)
        {
            foreach(KeyCode kCode in Enum.GetValues(typeof(KeyCode)) )
            {
                if (Input.GetKeyDown(kCode) )
                    Debug.Log("KeyCode = " + kCode);
            }

            OnRadioClicked.Invoke("My event arg");
        }
    }
}


public class RadioManager : MonoBehaviour
{
    private EventScript _eventScript;


    void Awake()
    {
        _eventScript = GetComponentInChildren<EventScript>();
    }


    void Start()
    {
        _eventScript.OnRadioClicked.AddListener(MyEventHandler);
    }


    void OnDestroy()
    {
        _eventScript.OnRadioClicked.RemoveListener(MyEventHandler);
    }


    void MyEventHandler(string name)
    {
        Debug.Log("My event handled with " + name);
    }
}

1 个答案:

答案 0 :(得分:1)

这是变量

的范围和生命周期问题
void Update()
{
    if (Input.anyKeyDown)
    {
        foreach(KeyCode kCode in Enum.GetValues(typeof(KeyCode)) ) // kCode is created
        {
            if (Input.GetKeyDown(kCode) )
                Debug.Log("KeyCode = " + kCode);
        } kCode is removed from stack
        kCode is no longer known to the compiler
        OnRadioClicked.Invoke("My event arg");
    }
}

参见{}定义变量的lfi。对于您的循环,在括号内创建的任何内容都位于上方最近的开口包围和匹配的右括号之间:

{
    var myVar = 1;
    { 
       var otherVar = 2;
    }
    myVar = 3; // this is ok but otherVar is no longer visible
}
myVar =  4; // Error

因此,如果你想让你的kCode更长寿,你需要在循环之前声明它或在循环中调用事件(更好)。

void Update()
{
    if (Input.anyKeyDown)
    {
        foreach(KeyCode kCode in Enum.GetValues(typeof(KeyCode)) )
        {
            if (Input.GetKeyDown(kCode) ){
                Debug.Log("KeyCode = " + kCode);
                OnRadioClicked.Invoke(kCode.ToString());
            }
        }
    }
}