【问题标题】:Unity Dictionary UseUnity 字典使用
【发布时间】:2016-06-01 16:42:34
【问题描述】:

我目前正在使用 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 作为数据类型。我想知道,既然字典都是静态的,这是否意味着我会一直在内存中存放一堆数据结构,或者会根据需要查找和提取所需的信息?

【问题讨论】:

  • 它将驻留在内存中,直到您关闭应用程序。

标签: c# dictionary unity3d


【解决方案1】:

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

在创建之后,它们会在您的进程的剩余生命周期中保留在内存中。

【讨论】:

  • @Valentin 只是在搜索文档...我记得读过 Eric Lippert 的一些博客文章。所以目前不确定,但我认为它们是在第一次访问声明类型时创建的。因此,如果有人实例化声明类型或访问该类型的任何静态字段,所有静态字段都会被初始化。所以不一定在流程开始时。
  • 我发现(msdn.microsoft.com/en-us/library/aa645758(v=vs.71).aspx),如果有静态构造函数,会在开始时创建,否则在第一次使用该类的静态字段。谢谢
【解决方案2】:

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

来自维基百科:

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

【讨论】:

    【解决方案3】:

    是的,正如其他人所指出的那样,静态对象从第一次使用到程序终止都会保留在内存中。

    在 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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      相关资源
      最近更新 更多