2017-06-29 1 views
3

Ich habe versucht, Ereignisbehandlung für eine Spieleingabe zu verwenden. Wenn andere ähnliche Methoden verwenden, können sie der Delegate-Variablen ohne Fehler eine void-Funktion hinzufügen. Jedes Mal, wenn ich versuche, die Move() Funktion OnAxisChange hinzuzufügen, erhalte ich folgende Fehlermeldung:Wie verwende ich eine Void-Funktion mit Delegaten?

kann nicht implizit Typ ‚Leere‘ auf ‚CharacterView.InputAction‘ konvertieren

public class CharacterView : MonoBehaviour { 
    public delegate void InputAction(); 
    public static event InputAction OnAxisChange; 

    public Vector2 InputAxis 
    { 
     get 
     { 
      float x = Input.GetAxisRaw("Horizontal"); 
      float y = Input.GetAxisRaw("Vertical"); 
      return (new Vector2(x, y)); 
     } 
    } 

    private void Update() 
    { 

     Vector2 input = InputAxis; 
     if (input.x != 0 || input.y != 0) 
     { 
      if (OnAxisChange != null) 
      { 
       OnAxisChange(); 
      } 
     } 
    } 
} 

Das Folgende ist die Klasse, die das Ereignis behandelt.

Die Verwendung von Delegaten für die Ereignisbehandlung ist mir immer noch ein wenig fremd, also nehme ich an, dass ich etwas falsch verstehe.

+0

Anstatt eigene Delegierte zu erstellen, sollten Sie EventHandler verwenden. https://msdn.microsoft.com/en-us/library/system.eventhandler(v=vs.110).aspx –

+0

@RandRandom gibt es einen angeborenen Vorteil dafür? –

+0

Der einzige Vorteil bei der Verwendung von 'EventHandler' besteht darin, dass es die standardmäßige .NET-Ereignismuster-Signatur von 'Objekt-Absender, EventArgs e' erzwingt. Ansonsten ist es identisch mit der Verwendung von Standard-Delegaten. – Enigmativity

Antwort

3

Sie müssen () nach entfernen. So rufen Sie Ihre Methode auf und versuchen, den Rückgabetyp hinzuzufügen, der nichts ist. Ändern Sie es einfach zu den folgenden.

CharacterView.OnAxisChange += Move; 

CharacterView.OnAxisChange -= Move; 
+0

Wo haben Sie das Zitat "Event-Deklaration fügt eine Schicht von Schutz auf der Delegierten Instanz ..." und warum hast du es in die Antwort? Was hat das mit der Frage zu tun? – Enigmativity

+0

Und warum schlagen Sie vor, einen EventHandler anstelle eines Delegaten zu verwenden? Es ist immer noch ein Delegierter. – Enigmativity

+0

@Enigmatismus Ich habe es von einer anderen Frage und ich habe es eingefügt, weil er Delegaten als Event-Handler verwendet. EventHandler können nicht direkt wie ein Delegat zurückgesetzt werden. Oder stimmst du nicht zu? – NtFreX

Verwandte Themen