2017-09-10 4 views
0

私は、カスタマイズされたイベントが呼び出されたときにstringパラメータを返すことができるように、Unityの引数のないイベントクラスをオーバーライドしました。このパラメータは、単に押されたキーのコードです。パラメータ付きのカスタマイズされたUnityイベント

しかし、返されたキーコードの文字列キャストを含めると、キーコードが現在のコンテキストに存在しないというエラーメッセージが表示されます。

なぜ認識されないのか、私のイベントで文字列の値を返せない理由が混乱しています。誰かが私が間違ってやっていることを理解するのを助けてくれますか、ここでどのように目標を達成できるのでしょうか?下記の最初のスニペットで

"My event arg"は私が... (String)kCodeまたは kCode.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を定義してください。だから、あなたはあなたのKCODEはあなたがループの前にそれを宣言する必要が長生きしたい場合

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

:ブラケット内に作成されたものは何でもあなたのループの場合には、上記最も近い開口部の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

関連する問題