按下按钮时执行功能(unity3d / C#)

时间:2017-07-07 07:38:29

标签: c# unity3d

基本上,我尝试做的是按Z键 - 它执行旋转功能,X - 它执行停止旋转的功能。之前,我有完美的UI按钮,现在我尝试按钮按钮但没有任何反应。

另外,如果您可以建议如何让它开始旋转并停止旋转,只需按下" Space"按钮,那很棒。

到目前为止我的代码:

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

感谢。

2 个答案:

答案 0 :(得分:1)

执行array时,您的输入逻辑仅执行一次。

将它放在Start()方法中以检查每一帧。

在这种情况下,删除协同程序并将其逻辑(不带Update() - 循环)放入while方法中。

Update()

Further reading

答案 1 :(得分:1)

您的代码中只有两个问题:

1 。检查Start()功能中的按键。

Start()将被调用一次,而Update()函数将在每帧调用。

您需要使用Update()函数每帧不断轮询输入。

2 。使用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;
        }
    }
}
  

另外,如果您可以建议如何让它开始旋转和停止   只按#&#34; Space&#34;按钮,那很棒

您可以使用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();
    }
}