Unity 2D Tilemap Пользовательская шестиугольная плитка правила - PullRequest
0 голосов
/ 24 марта 2020

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

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

Coast tile example

Я вижу Код Unity по умолчанию для плиток с гексагональными правилами в их репозитории github, но он не знает, как go точно переопределить это: https://github.com/Unity-Technologies/2d-extras/blob/master/Runtime/Tiles/HexagonalRuleTile/HexagonalRuleTile.cs

Это относительно новая тема в Unity, но любая помощь или руководство будет высоко ценится.

1 Ответ

0 голосов
/ 25 марта 2020

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

using System;
using UnityEngine;
using UnityEngine.Tilemaps;

[Serializable]
[CreateAssetMenu(fileName = "CoastHexagonTile", menuName = "Tiles/CoastHexagonTile")]
public class CoastHexagonTile : HexagonalRuleTile<CoastHexagonTile.Neighbor>
{
    public bool isOcean;
    public bool isCoast;

    public class Neighbor : TilingRule.Neighbor
    {
        public const int IsOcean = 3;
        public const int IsNotOcean = 4;
        public const int IsCoast = 5;
        public const int IsNotCoast = 6;
    }

    /// <summary>
    /// Checks if there is a match given the neighbor matching rule and a Tile.
    /// </summary>
    /// <param name="neighbor">Neighbor matching rule.</param>
    /// <param name="other">Tile to match.</param>
    /// <returns>True if there is a match, False if not.</returns>
    public override bool RuleMatch(int neighbor, TileBase tile)
    {
        var other = tile as CoastHexagonTile;
        switch (neighbor)
        {
            case Neighbor.IsOcean:
                return other && other.isOcean;
            case Neighbor.IsNotOcean:
                return other && !other.isOcean;
            case Neighbor.IsCoast:
                return other && other.isCoast;
            case Neighbor.IsNotCoast:
                return other && !other.isCoast;
        }
        return base.RuleMatch(neighbor, tile);
    }
}

Редактировать: К сожалению, похоже, что не все тайлы правил почему-то подчиняются правилам. Я устанавливаю каждую плитку программно на большой карте. Интересно, в этом ли причина? быть позванным. Я думаю, что это верно только тогда, когда плитки перемещаются и устанавливаются программно во время выполнения, как я.

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