2017-07-07 90 views
-1

基本上,我想要做的是當按Z - 它執行函數旋轉,X - 它執行函數停止旋轉。之前,我的UI按鈕工作得很好,現在我嘗試按按鈕,但沒有任何反應。執行按鈕按鈕(unity3d/C#)

此外,如果您可以建議如何通過只按「空格」按鈕來開始紡紗和停止紡紗,那就太好了。

繼承人到目前爲止我的代碼:

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; 
     } 
    } 
} 

感謝。

+1

的飛傑微調趨勢也太過分了...... – Hellium

回答

1

有你的代碼只是兩個問題:

.Checking在Start()功能的按鍵。

Start()將被調用一次,而Update()函數將被調用每一幀。

您需要使用Update()函數來持續輪詢每一幀的輸入。使用Input.GetKey()功能檢查按鍵。

Input.GetKey()函數可以在多個幀中多次返回true。儘管您現在可能沒有看到任何問題,但這是因爲isSpinning變量可以防止可能出現的問題,但如果您想在if (Input.GetKey(KeyCode.Z))代碼中直接添加更多代碼,則會遇到問題,因爲這些代碼將在一幀中執行多次。您需要使用Input.GetKeyDown()函數。

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; 
     } 
    } 
} 

而且,如果你能如何使它開始旋轉可以僅按「空格」鍵停止 紡紗建議,那簡直太好了

你可以做到這一點KeyCode.Space。檢查是否按下Space鍵,然後在開始/停止協程之前檢查變量isSpinning

只需更換上面與下面的一個Update功能:

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

'輸入。GetKey()'不能每幀返回多次。 –

+0

我不知道如何說出正確的。我的意思是說,它會在多個**幀中返回「true」,直到它被釋放,導致代碼執行多次。單次按鍵可以使其運行多次。 – Programmer

+0

這是正確的措辭。但是,有時你想要的行爲(例如自動槍) –

1

執行Start()時,您的輸入邏輯只執行一次。

把它放在Update()方法中檢查它的每一幀。

在這種情況下,請刪除協程並將其邏輯(不包括while環回)也放入Update()方法中。

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