2017-07-07 3 views
-1

Grundsätzlich, was ich versuche zu tun ist, wenn Sie Z drücken - es führt Funktion zu drehen, und X - es führt Funktion aus, um zu stoppen. Zuvor hatte ich UI-Tasten, die einwandfrei funktionierten, jetzt versuche ich es per Knopfdruck, aber nichts passiert.Execute Funktion auf Knopfdruck (unity3d/C#)

Auch, wenn Sie vorschlagen können, wie es anfangen zu drehen und aufhören zu drehen, nur durch Drücken der "Leertaste", das wäre toll.

Heres mein Code so weit:

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

public class spin : MonoBehaviour 
{ 
    public float speed = 500f; 
    public Button starter; 
    public Button stopper; 
    bool isSpinning = false; 

    IEnumerator spinnerCoroutine; 

    void Start() 
    { 
     //The spin function 
     spinnerCoroutine = spinCOR(); 

     //Button btn = starter.GetComponent<Button>(); 
     //Button butn = stopper.GetComponent<Button>(); 

     //butn.onClick.AddListener(FidgetSpinnerStop); 
     //btn.onClick.AddListener(FidgetSpinnerStart); 


     if (Input.GetKey(KeyCode.Z)) { 

      FidgetSpinnerStart(); 
     } 

     if (Input.GetKey(KeyCode.X)) { 
      FidgetSpinnerStop(); 
     } 
    } 

    IEnumerator spinCOR() 
    { 
     //Spin forever untill FidgetSpinnerStop is called 
     while (true) 
     { 
      transform.Rotate(Vector3.up, speed * Time.deltaTime); 
      //Wait for the next frame 
      yield return null; 
     } 
    } 

    void FidgetSpinnerStart() 
    { 
     //Spin only if it is not spinning 
     if (!isSpinning) 
     { 
      isSpinning = true; 
      StartCoroutine(spinnerCoroutine); 
     } 
    } 

    void FidgetSpinnerStop() 
    { 
     //Stop Spinning only if it is already spinning 
     if (isSpinning) 
     { 
      StopCoroutine(spinnerCoroutine); 
      isSpinning = false; 
     } 
    } 
} 

Dank.

+1

Der Fidget Spinner Trend ...... – Hellium

Antwort

1

Es gibt nur zwei Probleme in Ihrem Code:

die keypress in der Start() Funktion .Checking.

Die Start() wird einmal aufgerufen, während die Update() Funktion wird jedes Bild aufgerufen.

Sie müssen die Update() Funktion verwenden, um die Eingabe bei jedem Frame ständig abzufragen.

.Using Input.GetKey() Funktion für keypress zu überprüfen.

Die Funktion Input.GetKey() kann mehrmals über mehrere Frames hinweg true zurückgeben. Auch wenn Sie möglicherweise keine Probleme sehen, liegt das daran, dass die Variable isSpinning mögliche Probleme verhindert, aber Sie werden Probleme bekommen, wenn Sie mehr Code direkt in den Code einfügen möchten, da dieser Code mehrmals in einem Frame ausgeführt wird.

Sie müssen die Input.GetKeyDown() Funktion verwenden.

public class spin : MonoBehaviour 
{ 
    public float speed = 500f; 
    public Button starter; 
    public Button stopper; 
    bool isSpinning = false; 

    IEnumerator spinnerCoroutine; 

    void Start() 
    { 
     spinnerCoroutine = spinCOR(); 
    } 

    void Update() 
    {  
     if (Input.GetKeyDown(KeyCode.Z)) { 

      FidgetSpinnerStart(); 
     } 

     if (Input.GetKeyDown(KeyCode.X)) { 
      FidgetSpinnerStop(); 
     } 
    } 

    IEnumerator spinCOR() 
    { 
     //Spin forever until FidgetSpinnerStop is called 
     while (true) 
     { 
      transform.Rotate(Vector3.up, speed * Time.deltaTime); 
      //Wait for the next frame 
      yield return null; 
     } 
    } 

    void FidgetSpinnerStart() 
    { 
     //Spin only if it is not spinning 
     if (!isSpinning) 
     { 
      isSpinning = true; 
      StartCoroutine(spinnerCoroutine); 
     } 
    } 

    void FidgetSpinnerStop() 
    { 
     //Stop Spinning only if it is already spinning 
     if (isSpinning) 
     { 
      StopCoroutine(spinnerCoroutine); 
      isSpinning = false; 
     } 
    } 
} 

Auch, wenn Sie auf vorschlagen kann, wie es Spinnen zu machen beginnen und Spinn zu stoppen, indem nur „Space“ Taste drücken, das wäre

Sie groß machen kann, dass mit KeyCode.Space. Überprüfen Sie, ob die Leertaste gedrückt wurde, und überprüfen Sie dann die Variable isSpinning, bevor Sie die Coroutine starten/stoppen.

Ersetzen Sie einfach die Update Funktion oben mit dem unten:

void Update() 
{ 
    //Start if Space-key is pressed AND is not Spinning 
    if (Input.GetKeyDown(KeyCode.Space) && !isSpinning) 
    { 
     FidgetSpinnerStart(); 
    } 

    //Stop if Space-key is pressed AND is already Spinning 
    else if (Input.GetKeyDown(KeyCode.Space) && isSpinning) 
    { 
     FidgetSpinnerStop(); 
    } 
} 
+0

'Eingang geht zu weit.GetKey() 'kann nicht mehrmals pro Frame true zurückgeben. –

+0

Ich weiß nicht, wie ich das richtig schreiben soll. Was ich sagen wollte, ist, dass es "wahr" über ** viele ** Frames zurückgibt, bis es veröffentlicht wird, wodurch der Code mehrmals ausgeführt wird. Ein einzelner Tastendruck kann dazu führen, dass mehr als einmal ausgeführt wird. – Programmer

+0

Das ist die richtige Formulierung. Aber manchmal wollen Sie dieses Verhalten (automatische Pistole zum Beispiel) –

1

Ihre Eingangslogik wird nur einmal ausgeführt, wenn Start() ausgeführt wird.

Setzen Sie es in die Update() Methode, um es für jeden Rahmen zu überprüfen.

In diesem Fall die Coroutine entfernen und ihre Logik (ohne while -loop) ebenfalls in die Update() Methode schreiben.

public class spin : MonoBehaviour 
{ 
    [SerializeField] 
    private float speed = 500f; 

    [SerializeField] 
    private Button starter; 

    [SerializeField] 
    private Button stopper; 

    [SerializeField] 
    bool isSpinning = false; 

    void Update() 
    {  
     if (Input.GetKeyDown(KeyCode.Z)) 
     { 
      isSpinning = true ; 
     } 

     if (Input.GetKeyDown(KeyCode.X)) 
     { 
      isSpinning = false ; 
     } 

     if(isSpinning) 
     { 
      transform.Rotate(Vector3.up, speed * Time.deltaTime) 
     } 
    } 
} 

Further reading