2016-08-24 41 views
0

我在下面的代碼中遇到了問題。它的功能是建立一條路線,一個接一個。C#IEnumerator不可更改

currentLength = Random.Range(maxFloorLength - 2, maxFloorLength); 
    List<GameObject> tempList = new List<GameObject>(); 

    for (int i = 0; i < currentLength; ++i) 
    { 
     foreach (GameObject g in pooledFloor) 
     { 
      if (!g.activeInHierarchy) 
      { 
       g.SetActive(true); 
       g.transform.position = startPoint + buildDirection * i; 
       g.transform.DOScaleY(5, 0.25f).Play(); 
       lastFloorPositions.Add(g.transform.position); 
       tempList.Add(g); 
       break; 
      } 
     } 
     yield return new WaitForSeconds(0.05f); 
    } 

雖然這正常工作,當我將其更改爲:

currentLength = Random.Range(maxFloorLength - 2, maxFloorLength); 
    List<GameObject> tempList = new List<GameObject>(); 

    for (int i = 0; i < currentLength; ++i) 
    { 
     foreach (GameObject g in pooledFloor) 
     { 
      if (!g.activeInHierarchy) 
      { 
       g.transform.position = startPoint + buildDirection * i; 
       lastFloorPositions.Add(g.transform.position); 
       tempList.Add(g); 
       break; 
      } 
     } 
    } 

    foreach (GameObject g in tempList) 
    { 
     g.SetActive(true); 
     g.transform.DOScaleY(5, 0.25f).Play(); 
     yield return new WaitForSeconds(0.05f); 
    } 

它是所有創造之路的一個部分(就是那個應該是tempList列表的末尾)。我想要的是該腳本將所有預製件添加到列表中,然後再與他們一起做其他事情,所以我可以在兩者之間添加一些內容。我試圖將其更改爲void函數,並將這些代碼作爲ienumerator調用,更改循環類型等,但似乎沒有任何工作,我不知道爲什麼它不起作用。我使用Debug.Log檢查了它是否仍然發現超過1個預製,並且它確實存在,但它只激活並擴展其中的一個。我敢打賭,它的東西很明顯,但我就是不能看到它:/

如何看起來:

How its working

那應該怎麼看:

How it should look

忘了提及 - IEnumerator內部的所有內容

+0

不知道,但也許你可以/應該問這http://gamedev.stackexchange.com/? –

+0

第一回合是嵌套的,第二回合不是。嘗試: –

+0

@Kuniq檢查我的答案 –

回答

2

在第一個代碼,當你調用g.SetActive(true);,在for循環的下一次迭代的if條件相同的對象不會是真實的,因此將評估爲下一個不活動的對象,並將其添加到tempList

在第二種情況下,對於for loop的所有迭代,它始終對同一對象g(pooledFloor上的第一個非活動對象)進行評估,因爲它未被激活。

爲了達到預期的行爲,我建議您在pooledFloor上使用for-loop而不是for-each,並在列表中的對象從列表中移除,如果它不活動。

是這樣的:

for (int i = 0; i < currentLength; ++i) 
{ 
    for (int j = 0; j < pooledFloor.Count; j++) 
    { 
     GameObject g = pooledFloor[j]; 
     if (!g.activeInHierarchy) 
     { 
      g.transform.position = startPoint + buildDirection * i; 
      lastFloorPositions.Add(g.transform.position); 
      tempList.Add(g); 
      pooledFloor.Remove(g); // Removing it from list would solve the problem. 
      break; 
     } 
    } 
} 
+0

從列表中刪除是肯定的好表現 - 方向(我猜),但主要問題是你提到的 - 我沒有打開遊戲對象,然後在未來的迭代中發現相同的對象一次又一次,所以我做了什麼,我只是將SetActive從底部循環移到了頂部,然後在底部循環中啓用了Renderer組件。這幾乎解決了所有問題^^非常感謝:)我只知道這件事很簡單 – Kuniq

+0

我很樂意提供幫助。請接受我的回答是正確的 –

0

第一遍是嵌套的,第二遍是不是。嘗試:它

for (int i = 0; i<currentLength; ++i) 
{ 
    foreach (GameObject g in tempList) 
    { 
     g.SetActive(true); 
     g.transform.DOScaleY(5, 0.25f).Play(); 
    } 
    yield return new WaitForSeconds(0.05f); 

} 
0

這樣想:

public void passONE() 
    { 
     currentLength = Random.Range(maxFloorLength - 2, maxFloorLength); 
     List<GameObject> tempList = new List<GameObject>(); 

     for (int i = 0; i < currentLength; ++i) 
     { 
      foreach (GameObject g in pooledFloor) 
      { 
       if (!g.activeInHierarchy) 
       { 
        g.transform.position = startPoint + buildDirection * i; 
        lastFloorPositions.Add(g.transform.position); 
        tempList.Add(g); 
        break; 
       } 
      } 
     } 
     passTwo(currentLength, tempList); 

    } 
    private void passTwo(double currentLength,List<GameObject> tempList) 
    { 


     for (int i = 0; i < currentLength; ++i) 
     { 
      foreach (GameObject g in tempList) 
      { 
       g.SetActive(true); 
       g.transform.DOScaleY(5, 0.25f).Play(); 

      } 
      yield return new WaitForSeconds(0.05f); 
     } 


    }