Unity使用Isometric Z As Y Tilemap创建2.5D地图(三)如何用代码创建Tilemap
上一篇文档介绍了Unity在使用Isometric Z As Y Tilemap时如何正确处理图片遮挡顺序(《Unity使用Isometric Z As Y Tilemap创建2.5D地图(二)如何按照正确遮挡顺序渲染图片》)。本篇文章将讲解如何使用C#代码方式创建Tilemap、Palette,进行地图绘制。
创建Tilemap Palette
1.一些需要了解的事情
通常场景地图都是提前在Unity编辑器中提前创建好的,也有根据需要在游戏运行时动态创建的,本例子是在UnityEditor中创建地图内容。
1.1 UnityEditor代码存放位置
Unity为了避免不必要的包含,Unity3D的运行时类和编辑器类是存储在不同的Assemblies中(UnityEngine和UnityEditor),我们将要编写的编辑器代码通常是需要放在相应工程下的 Assets\Scripts\Editor 目录中。
1.2 使用MenuItem添加UnityEditor菜单
MenuItem属性允许你添加菜单项到主菜单和检视面板上下文菜单,该属性可以把任意静态函数变为一个可通过菜单调用的命令,仅静态函数能使用MenuItem属性。
[MenuItem("Tools/Create Palettee")]
static void CreatePalettee()
{
//to do someting
}
在 Assets\Scripts\Editor 目录中新建一个C#类,通过上面代码可以在Unity编辑器的 Tools 菜单中增加一个 Create Palettee的菜单,点击菜单后会执行CreatePalettee()方法。
2.使用代码创建Palette
首先在 Assets 目录下创建需要存放Palette的目录,例子中是放在Assets/Palette目录下。
if (!AssetDatabase.IsValidFolder("Assets/Palette"))
{
AssetDatabase.CreateFolder("Assets", "Palette");
}
if (dir.Exists)
{
/*
遍历Resources/images下子目录,可以用不同目录存放不同层的图片
比如ground目录下放ground层图片、build目录放build图片等等
*/
foreach (DirectoryInfo subDir in dir.GetDirectories())
{
string subPath = "Assets/Palette/" + subDir.Name;
if (!AssetDatabase.IsValidFolder(subPath))
{
AssetDatabase.CreateFolder("Assets/Palette", "" + subDir.Name);
}
//创建Palette,相关参数含义请参考前面文章
GameObject palette = CreateNewPalette("Assets/Palette", subDir.Name, GridLayout.CellLayout.IsometricZAsY,
GridPalette.CellSizing.Manual, new Vector3(72f, 36f, 1f), GridLayout.CellSwizzle.XYZ);
//准备向Palette中写入地图块对象
Tilemap layer1 = palette.GetComponentInChildren<Tilemap>(true);
//获取目录下所有图片
Sprite[] sprites = Resources.LoadAll<Sprite>("images/" + subDir.Name);
int x = 0;
int y = 0;
for (int i = 0; i < sprites.Length; i++)
{
/*
下面这行代码不是必要的,下面会解释。
*/
Vector2 offset = TextureManager.GetSpriteOffset(sprites[i].name