在运行时动态创建变量

本文关键字:变量 创建 动态 运行时 | 更新日期: 2023-09-27 18:20:08

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

我正在使用Unity开发一款电子游戏。我有大炮发射的炮弹。起初,我使用Unity的"Object.Instimate"方法动态创建投射物(很好,所以我知道这是可以做到的)。这会导致我的游戏在炮弹被加载到内存中时出现大块。

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

当"cacheAmount"小于64时,这为性能创造了奇迹。如果"cacheAmount"增加到64以上,则ObjectCache的性能比使用Unity的"Object.Instalize"方法差。

我猜测了一下,发现字典的内存空间太大了,访问整个块所需的时间导致游戏速度减慢。

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

我摆弄了一下,用8个对象硬编码了32卷。这使得256枚射弹可以在没有性能影响的情况下发射。

最理想的情况是,我根本不使用字典,只需创建变量的"cacheAmount",并循环遍历所有变量。通过这种方式,我可以更改cacheAmount,并缓存256个或更多个单独的对象,而无需事先对它们进行256次硬编码。

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

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

然后我必须访问dynamicVariable1、dynamicVariable2、dynamicVariable 3、dynamicVariable4等。

我该如何在C#或JavaScript/UnityScript中实现这一点?

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

在运行时动态创建变量

您真的需要实例化256个游戏对象吗?你不能重复使用一些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;
}