执行按钮按钮(unity3d/C#)
基本上,我想要做的是当按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;
}
}
}
感谢。
有你的代码只是两个问题:
.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();
}
}
'输入。GetKey()'不能每帧返回多次。 –
我不知道如何说出正确的。我的意思是说,它会在多个**帧中返回“true”,直到它被释放,导致代码执行多次。单次按键可以使其运行多次。 – Programmer
这是正确的措辞。但是,有时你想要的行为(例如自动枪) –
执行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)
}
}
}
的飞杰微调趋势也太过分了...... – Hellium