繁体   English   中英

在运行时动态创建变量

[英]Dynamically Create Variables At Runtime

(是的,我实际上需要动态创建变量,而不仅仅是使用数组,列表或字典。)

我正在使用Unity开发视频游戏。 我有一门大炮发射的弹丸。 最初,我是使用Unity的“ Object.Instantiate”方法动态创建弹丸的(很好,所以我知道可以做到)。 这将导致我的游戏在将弹丸加载到内存时分块。

我的解决方案是创建一个对象缓存/对象池。 在开始玩游戏之前,对象缓存使用Unity的“ Object.Instantiate”方法将游戏对象的“ cacheAmount”放入字典中。

当“ cacheAmount”小于64时,这对性能产生了奇迹。如果将“ cacheAmount”增加到64以上,则ObjectCache的性能将比使用Unity的“ Object.Instantiate”方法差。

我猜了一下,发现字典的内存空间太大,访问整个块所需的时间使游戏变慢了。

我决定将字典分成8卷,每卷有8个对象,第1-8卷,共64个对象。 这些较小的音量再次提高了我的性能。

我花了一些力气,用8个对象对32卷进行了硬编码。 这样就可以发射256枚弹丸,而不会影响性能。

理想情况下,我根本不会使用字典,只需创建变量的“ cacheAmount”,然后遍历所有变量即可。 这样,我可以更改cacheAmount并缓存256个或更多的单个对象,而不必事先对其进行256次硬编码。

为了简单起见,a我需要这样的东西:

int cacheAmount = 256;
    for (int i = 0; i < cacheAmount; i++)
    {
        GameObject dynamicVariable>i< = (GameObject)Instantiate(projectile);
    }

然后,我将不得不访问dynamicVariable1,dynamicVariable2,dynamicVariable3,dynamicVariable4等。

如何在C#或JavaScript / UnityScript中进行此操作?

(再次使用数组,列表或字典,会产生太大的内存空间并影响性能)

您真的需要实例化256个gameObjects吗? 您不能重用某些gameObjects吗?

您不需要字典,也不需要动态变量(无论它们是什么),只需创建一个数组并使用RoundRobin访问该数组中的下一个自由射弹即可。

在伪代码上,您没有将引用存储在任何地方,而是在本地声明它,然后忘记,因此无法访问它们。

您想要做的更多是

int cacheAmount = 256;
GameObject[] cache=new GameObject[cacheAmount];
int nextObjectIndex=0;
void CreateCache()
{
    for (int i = 0; i < cacheAmount; i++)
    {
        cache[i] = (GameObject)Instantiate(projectile);
    }
}

GameObject GetFromCache()
{
   GameObject nextObject=cache[nextObjectIndex];
   nextObjectIndedx++;
   if (nextObjectIndex>=cacheAmount) nextObjectIndex=0;
   return nextObject;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM