2016-06-01 3 views
0

В настоящее время я работаю над образовательной игрой в 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} 
}; 

У меня есть многие из них, иногда даже с использованием спрайтов в качестве типа данных. Мне было интересно, так как словари все статичны, значит ли это, что у меня будет целая куча структур данных, которые все время будут сидеть в памяти или же нужно будет искать требуемую информацию и потянуть ее по мере необходимости?

+0

Он будет сидеть в памяти, пока вы не закроете приложение. – Valentin

ответ

0

Поскольку они static, они создали первый раз объявить тип (класс, в котором вы объявили heights) используется.

После этого создания они остаются в памяти для остальной части вашего процесса.

+0

@Valentin просто поиск документации. .. Я не забыл прочитать некоторые записи в блоге Эрика Липперта об этом. Поэтому в настоящее время я не уверен, но я думаю, что они создаются при первом доступе к типу объявления. Поэтому, если кто-то создает экземпляр типа объявления или получает доступ к любому из статических полей этого типа, все статические поля инициализируются, поэтому не обязательно при запуске процесса. –

+0

Я нашел (https://msdn.microsoft.com/en-us/library/aa645758(v=v s.71) .aspx), если есть статический конструктор, он будет создан в начале, иначе при первом использовании статического поля этого класса. благодаря – Valentin

0

Когда вы создали словарь, вы сделали его статическим. Это означает, что они остаются в памяти на время работы приложения. В вашей ситуации статический объект равен heights.

Материал из Википедии:

В компьютерном программировании static variable является переменной, которая была выделена статически, чей срок службы или «степень» проходит по всей запуска программы.

0

Да, как отмечали другие, статические объекты останутся в памяти с момента их первого использования до тех пор, пока программа не завершится.

Возможно, вам будет выгодно работать с ScriptableObject в Unity. Он работает как 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 
    } 
} 
Смежные вопросы