C# 为什么当我克隆/复制游戏对象时,内存使用率会达到98%?

C# 为什么当我克隆/复制游戏对象时,内存使用率会达到98%?,c#,unity3d,unity5,C#,Unity3d,Unity5,然后内存使用率达到98%,我需要重新启动电脑。 LightPrefable是我拖到这个脚本中的一个立方体游戏对象。 我想做的是把所有新的CloneLightPrefable游戏对象作为孩子放在LightPrefable下 还有一个子问题,在这行的内部循环中: cloneLightPrefab.transform.SetParent(lightPrefab.transform); for(int x=0;x

然后内存使用率达到98%,我需要重新启动电脑。 LightPrefable是我拖到这个脚本中的一个立方体游戏对象。 我想做的是把所有新的CloneLightPrefable游戏对象作为孩子放在LightPrefable下

还有一个子问题,在这行的内部循环中:

cloneLightPrefab.transform.SetParent(lightPrefab.transform);
for(int x=0;x
我是否应将其更改为:

for (int x = 0; x < lightPositions.Length; x++)
for(int x=0;x
您的代码中有太多问题,所以这个答案很长

1。首先,您不需要外部循环:
(int i=0;i
。请把那个拿走。我的上一个答案中没有包含这一点,我也不知道你为什么要在那里添加它。这将增加您在循环中花费的时间

2。您正在修改一个预置,而您正在修改
lightprefact.GetComponent().material.color=color.red您应该改为修改克隆对象<代码>CloneLightPrefact.GetComponent().material.color=color.red

3。不要将实例化对象的父对象设置为预设。这就是您使用
CloneLightPrefact.transform.SetParent(lightPrefact.transform)所做的

创建一个空的游戏对象,然后将其用作实例化的所有灯光对象的父对象<代码>游戏对象父对象=新游戏对象(“LightParentObj”)
then
clonelightprefact.transform.SetParent(parentObject.transform)

如果您还不知道如何创建预制件,请查看一篇文章

您的固定代码应该更像这样:

for (int x = 0; x < lightPositions.Length - 1; x++)
void CreateCubesBesideWaypoints()
{
常数int lightCount=20;
Vector3[]lightPositions=新Vector3[lightCount];
路径后距离(路径点[0]。transform.position,路径点[waypoints.Length-1]。transform.position,lightPositions,lightCount);
GameObject parentObject=新游戏对象(“LightParentObj”);
对于(int x=0;x
我应该把它改为:for(intx=0;x

当您有(intx=0;x时, 循环从
0
开始,以
lightPositions.Length-1
结束

如果将其更改为(int x=0;x,循环将从
0
开始,以
lightPositions.Length-2
结束。基本上,循环不会完成对数组中所有项的循环

我确实认为,在继续编码之前,您应该搜索并理解
for
在C#中使用数组进行循环。这是你必须知道的基本知识之一

注意


使用
for(int x=0;x的一种情况是使用
lightprefact.GetComponent().material.color=color.red;多次打电话给。。。你可以移动它。我之所以做外循环是因为如果我愿意的话:后循环距离(航路点[0]。transform.position,航路点[waypoints.Length-1]。transform.position,lightPositions,lightCount);它将只在一个航路点上放置立方体。但在航路点中,我有不止一个航路点。这就是为什么我在for之前添加了(inti=0;i0
索引开始,在
waypoints.Length-1
结束。
postochunkdistance
函数有两个位置:1.位置的开始,即
航路点[0]。transform.position
。2.位置的末端,即
航路点.Length-1
。如果您在这两个位置传递它,它将在这两个位置之间生成点。这些点的距离将相等,这就是您想要的。它将生成的点均匀地存储在
lightPositions
数组变量中。我们在每个位置上循环并实例化灯光。我没有在
航路点上直接循环的主要原因是因为我们不确定这些线是否均匀地创建。我们也无法控制应该生成多少个点。使用
postochunkdistance
函数,我们可以通过使用来自航路点的第一个索引和来自航路点的最后一个索引来生成任意数量的点/灯光,这些点/灯光彼此之间的间距为100%。如果您不关心应该生成多少灯光,或者您不关心每个点/灯光之间的距离是否相等,然后只需删除
postochunkdistance
功能,只需在
航路点上循环即可。应该这样做。现在,您正在生成20个灯光,但由于该
postochunkdistance
功能,您可以对其进行更改。仅使用
航路点
是无法实现的。
for (int x = 0; x < lightPositions.Length - 1; x++)
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);
    }
}