Unity字典使用

时间:2016-06-01 16:42:34

标签: c# dictionary unity3d

我目前正在Unity中开展教育游戏,玩家将测量某个物体的某些信息,例如它的高度和重量。我决定使用包含要测量的对象的枚举类型以及使用枚举类型作为键的几个词典来实现它,这个例子如下所示。

static Dictionary <MeasurableObjects,int> heights = new 
Dictionary<MeasurableObjects, int> ()
{
    {MeasurableObjects.Avatar,42},
    {MeasurableObjects.Dog,24},
    {MeasurableObjects.Cat,6},
    {MeasurableObjects.Pig,30},
    {MeasurableObjects.Hen, 18},
    {MeasurableObjects.Cow, 72},
    {MeasurableObjects.Fox, 18},
    {MeasurableObjects.Fish,8},
    {MeasurableObjects.Duck, 12},
    {MeasurableObjects.Horse,84},
    {MeasurableObjects.Sheep, 36},
    {MeasurableObjects.Pony, 60},
    {MeasurableObjects.Bear, 54},
    {MeasurableObjects.Camel,96},
    {MeasurableObjects.Tiger,48}
};

我有很多这些,有时甚至使用Sprites作为数据类型。我想知道,因为字典都是静态的,这是否意味着我会随时在内存中放置一堆数据结构,或者在需要时查找和提取所需的信息?

3 个答案:

答案 0 :(得分:0)

由于它们是static,因此它们是在第一次使用声明类型(您声明为heights的类)时创建的。

在创作之后,他们将留在你的余生过程的剩余时间。

答案 1 :(得分:0)

创建字典时,您将其设为静态。这意味着它们会在应用程序的运行生命周期内保留在内存中。在您的情况下,静态对象为heights

来自维基百科:

  

在计算机编程中,static variable是一个静态分配的变量 - 其生命周期或&#34;范围&#34;延伸到整个程序的运行。

答案 2 :(得分:0)

是的,正如其他人所说,静态对象从第一次使用到程序终止时将保留在内存中。

您可能更乐意在Unity中使用ScriptableObject。它的工作方式类似于MonoBehaviour,但是在项目级别而不是场景中实例化。这意味着,它就像任何基本资产一样。您无法在Unity中直接序列化词典,但您可以创建小的简单数据类型来表示您的信息,然后使用Resources.Load在您需要时提取资源。

这是一个简化(您可能会添加功能并在不同类型之间共享常用操作等。

[CreateAssetMenu("MyHeightsAsset")]
public class Heights : ScriptableObject
{
    public static Heights Load()
    {
        return Resources.Load("MyHeightsAsset");
    }

    public KeyValuePair[] valueMap;

    [Serializable]
    public class KeyValuePair
    {
        public MeasurableObjects obj;
        public int value;
    }

    public enum MeasurableObjects
    {
        Avatar,
        Dog
    }
}