2013-05-01 42 views
1

我已經遇到這個小問題,我似乎不能完全理解怎麼解決,我試圖改變我的代碼無數次,但我還沒有得到任何地方:(如何阻止GameObjects在每一幀重新渲染?

我創建的遊戲對象編程工作正常,但問題是,遊戲創造每幀(不正是我想要的)一次的對象!所以,我已經把10秒的時間延遲,但它似乎沒有正常工作。

public Vector3 spawnLocation; 
public GameObject myCube; 

// Use this for initialization 
void Start() { 

    if (myCube.renderer.enabled == false) { 
     Debug.Log("myCube not rendered"); 
     myCube = GameObject.CreatePrimitive(PrimitiveType.Cube); 
    } 
    if (myCube == null) { 
     Debug.Log("myCube not set"); 
     myCube = GameObject.CreatePrimitive(PrimitiveType.Cube); 
    } 
} 

// Update is called once per frame 
void Update() { 
    StartCoroutine(Delay()); 
    Destroy(myCube, 5); 
    CreateCube(); 
} 

void CreateCube() { 

    spawnLocation = new Vector3(24, 17, -28); 
    StartCoroutine(Delay()); 
    Instantiate(myCube, spawnLocation, Quaternion.identity); 
} 

IEnumerator Delay(){ 
    yield return new WaitForSeconds(10); 
} 

的對象在每一幀-_-

任何人都可以請幫點m出現不休e在正確的方向去哪裏。 有沒有更好的方法來實現這一目標?

+3

你調用'CreateCube()'每次遊戲循環。把它放在'Start()'中。 – David 2013-05-01 19:52:06

+0

@大衛我試過了,但如果我把'CreateCube()''中開始()'它僅創建遊戲對象一次!我想不停地創建'myCube',但是需要一定的時間間隔。 – Ange 2013-05-01 20:08:15

+1

// Update()每幀調用一次。如果你是新手,直到你學習如何實現一個事件模式或者你會遇到噩夢,那就避免使用它。 – 2013-05-01 20:18:55

回答

3

我已經放了10秒的時間延遲,但它似乎沒有正常工作 。

延遲工作,但你仍然在實例更新裏面的多維數據集。 如果你想實例化一個魔方每10秒你CAND做到以下幾點:

IEnumerator DelayCreateCube(float delay){ 

    while(true) 
    { 
     yield return new WaitForSeconds(10); 
     Instantiate(myCube, spawnLocation, Quaternion.identity); 
    } 

} 

public void Start() 
{ 
    StartCoroutine(DelayCreateCube()); 
} 

協同程序由發動機在每一幀(當然,這取決於協程)通常(至少在你的情況下)執行立即在所有GameObjects的所有Update方法都被調用之後。

當您使用StartCoroutine,它只是調度協程以後執行的,所以它不會阻止Update方法的執行:將更新方法之後,纔會執行

StartCoroutine(Delay()); 
Destroy(myCube, 5); 
CreateCube(); 
上面 Delay代碼

已經返回,所以你實際上並沒有推遲執行DestroyCreateCube方法。

對於協同程序的更詳細的描述,看看這個article


編輯

只是一個額外的考慮。我不確切知道你在做什麼,但是你似乎想要在同一個位置創建和銷燬一個原語。如果你沒有足夠的理由這樣做,你可以簡單地使用enable/disable這個對象,而不是創建一個新對象並再次銷燬它(用於演出)。

+0

您是否打算在'Start()'中調用'DelayCreateCube(delay)'? – Ange 2013-05-01 20:18:31

+0

@Kap:是的,我的錯:)。我修好了它。 – Heisenbug 2013-05-01 20:24:29

+0

我試圖創建一個原語,然後在幾秒後將其銷燬並重復相同的操作。經過一段時間後,我希望能夠以3-5秒的間隔同時創建2個或更多的基元。 – Ange 2013-05-01 20:43:46

1

顯然其他人也指出,要創建一個立方體每一次更新()被調用,這是一次遊戲循環的事實。假設你只想在偶數的時間間隔內創建對象,例如每X秒一次,您應該考慮使用協程或調用重複。協程解決方案已經得到了解決,InvokeRepeating在下面給出:

void Start() 
{ 
    InvokeRepeating("CreateCube", 1.0f, 1.0f); 
} 

void CreateCube() 
{ 
    // create your cube here 
} 
+0

+1:很高興知道,我不知道,可能使用引擎中已經實現的協同程序比寫作更快你自己的代碼,謝謝 – Heisenbug 2013-05-04 08:54:46