Хранение и поиск данных по плиткам - PullRequest
1 голос
/ 25 марта 2019

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

Насколько я могу судить, я столкнулся с тремя возможными вариантами:

  1. Не используйте карту листов Unity, а вместо этого собирайте плитки вручную с помощьюсписок GameObjects и спрайтов.Затем присоедините любую модель, которая мне может понадобиться, с пользовательскими значениями в качестве сценария к указанному GO.Это позволит очень просто добавить логику к каждой плитке.Недостатком будет то, что строить карты будет гораздо более раздражающим.

  2. Используйте Tilemap Unity, но отслеживайте каждый специальный фрагмент узла в коде вручную.Само собой разумеется, что это не очень привлекательный рабочий процесс, так как всякий раз, когда карта изменяется, изменение должно будет отражаться в кодовой карте / списке / массиве

  3. Переопределить Unity'sПлитки (как и в пакете 2d extras) и создает плитку правил для каждой специальной плитки.При чтении в плитках и составлении словаря проверьте тип плитки и назначьте любые специальные свойства в зависимости от типа плитки, которую вы просматриваете в данный момент.Плитки правил могут быть либо визуальными, либо нарисованными на карте листов под визуальной картой листов, используемой только для хранения информации карты над ней.

  4. (3.1) Выполните то же, что и выше, новместо использования специальных плиток правил, разделите любые специальные плитки на их собственные специальные карты.Затем прочитайте каждую карту тайлов и скомпилируйте словарь, который отслеживает любые специальные тайлы и их особые свойства.

В настоящее время я использую следующее:

private void GetWorldTiles ()   { 
    tiles = new Dictionary<Vector3, WorldTile>();       
    foreach (Vector3Int pos in Tilemap.cellBounds.allPositionsWithin)       {
        var localPlace = new Vector3Int(pos.x, pos.y, pos.z); 
        if (!Tilemap.HasTile(localPlace)) continue;
        var tile = new WorldTile
        {   
            LocalPlace = localPlace,
            WorldLocation = Tilemap.CellToWorld(localPlace),
            TileBase = Tilemap.GetTile(localPlace),
            TilemapMember = Tilemap,
            Name = localPlace.x + "," + localPlace.y,
            Cost = 1 // Cost is needed for pathfinding. Other properties may also exist such as "isSpawnPoint", or what have you.
        };                      
        tiles.Add(tile.WorldLocation, tile); //tiles is a Dictionary<string, WorldTile>
    }
}

Приведенный выше код взят из этого короткого урока здесь

Содержимое моих карт будет почти случайным.Например, персонажи игрока будут иметь выделенные точки появления на карте, но вражеские персонажи будут появляться случайным образом на любых тайлах, на которых им разрешено появляться.Некоторые тайлы также порождают такие вещи, как сундуки с сокровищами, а другие тайлы будут обладать особыми свойствами, такими как водные тайлы, проходимые только водными единицами и т. Д.

На данный момент так выглядит простая карта со всемиспрайты как заполнители.Проще говоря, шестнадцатеричные плитки являются препятствиями, а X-плитки являются стенами, которые также нельзя пройти, показывая границу карты (размер конечного продукта может варьироваться)

Simple Example Tilemap

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

Если у вас есть какие-либо вопросы, я буду рад ответить на них.

Дополнительная информация

Я также вижу, что Tiles имеют ссылку на свойство gameObject, но я не видел примеров использования этого.

1 Ответ

1 голос
/ 30 марта 2019

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

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

public class TerrainLayer : MonoBehaviour
{
    public bool canAirUnitsEnter;
    public bool canLandUnitsEnter;
    public bool canSeaUnitsEnter;
}

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...