2013-10-03 2 views
2

Я хочу создать загрузочную панель в единстве 2-й игре, создавая 7 кубов каждую секунду. я использовал: yield WaitForSeconds(1); в обновлении функции после каждого экземпляра заявления, но не получилось: ((я получил ошибку, которая:как подождать определенное количество секунд в единстве

Script ошибка:. Update() не может быть сопрограммная

?

Любой другая идея

Я сделал новую сцену и назвал его «потерять», то я написал этот сценарий, и прикрепил его к основной камере:

#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); 
} 

enter image description here

Я хочу эти кубы появляться после того, как друг с другом на 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; 
} 
+0

насчет invokerepeating: HTTP: //docs.unity3d.com/Documentation/ScriptReference/MonoBehaviour.InvokeRepeating.html – vaibhav

ответ

12

Прежде всего, вы не можете использовать выход 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 синтаксис объявлений переменных.

+0

Я обновил мой вопрос: ((((( – Akari

+1

Ответ также обновлен .. :))) Логика - это то же самое, что и изменение синтаксиса в javascript. – Nick

+1

: Большое спасибо за помощь ur .. но вчера я решил свою проблему, прежде чем я увижу обновление ur ... Я обновил мой вопрос и добавил мой ответ ,, Спасибо большое :) – Akari

1

Вы не можете изменить тип возвращаемого значения существующего метода. Вместо этого вы захотите запустить StartCoroutine в методах Start или Awake и определите свой IEnumerator как отдельную частную функцию вашего MonoBehaviour.

1

Ну, если вы настаиваете на необходимости использовать функцию обновления, вы можете. Вот один пример того, как сделать это:

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; 
     } 
    } 
} 
Смежные вопросы