【问题标题】:how to wait for a specific number of seconds in unity如何统一等待特定的秒数
【发布时间】:2017-09-03 08:58:56
【问题描述】:

我想通过每 1 秒实例化 7 个立方体来在统一 2d 游戏中制作一个加载条。 我用了 : yield WaitForSeconds(1); 在每个实例化语句之后的函数更新中,但它不起作用:((我收到一个错误:

脚本错误:Update() 不能是协程。

还有什么想法吗?

我制作了一个新场景并将其命名为“loose”,然后我编写了这个脚本并将其附加到主摄像机:

#pragma strict

//var loadingBar: Transform;
var loading_bar : GameObject;

function Update()
{
    Instantiate(loadingBar,Vector3(-1.849,-2.9371,2),Quaternion.identity);

    gameTimer();


    Instantiate(loadingBar,Vector3(-1.2909,-2.937,2),Quaternion.identity);

    gameTimer();

    Instantiate(loadingBar,Vector3(-0.5566,-2.93711,2),Quaternion.identity);

    gameTimer();

    Instantiate(loadingBar,Vector3(0.148236,-2.93711,2),Quaternion.identity);

    gameTimer();

    Instantiate(loadingBar,Vector3(0.823772,-2.93711,2),Quaternion.identity);

    gameTimer();

    Instantiate(loadingBar,Vector3(1.440567,-2.93711,2),Quaternion.identity);

    gameTimer();

    Instantiate(loadingBar,Vector3(2.057361,-2.93711,2),Quaternion.identity);

    loadingTimer();

    Application.LoadLevel(1);
}


function OnGUI()
{
    GUI.color = Color.green;
    GUI.Label(Rect(400,350,500,500),"<color=green><size=100>Lose</size></color>");
}

function loadingTimer()
{
    yield WaitForSeconds(1);
}

我希望这些立方体以 1 秒的间隔出现,所以它 看起来像一个加载栏...

我通过这种方式解决了这个问题 ::

#pragma strict

var loadingBar: Transform;
var finished : boolean = false;

function Update()
{
    loadingTimer();

    if (finished == true)
    {
        Application.LoadLevel(1);
        finished= false;
    }
}


function OnGUI()
{
    GUI.color = Color.green;
    GUI.Label(Rect(295,320,500,500),"<color=green><size=100>Lose</size></color>");

}


function loadingTimer()
{
    Instantiate(loadingBar,Vector3(-1.9,-2.9371,2),Quaternion.identity);
    yield WaitForSeconds(0.28);
    Instantiate(loadingBar,Vector3(-1.3,-2.937,2),Quaternion.identity);
    yield WaitForSeconds(0.28);
    Instantiate(loadingBar,Vector3(-1.3,-2.937,2),Quaternion.identity);
    yield WaitForSeconds(0.28);
    Instantiate(loadingBar,Vector3(-0.7,-2.93711,2),Quaternion.identity);
    yield WaitForSeconds(0.28);
    Instantiate(loadingBar,Vector3(-0.1,-2.93711,2),Quaternion.identity);
    yield WaitForSeconds(0.28);
    Instantiate(loadingBar,Vector3(0.5,-2.93711,2),Quaternion.identity);
    yield WaitForSeconds(0.28);
    Instantiate(loadingBar,Vector3(1.1,-2.93711,2),Quaternion.identity);
    yield WaitForSeconds(0.28);
    Instantiate(loadingBar,Vector3(1.7,-2.93711,2),Quaternion.identity);

    finished= true;
}

【问题讨论】:

标签: unity3d unityscript


【解决方案1】:

首先,不能在 Update 函数中使用 yield WaitForSeconds。你需要引入 IEnumator。在您的情况下,我可以说以下代码可能会对您有所帮助。

public class Loader : MonoBehaviour 
{
    public GameObject cube;
    private bool finished = false;
    private Vector3[] positions = new Vector3[7] {new Vector3(-1.849,-2.9371,2), new Vector3(-1.2909,-2.937,2), new Vector3(-0.5566,-2.93711,2),new Vector3(0.148236,-2.93711,2),new Vector3(0.823772,-2.93711,2),new Vector3(1.440567,-2.93711,2),new Vector3(2.057361,-2.93711,2)};
    private int loaderCounter=0;

    void Start () 
    {
        StartCoroutine(StartLoader());
    }

    IEnumerator StartLoader () 
    {
        Instantiate(cube,positions[loaderCounter],Quaternion.identity);
        yield return new WaitForSeconds(1);
        loaderCounter++;
        if(loaderCounter==7)
        {
            finished=true;
        }
        if(!finished)
        {
            StartCoroutine(StartLoader());
        }
        else
        {
            Application.LoadLevel(1);
        }
    }
}

如果之后有任何问题,请告诉我。只需使用变量声明的 javascript 语法。

【讨论】:

  • 答案也更新了.. :))) 逻辑相同,只需更改 javascript 中的语法即可。
  • :非常感谢您的帮助.. 但是昨天我在看到您的更新之前解决了我的问题...我已经更新了我的问题并添加了我的答案,非常感谢 :)
【解决方案2】:

如果你坚持要使用更新功能,你可以。这是一个如何做到这一点的例子:

private float _elapsedTime = 0;
private int counter = 0;
void Update(){
    if(counter < 7){
        if(_elapsedTime >= 1){
            _elapsedTime = 0; //reset it zero again
            _counter++;
            //instantiate the cube, and update the loading bar here
        }else{
            _elapsedTime += Time.deltaTime;
        }
    }
}

【讨论】:

    【解决方案3】:

    您不能更改现有方法的返回类型。相反,您需要在 Start 或 Awake 方法中触发 StartCoroutine,并将 IEnumerator 定义为 MonoBehaviour 的单独私有函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-02
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2020-02-02
      相关资源
      最近更新 更多