2017-09-10 128 views
0

我已经重写Unity的零参数事件类,以便在调用自定义事件时返回string参数。该参数只是按下的键的代码。带参数的定制Unity事件

但是,当我试图包含返回的键代码的字符串转换时,我收到一条错误消息,说明键代码在当前上下文中不存在。

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

在下面的第一个片段中,"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

这是一个变量的范围和寿命问题

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活得长,你需要在循环之前声明一下:在你的循环,无论是在支架内产生的情况下,最近开brackt上方和匹配闭架之间的生活或者在循环中调用事件(更好)。

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()); 
      } 
     } 
    } 
} 
+0

非常感谢您的详细解释和帮助。 – Joshua