Version: 6000.3
语言: 中文
创建图块集
磁贴集属性参考

图块模板资产

要定义 Unity 如何从纹理创建图块,请创建一个图块模板资产,该资产是ScriptableObject可以继承自 C# 脚本并在 C# 脚本中实现。

这将允许您更改在图块面板中创建和放置图块的默认行为。例如,你可以从纹理中的精灵创建一个规则图块,而不是为每个精灵A 2D 图形对象。如果你习惯于在3D中工作,精灵本质上只是标准纹理,但有一些特殊的技术可以组合和管理精灵纹理,以提高开发过程中的效率和便利性。更多信息
请参阅术语表
,简化您的图块贴图一种游戏对象,允许您使用图块和网格叠加层快速创建 2D 关卡。更多信息
请参阅术语表
绘画体验。

实现图块模板资产

在 C# 磁贴模板脚本中实现以下函数:

public abstract void CreateTileAssets(Texture2D texture2D
, IEnumerable<Sprite> sprites
, ref List<TileChangeData> tilesToAdd);

你将获得对配对纹理和配对纹理具有的所有精灵的引用。你的输出应该是要生成的图块列表,以及它们的位置偏移量,以便放置在由图块集资产生成的图块调色板中。

示例:PositionTileTemplate

以下是已实现的图块模板资产 PositionTileTemplate 的示例。PositionTileTemplate 根据用户传入的相应位置列表将磁贴放置在磁贴集中,而不是由 Unity 自动确定。这允许用户根据需要水平放置所有图块。

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;

namespace UnityEditor.Tilemaps
{
    /// <summary>
    /// Tile Template which places created Tiles into fixed positions passed with this Template
    /// </summary>
    [Serializable]
    public class PositionTileTemplate : TileTemplate
    {
        [SerializeField]
        private List<Vector3Int> m_Positions;

        /// <summary>
        /// Positions to place Sprites into Tile Palette
        /// </summary>
        public IEnumerable<Vector3Int> positions
        {
            get => m_Positions;
            set
            {
                if (m_Positions == null)
                    m_Positions = new List<Vector3Int>();
                m_Positions.Clear();
                m_Positions.AddRange(value);
            }
        }

        /// <summary>
        /// Tile Template which places created Tiles into fixed positions passed with this Template
        /// </summary>
        /// <param name="positions">Positions to place Sprites into Tile Palette</param>
        public PositionTileTemplate(IEnumerable<Vector3Int> positions)
        {
            m_Positions = new List<Vector3Int>();
            m_Positions.AddRange(positions);
        }

        private static IEnumerable<(T1, T2)> MultipleEnumerate<T1, T2>(IEnumerable<T1> t1s, IEnumerable<T2> t2s)
        {
            using IEnumerator<T1> enum1 = t1s.GetEnumerator();
            using IEnumerator<T2> enum2 = t2s.GetEnumerator();
            while (enum1.MoveNext() && enum2.MoveNext())
                yield return (enum1.Current, enum2.Current);
        }

        /// <summary>
        /// Creates a List of TileBase Assets from Texture2D and Sprites with placement
        /// data onto a Tile Palette.
        /// </summary>
        /// <param name="texture2D">Texture2D to generate Tile Assets from.</param>
        /// <param name="sprites">Sprites to generate Tile Assets from. Each Sprite will be created as a Tile asset and mapped to a position in order.</param>
        /// <param name="tilesToAdd">Tile Assets and placement data to generate.</param>
        public override void CreateTileAssets(Texture2D texture2D, IEnumerable<Sprite> sprites, ref List<TileChangeData> tilesToAdd)
        {
            var i = 0;
            var tileMap = new Dictionary<Sprite, TileBase>();
            foreach (var (textureSprite, position) in MultipleEnumerate(sprites, positions))
            {
                if (!tileMap.TryGetValue(textureSprite, out TileBase tile))
                {
                    tile = ScriptableObject.CreateInstance<Tile>();
                    tile.name = $"Tile {i}";
                    tile.sprite = textureSprite;
                    tileMap.Add(textureSprite, tile);
                }
                if (tile == null)
                    continue;

                tilesToAdd.Add(new TileChangeData()
                {
                    position = position,
                    tile = tile,
                    transform = Matrix4x4.identity,
                    color = Color.white
                });
            }
        }
    }
}
创建图块集
磁贴集属性参考