所以,我有一个对象。当我按下旋转按钮时,我希望它旋转。当我按下停止按钮时,我希望它停止。
它在 void Update 时运行良好,但在它自己的函数中时,它只执行一次。我尝试使用循环但仍然没有运气。谁能帮帮我?
C# 代码:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class spin : MonoBehaviour
{
public float speed = 500f;
public Button starter;
public Button stopper;
int testing = 200;
void Start () {
Button btn = starter.GetComponent<Button> ();
Button butn = stopper.GetComponent<Button> ();
butn.onClick.AddListener(FidgetSpinnerStop);
btn.onClick.AddListener(FidgetSpinnerStart);
}
void FidgetSpinnerStart ()
{
for (int i = 0; i < testing; i++) {
transform.Rotate (Vector3.up, speed * Time.deltaTime);
Debug.Log ("Test: " + i);
}
}
void FidgetSpinnerStop ()
{
transform.Rotate (Vector3.up, Time.deltaTime);
}
}
提前致谢!
最佳答案
for 循环没有按预期工作,因为您没有在等待帧。基本上,它会在一帧内完成所有的旋转,直到最后一次旋转你才会看到变化。等待一个帧可以用 yield return null;
完成,这需要协程函数。
这最好用协程来完成。您可以将 bool 变量与协程一起使用,也可以只使用 StartCoroutine
和 StopCoroutine
。单击开始按钮时启动旋转对象的协程,然后在单击停止按钮时停止协程。
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);
}
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;
}
}
关于c# - 按下按钮时的循环功能? Unity3d C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44791489/