2017-07-07 31 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