2017-04-05 49 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