包含此页的版本:
不含此页的版本:
要定义 Unity 如何从纹理创建图块,请创建一个图块模板资产,该资产是ScriptableObject可以继承自 C# 脚本并在 C# 脚本中实现。
这将允许您更改在图块面板中创建和放置图块的默认行为。例如,你可以从纹理中的精灵创建一个规则图块,而不是为每个精灵A 2D 图形对象。如果你习惯于在3D中工作,精灵本质上只是标准纹理,但有一些特殊的技术可以组合和管理精灵纹理,以提高开发过程中的效率和便利性。更多信息
请参阅术语表,简化您的图块贴图一种游戏对象,允许您使用图块和网格叠加层快速创建 2D 关卡。更多信息
请参阅术语表绘画体验。
在 C# 磁贴模板脚本中实现以下函数:
public abstract void CreateTileAssets(Texture2D texture2D
, IEnumerable<Sprite> sprites
, ref List<TileChangeData> tilesToAdd);
你将获得对配对纹理和配对纹理具有的所有精灵的引用。你的输出应该是要生成的图块列表,以及它们的位置偏移量,以便放置在由图块集资产生成的图块调色板中。
以下是已实现的图块模板资产 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
});
}
}
}
}