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

按按钮执行功能(unity3d/C#),c#,unity3d,C#,Unity3d,基本上,我想做的是当按下Z键时,它执行函数旋转,而X键执行函数停止旋转。以前,我的UI按钮工作得非常好,现在我试着用按钮来做,但什么也没发生 另外,如果你能建议如何只按“空格”键就让它开始旋转和停止旋转,那就太好了 以下是我目前的代码: using UnityEngine; using System.Collections; using UnityEngine.UI; public class spin : MonoBehaviour { public float speed = 50

基本上,我想做的是当按下Z键时,它执行函数旋转,而X键执行函数停止旋转。以前,我的UI按钮工作得非常好,现在我试着用按钮来做,但什么也没发生

另外,如果你能建议如何只按“空格”键就让它开始旋转和停止旋转,那就太好了

以下是我目前的代码:

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;
        }
    }
}
使用UnityEngine;
使用系统集合;
使用UnityEngine.UI;
公共阶层的自旋:单一行为
{
公共浮子速度=500f;
公共按钮启动器;
公共按钮塞;
bool-isspining=false;
IEnumerator喷丝板协同程序;
void Start()
{
//自旋函数
spinnerCoroutine=spinCOR();
//按钮btn=starter.GetComponent();
//Button butn=stopper.GetComponent();
//但是,onClick.AddListener(FidgetSpinnerStop);
//btn.onClick.AddListener(FidgetSpinnerStart);
if(Input.GetKey(KeyCode.Z)){
FidgetSpinnerStart();
}
if(Input.GetKey(KeyCode.X)){
FidgetSpinnerStop();
}
}
IEnumerator spinCOR()
{
//永远旋转直到调用FidgetSpinnerStop
while(true)
{
变换。旋转(矢量3.up,速度*时间。增量时间);
//等待下一帧
收益返回空;
}
}
void FidgetSpinnerStart()
{
//只有当它不旋转时才旋转
如果(!IsSpining)
{
IsSpining=true;
Start例程(spinnerCoroutine);
}
}
无效FidgetSpinnerStop()
{
//只有当它已经在旋转时才停止旋转
如果(IsSpining)
{
StopCorroutine(喷丝头Corroutine);
IsSpining=false;
}
}
}

谢谢。

当执行
Start()
时,您的输入逻辑只执行一次

将其放入
Update()
方法中,以便每帧检查一次

在这种情况下,删除协同程序并将其逻辑(不带
while
-loop)也放入
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)
        }
    }
}

代码中只有两个问题:

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

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;
        }
    }
}
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;
        }
    }
}
此外,如果你能建议如何使它开始旋转和停止 只需按“空格”键旋转,那就太好了

您可以使用
KeyCode.Space
来执行此操作。检查是否按下空格键,然后在启动/停止协同程序之前检查
IsSpining
变量

只需将上面的
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();
    }
}

Fidget微调器的趋势走得太远了……
Input.GetKey()
无法在每帧中多次返回true。我不知道如何正确表达。我想说的是,它将在许多帧上返回
true
,直到它被释放,导致代码执行多次。一次按键可以使它运行不止一次。这是正确的措辞。然而,有时候你想要那种行为(比如自动手枪)是的,我想,但是通过阅读OP的问题,那不是OP想要的行为。就是这样。这正是我想要和需要的。谢谢你的提示。这样做时忘记了Start()和Update()。干杯