2017-04-05 46 views
-1
void CreateCubesBesideWaypoints() 
    { 
     const int lightCount = 20; 
     Vector3[] lightPositions = new Vector3[lightCount]; 

     for (int i = 0; i < waypoints.Length - 1; i++) 
     { 
      posToChunkDistances(waypoints[i].transform.position, waypoints[waypoints.Length - 1].transform.position, lightPositions, lightCount); 
      for (int x = 0; x < lightPositions.Length; x++) 
      { 
       lightPrefab.GetComponent<Renderer>().material.color = Color.red; 
       GameObject cloneLightPrefab = Instantiate(lightPrefab, lightPositions[x], Quaternion.identity); 
       cloneLightPrefab.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); 
       cloneLightPrefab.tag = "LightPrefab"; 
       //cloneLightPrefab.transform.SetParent(lightPrefab.transform); 
      } 
     } 
    } 

這種方式工作正常。但如果我使用該行:爲什麼當我克隆/複製gameobject內存使用率達到98%?

cloneLightPrefab.transform.SetParent(lightPrefab.transform); 

然後內存使用率達到98%,我需要重新啓動電腦。 lightPrefab是一個立方體遊戲對象,我拖動到這個腳本。 而我想要做的是將所有新的cloneLightPrefab gameobjects放在lightPrefab下作爲孩子。

和子問題,在上線內環:

for (int x = 0; x < lightPositions.Length; x++) 

我應該將其更改爲:

for (int x = 0; x < lightPositions.Length - 1; x++) 
+0

lightPrefab.GetComponent ().material.color = Color.red;多次打電話...您可以移動它。 –

回答

3

有這麼多的問題,在你的代碼,所以這個答案將是長期的。

。首先,你不需要外部循環:for (int i = 0; i < waypoints.Length - 1; i++)。請刪除。這不包括在我最後的答案中,我不知道爲什麼你在那裏添加它。這會增加您在循環中花費的時間。

。您在修改預製件時lightPrefab.GetComponent<Renderer>().material.color = Color.red;您應該修改克隆的對象。 cloneLightPrefab.GetComponent<Renderer>().material.color = Color.red;

。不要將實例化對象的父對象設置爲預製。這就是你在用cloneLightPrefab.transform.SetParent(lightPrefab.transform);所做的事情。

創建一個空的GameObject,然後將其用作您實例化的所有燈對象的父項。 GameObject parentObject = new GameObject("LightParentObj");然後cloneLightPrefab.transform.SetParent(parentObject.transform);

如果您還不知道,請看一下this的帖子,瞭解如何創建預製件。

你固定的代碼看起來應該更像是這樣的:

void CreateCubesBesideWaypoints() 
{ 
    const int lightCount = 20; 
    Vector3[] lightPositions = new Vector3[lightCount]; 

    posToChunkDistances(waypoints[0].transform.position, waypoints[waypoints.Length - 1].transform.position, lightPositions, lightCount); 
    GameObject parentObject = new GameObject("LightParentObj"); 
    for (int x = 0; x < lightPositions.Length; x++) 
    { 
     GameObject cloneLightPrefab = Instantiate(lightPrefab, lightPositions[x], Quaternion.identity); 
     cloneLightPrefab.GetComponent<Renderer>().material.color = Color.red; 
     cloneLightPrefab.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); 
     cloneLightPrefab.tag = "LightPrefab"; 
     cloneLightPrefab.transform.SetParent(parentObject.transform); 
    } 
} 

我應該將其更改爲:爲(INT X = 0; X < lightPositions.Length - 1; X ++)

如果您有for (int x = 0; x < lightPositions.Length; x++), ,則循環從0開始並以lightPositions.Length - 1結束。

如果將其更改爲for (int x = 0; x < lightPositions.Length - 1; x++),則循環將從0開始並以lightPositions.Length - 2結束。基本上,循環不會循環遍歷數組中的所有項目。

在你繼續編碼之前,我認爲你應該在谷歌上理解for循環,並在C#中使用數組。這是你必須知道的必須的基本的東西之一。

注意

其中的時候,可能會比較好用for (int x = 0; x < lightPositions.Length - 1; x++)的是,當你使用<=而不是<。例如,for (int x = 0; x <= lightPositions.Length - 1; x++)。在這種情況下,循環仍然會遍歷數組中的所有項目。

+0

我做外環的原因是因爲如果我會做:posToChunkDistances(waypoints [0] .transform.position,waypoints [waypoints.Length - 1] .transform.position,lightPositions,lightCount);它只會將立方體放在一個航點上。但在航點我有更多的一個航點。這就是爲什麼我在for(int i = 0; i

+0

不是。航點從'0'索引開始,以'waypoints.Length - 1'結尾。 'posToChunkDistances'函數有兩個位置:1.位置的起點是'waypoints [0] .transform.position'。 2,'waypoints.Length - 1'的位置結束。如果你通過這兩個位置,它會在這兩個位置之間產生點數。這些點的距離將是平等的,這就是你想要的。 – Programmer

+0

它會將生成的均勻點存儲在'lightPositions'數組變量中。我們循環並實例化每個位置上的光。我不直接循環「航點」的主要原因是因爲我們不確定這些線是否均勻地創建。我們也無法控制應該生成多少點。 – Programmer