按按钮执行功能(unity3d/C#)
基本上,我想做的是当按下Z键时,它执行函数旋转,而X键执行函数停止旋转。以前,我的UI按钮工作得非常好,现在我试着用按钮来做,但什么也没发生 另外,如果你能建议如何只按“空格”键就让它开始旋转和停止旋转,那就太好了 以下是我目前的代码:按按钮执行功能(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
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()。干杯