2016-04-06 6 views
0

Я немного новичок в Unity 2D, так что я не знаком с тем, что ограничения имеют структуры данных Vector3, но мне было интересно, если я мог бы хранить бескоординатному и не-пиксель/графический связанных с ним данных, как обычный массив.Какие типы данных могут быть сохранены в структуре Vector3 Unity Engine?

Некоторые справочную информацию: Делаю генератор подземелий 2D и хотел, чтобы хранить кодированные целые числа в каждом индексе основного массива Vector3 (с помощью двух вложенных циклов для), так что целые числа могут быть изменены с помощью каждый итеративный проход при создании подземелья. Затем окончательный макет возьмет кодированные целые числа и удалит индексированные данные, а вместо этого создаст правильную напольную или настенную плитку в этом месте.

коды будут:

  • 000 = заполненный
  • 010 = коридор
  • 020 = дверь
  • 030 = комнатная
  • 100 = защищенный
  • 001 - регион 1 [ основная]
  • 002 - регион 2
  • 003 - область 3,

т.д.

Таким образом, 32 представляет собой сетку кусок типа комнаты в регионе 2. Когда коридор соединяется с ним, становится 12. Когда две области подключения из коридора , он принимает нижнее из двух мест и так далее, пока вся сетка не будет заполнена 1 (подключена к основной области), после чего все они преобразуются в 0, чтобы указать, что подземелье готово для преобразования в текстуры , 100 - это специальный флаг, запускаемый при х> 99, чтобы обозначить, что блок должен оставаться заполненным, или случайно соединить комнаты или расширить дверные проемы.

+0

Er ... ну, с точки зрения точных данных, которые вы можете сохранить в 'Vector3', это будет 3' float' значения. Независимо от того, соответствует ли вам ваши требования, как вы хотите разработать свою программу, хотя я бы предположил, что вы можете определить свой собственный класс для этого с более описательным именем. – Serlite

+0

Не могу ли я хранить, скажем, строку «столба» в [3, 2, 5]? Или в случае Unity 2D, «3, 2, 0f»? Unity 2D использует целые числа для Vector3. Он принимает поплавки, но сетка имеет статическую ширину и высоту пикселя, которые устанавливаются в Инспекторе, для которых каждый индекс имеет X и Y пикселей от следующего. Для моих вложенных циклов я просто собирался использовать целые индексы. –

+0

Если ваше требование состоит в том, чтобы хранить 3 родственных номера, тогда для вас будет работать 'Vector3'. Если вы пытаетесь связать строку с набором из трех чисел (которые, как вы знаете, уникальны), рассмотрите «Словарь ». (И я не уверен, что вы подразумеваете под 'Vector3', используя' int' для своих координат, довольно уверен, что [документация] (http://docs.unity3d.com/ScriptReference/Vector3.html) не является двусмысленной на ' float'.) – Serlite

ответ

1

Vector3 - это всего лишь 3 поплавки, сгруппированные вместе по меткам x, y и z. В то время как вы можете делать все, что вы хотите, я бы рекомендовал против, используя его для этой цели. То, что вы хотите, это настраиваемая структура, которая содержит не три ints, а значение enum, int и bool. как так:

/// <summary> 
/// A simple struct to represent a tile on the map 
/// </summary> 
public struct MapTile { 
    /// <summary> 
    /// The type of the tile 
    /// </summary> 
    public TileType Type; 

    /// <summary> 
    /// The region this tile is in 
    /// </summary> 
    public int Region; 

    /// <summary> 
    /// True if this tile is protected 
    /// </summary> 
    public bool Protected; 

    /// <summary> 
    /// Constructs a new MapTile 
    /// </summary> 
    /// <param name="type">The type of the tile</param> 
    /// <param name="region">The region the tile is in</param> 
    /// <param name="isProtected">true if the tile is protected</param> 
    public MapTile(TileType type, int region, bool isProtected) { 
     this.Type = type; 
     this.Region = region; 
     this.Protected = isProtected; 
    } 
} 

/// <summary> 
/// An enum that contains the types of possible tiles 
/// </summary> 
public enum TileType { 
    FILLED, CORRIDOR, DOOR, ROOM 
} 

Это хорошая практика, чтобы сделать заказ или классы структуры, когда возникает необходимость вместо того, чтобы пытаться втиснуть свои данные в существующие.
Кроме того, попытка хранения целочисленных значений (-1, 2, 7, ...) в поплавке (десятичной) обычно является плохой идеей, поскольку числа с плавающей запятой подвержены ошибкам округления. вам может потребоваться, чтобы ваше значение было 25, но компьютер может сделать это 25.00000000001 или 24.9999999999, что затрудняет работу.

Также рекомендуется избегать «магических чисел», например, как вы планировали хранить «коридор» как «010». Если кто-то видел ваш код, как бы они знали, что 010 означает коридор? Что, если вы хотите изменить его позже? К счастью, C# (и большинство других языков) имеют встроенный тип для «числа, который представляет вещь», это называется перечислением. Перечисления подобны ints, но они имеют только определенные значения, которые вы им даете, и их красиво помечены.

Надеюсь, это поможет!

+0

Это помогло тонну, спасибо. У меня никогда не было никакого формального обучения программированию, так что это мое первое знакомство с структурами и значениями перечисления, но это очень полезно. У меня был еще один вопрос: Эти структуры допускают, чтобы в декларации из цикла for указывалось что-то вроде «xvalue» или «yvalue», или я должен сделать двумерный массив для хранения сетки карт данные? У меня были проблемы ранее в другом проекте, где класс не позволял динамически устанавливать переменную, а затем использовался при объявлении отдельного вложенного класса. Мне было интересно, возникнет ли такая проблема. –

+0

Я не уверен, что вы подразумеваете под этим. Если вы хотите сделать один экземпляр структуры для каждого пятна в сетке, вам нужно будет хранить их в чем-то вроде массива 2d. вы также можете иметь структуру хранения собственных координат, но это не поможет вам сохранить или вспомнить структуру позже – Steven

 Смежные вопросы

  • Нет связанных вопросов^_^