前段时间应公司需求做瓦片地图,cocos与瓦片地图的结合案例很多,但unity的却少之又少,做瓦片地图少不了Tiled Map Editor(下载地址),这个教程很多,也自带例子,关于怎么拼地图,这里就不介绍了,先看看我们的美术小哥拼的地图,效果很赞,我截取一部分:
ok,拼图咱程序不在行,可是怎么导入unity可就是技术活了,虽然很多技术大拿喜欢自己写代码,可是在现在快节奏出游戏的时代,有现成工具不用就可惜了。那我今天要说的是Tiled2Unity。
Tiled2Unity是个纯免费的软件,当然如果有想用money支持的话人家也提供了链接。官网有教程,可以好好看看。打开软件长这个样子:
先声明,我的Unity版本是Unity5.5.2,Tiled版本是0.18.2,Tiled2Unity版本是1.0.10.3,操作系统是mac,下面的介绍如果因版本或系统不同造成的结果不同,请自行找办法。
1、在Unity中导入Tiled2Unity
有两种方法:
1)先打开Unity工程,然后再打开Tiled2Unity,找到并点击Help->Import Unity Package to Project,如下图:
然后Unity会弹出导入资源框:
点Import导入即可。
2)用Unity的Import Package方法,当然要找到package,mac在Tiled2Unity的app上右键点击,显示包内容,然后找到Contents/Resources/Tield2Unity.unitypackage,导入这个就可以了。
导入后你会在工程下看到Tiled2Unity文件目录:
2、绑定Tiled Map Editor 和 Tiled2Unity
在Tiled2Unity上有个黄色区域,上面写了几行内容,如下图:
上面写的很清楚,把“open -a /Applications/Tiled2UnityMac.app --args %mapfile”这个命令行编辑进Tiled Map Editor,就可以用Tiled Map Editor打开Tiled2Unity,如何编辑到Tiled Map Editor里呢,打开Tiled Map Editor,找到下图位置:
点击旁边的下拉三角,选择编辑命令,在弹出的对话框里把上述命令写进去,如下图:
那个Export就是这个命令的名字,注意就把那串字符串复制进去,不要加什么路径啥的,网上有的教程要加各种路径啥的,根本就没明白这个命令行的意思。点击ok保存。这个时候再点击那个小齿轮,Tiled2Unity就会自动打开,并且把当前编辑的地图信息自动导入到Tiled2Unity,注意,如果不通过Tiled Map Editor而是直接打开Tiled2Unity,会没有编辑的地图信息。
3、设置Tiled2Unity并导出地图
通过Tiled Map Editor的小齿轮打开Tiled2Unity后,我们需要在上面做些设置,其实也就两条:
1)Pixels Per Unit
后面有句解释:Set to same "Pixels Per Unit" value for Unity sprites in your project。翻译过来就是与Unity中sprites里的"Pixels Per Unit"里的设置一样,Unity中图片的设置那里可以选成sprite格式,里面就会有这个设置,默认是100,也就是100个像素是一个单位,但这不是我们关心的重点。我们实际关心的是Tiled中我们的每个瓦片的单位,比如我们制作的地图每个瓦片是128*64的,是等角(交错)格式的地图,斜45度效果,所以我的最小单位该是64的一半32,这样整张地图的长和宽用这个最小单位算才不会出现小数个单位。所以Pixels Per Unit里我设置成32。
2)Export To
这是未来地图导出后放置的地方,人家也有说明:
意思是定位到有Tiled2Unity.export.txt这个文件的目录中,还记得你刚导入到Unity里的Tiled2Unity的包吗,里面就有这个文件:
所以你定位到这个文件就好了,以后导出的地图的prefab会在上面的Prefabs文件夹下。
我前面对Tiled2Unity的截图就是最终设置好的样子,其他项保持默认就可,如果你有需求自行设置。
上面都设置好后,可以点Preview Map预览一下你在Tiled中编辑的地图,如果没问题点下面的Big AssExport Button就可以导出了。左侧的Debug窗口会显示编译信息。
关于Tiled2Unity导出地图就上面这些内容,也会有很多文章介绍过,可是Tiled怎么在Unity中用其实是最值得关心的,并且这方面介绍太少了,如果对这方面有需求,且听下回分解。
————————————————
点击新建图层的时候会弹出上面三个图层,图块层和图片层是美术关心的,只是负责显示的部分,我们程序重点关心的是对象层,所以如果你想代码操纵某个图层,一定要定义成对象层。比如我会把所有的关卡点和建筑点设置成对象层,其他如地表啊,水面啊,路啊,花花草草啊什么的,都是图块层就好了。然后切换成对象显示,我们会看到那些设置成对象的瓦片列表,都在这里了,如果没有定义名称和类型,就是下面这个样子:
unity:tagunity:sortingLayerNameunity:sortingOrderunity:layer (Layer is such an overloaded term. In Unity it means the “physics” layer.)
namespace Tiled2Unity
{
public interface ICustomTiledImporter
{
// A game object within the prefab has some custom properites assigned through Tiled that are not consumed by Tiled2Unity
// This callback gives customized importers a chance to react to such properites.
void HandleCustomProperties(GameObject gameObject, IDictionary<string, string> customProperties);
// Called just before the prefab is saved to the asset database
// A last chance opporunity to modify it through script
void CustomizePrefab(GameObject prefab);
}
}
// Examples
/*
[Tiled2Unity.CustomTiledImporter]
class CustomImporterAddComponent : Tiled2Unity.ICustomTiledImporter
{
public void HandleCustomProperties(UnityEngine.GameObject gameObject,
IDictionary<string, string> props)
{
// Simply add a component to our GameObject
if (props.ContainsKey("AddComp"))
{
gameObject.AddComponent(props["AddComp"]);
}
}
public void CustomizePrefab(GameObject prefab)
{
// Do nothing
}
}
*/
这个类是干吗的呢,就是负责导出我们自定义数据的加载类,人家很贴心的在注释里写了个例子,可供参考。其实就两个接口,HandleCustomProperties是我们处理自定义数据的地方,它传递两个参数,gameObject是每一个对象,props是自定义属性组成的字典。CustomizePrefab是我们对导出的地图prefab可以操作的地方,传递的prefab是我们的地图prefab。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Tiled2Unity;
[Tiled2Unity.CustomTiledImporter]
public class CustomImporter_StrategyTiles: Tiled2Unity.ICustomTiledImporter
{
public void HandleCustomProperties(GameObject gameObject, IDictionary < string, string > customProperties)
{
TileObject obj = gameObject.GetComponent < TileObject > ();
if(obj != null)
{
// Add the terrain tile game object
if(obj.TmxType == "Level")
{
BoxCollider2D box = gameObject.AddComponent < BoxCollider2D > ();
box.offset = new Vector2(2, 1.3 f);
box.size = new Vector2(2, 1);
TileData tile = gameObject.AddComponent < TileData > ();
tile.Id = int.Parse(customProperties["Object_ID"]);
for(int i = 0; i < 4; ++i)
{
string strId = "Neighbor_ID_" + (i + 1);
if(customProperties.ContainsKey(strId))
{
tile.neighbor[i] = int.Parse(customProperties[strId]);
}
}
}
}
}
public void CustomizePrefab(GameObject prefab)
{
// Do nothing
}
}
上面的代码就是我继承ICustomTiledImporter实现获得自定义属性的地方,代码很短,首先获得该对象TileObject基础属性,然后判断其类型是否Level,是的话我做了两件事,一是加BoxCollider2D碰撞体,一是加脚本TileData储存自定义数据并绑定到对象上,自定义数据是字典,用Tiled编辑器中的key获得value就行了,然后保存在TileData的数据中,我的TileData特简单:
public class TileData : MonoBehaviour {
public int Id = 0;
public int[] neighbor = new int[4];
}
好了,这样所有的数据你都得到了,怎么编程就是你自己的事情了,注意这段代码是在Tiled2Unity导出地图到Unity时调用的,所有数据在导入时就已经都加载好了,跟游戏运行没关系。
文章来源: Tiled结合Unity实现瓦片地图
原文链接: https://blog.csdn.net/lzhq1982/article/details/75356478