不允许在我的if语句中使用waitforseconds?

时间:2015-05-15 23:57:51

标签: c# unity3d wait

我目前正在为我的游戏玩一些动画,但我遇到了一个似乎无法找到解决方案的问题。我要做的是让我的脚本在继续之前等待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++;
        }

2 个答案:

答案 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中处理异步性非常糟糕。异步操作的枚举器只是一个黑客,很难弄清楚并使用它。我希望有一天我们会在引擎中看到基于TaskIObservable的异步性......

答案 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
    }

}

}