簡體   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