我目前正在为我的游戏玩一些动画,但我遇到了一个似乎无法找到解决方案的问题。我要做的是让我的脚本在继续之前等待0.05秒。
我尝试了threadsleep
,但效果不佳。我被告知这种情况并不理想,所以现在我正在尝试waitforseconds
,我根本无法工作。
public class AttackMoves : MonoBehaviour {
int belastende = 0;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown("j"))
{
print("HighAttack1 Initiated");
belastende++;
if(belastende=1) // Begynd tilbagesving
{
transform.Rotate(0, 0, -25); // Vil have sværet til at svinge tilbage til z-125 --> wait 0.1s --> rotate lidt mere
yield WaitForSeconds (0.05);
belastende++;
}
if(belastende=2)
{
transform.Rotate(0, 0, -25); // Vil have sværet til at svinge tilbage til z-125 --> wait 0.1s --> rotate lidt mere
yield WaitForSeconds (0.05);
belastende++;
}
if(belastende=3)
{
transform.Rotate(0, 0, -25); // Vil have sværet til at svinge tilbage til z-125 --> wait 0.1s --> rotate lidt mere
yield WaitForSeconds (0.05);
belastende++;
}
答案 0 :(得分:0)
如果要使用收益率返回,则更新方法的返回类型必须为IEnumerator
。
// Update is called once per frame
IEnumerator Update () {
if (Input.GetKeyDown("j"))
{
print("HighAttack1 Initiated");
belastende++;
if(belastende=1) // Begynd tilbagesving
{
transform.Rotate(0, 0, -25); // Vil have sværet til at svinge tilbage til z-125 --> wait 0.1s --> rotate lidt mere
yield return WaitForSeconds (0.05);
belastende++;
}
...
}
顺便说一句,在Unity中处理异步性非常糟糕。异步操作的枚举器只是一个黑客,很难弄清楚并使用它。我希望有一天我们会在引擎中看到基于Task
或IObservable
的异步性......
答案 1 :(得分:0)
WaitForSeconds 仅适用于 coroutine 功能。要创建协程函数,请将void更改为IEnumerator。
yield return new WaifForSeconds
不 yield return.
另外,我注意到你做了一个新的程序员通常做的大问题。如果要比较值,则需要使用两个等号而不是一个。因此,请在if语句中将belastende = 1,belastende = 2 and belastende = 3
更改为 belastende == 1,belastende == 2,belastende ==3.
。
所以你的代码看起来像这样:
使用UnityEngine; 使用System.Collections;
公共类删除:MonoBehaviour {
int belastende = 0;
bool running = false;
// Use this for initialization
void Start ()
{
StartCoroutine (CheckInput ()); //Call the fucntion from the start
}
// Update is called once per frame
IEnumerator CheckInput ()
{
if (running) {
yield break;// If this is called again while already running, exit
} else {
running = true;
}
while (running) {
if (Input.GetKeyDown ("j")) {
print ("HighAttack1 Initiated");
belastende++;
if (belastende == 1) { // Begynd tilbagesving
transform.Rotate (0, 0, -25); // Vil have sværet til at svinge tilbage til z-125 --> wait 0.1s --> rotate lidt mere
yield return new WaitForSeconds (0.05f);
belastende++;
}
if (belastende == 2) {
transform.Rotate (0, 0, -25); // Vil have sværet til at svinge tilbage til z-125 --> wait 0.1s --> rotate lidt mere
yield return new WaitForSeconds (0.05f);
belastende++;
}
if (belastende == 3) {
transform.Rotate (0, 0, -25); // Vil have sværet til at svinge tilbage til z-125 --> wait 0.1s --> rotate lidt mere
yield return new WaitForSeconds (0.05f);
belastende++;
}
}
yield return null; //Wait so that unity doesnt freeze
}
}
}