Tiled结合Unity实现瓦片地图——Unity实战篇
本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。
http://blog.csdn.net/lzhq1982/article/details/75425915
上文说道,Tiled2Unity可以方便的把Tiled编辑器做的地图文件导出到Unity中,这方面文章不少,可是这个地图文件我们在Unity中怎么用,这方面的介绍太少了,这篇是Unity实战篇,如果觉得对您有用,就请看完后点个赞吧。
1、Tiled Map Editor中的对象
这是Tiled编辑器中唯一值得我们关心的部分,因为只有这部分能参与编程,Tiled中的图层有三种,如下图
点击新建图层的时候会弹出上面三个图层,图块层和图片层是美术关心的,只是负责显示的部分,我们程序重点关心的是对象层,所以如果你想代码操纵某个图层,一定要定义成对象层。比如我会把所有的关卡点和建筑点设置成对象层,其他如地表啊,水面啊,路啊,花花草草啊什么的,都是图块层就好了。然后切换成对象显示,我们会看到那些设置成对象的瓦片列表,都在这里了,如果没有定义名称和类型,就是下面这个样子:
选择某个对象,左侧的属性是这个样子:
这有什么用啊,除了xy,宽高,毛用都没有啊,别着急,我们还什么都没干呢。
2、对象类型编辑器
上面都是默认的,我们要经过对象类型编辑器来编辑它们,拿到我们程序需要的变量,先找到对象类型编辑器:
选择后会弹出对象编辑器,如下图:
当然默认是什么都没有的,我这里已经加上了一些内容,先看左侧——类型,我们可以为对象设置类型,每个对象都该有个类型,相同类型的对象有着相同的属性,比如我这里定义了一个关卡类型Level,如果设置了类型的颜色,我们在编辑器中可以对该类型的对象着相同的颜色,可以区分对象类型吧,无关紧要。每个类型对应后面的属性,这个看你的需求,比如我的关卡需要记录id,需要记录4个临近关卡点的id,所以我定义了上面5个变量。每个属性有个默认值,我定义为0。
3、设置每个对象的自定义属性
回到主界面,选一个对象,然后在类型那行输入你刚设置的类型,见证奇迹的时刻到了,你会发现下面的自定义属性立刻出现了你在对象编辑器中设置的该类型对应的属性,如下图:
类型我输入Level,下面就出现了那5条属性,然后我可以自定义那些属性值,比如这里它的关卡号是37,相邻关卡点只有一个,是id为30的关卡点。大家可能看到了名称那里,那是自己手动加上的,上面每一条数据,未来代码都是可以访问到的,尤其是类型和自定义属性,是我们的重点。
4、Unity内置的自定义属性
unity:tag
unity:sortingLayerName
unity:sortingOrder
unity:layer
(Layer is such an overloaded term. In Unity it means the “physics” layer.)
Tiled编辑器是支持几种与Unity相关的自定义属性的,如上面,比如你在Unity中设置好tag或layer或sortingLayerName,那在Tiled编辑器中设置相同的tag、layer或sortingLayerName,将来导出后,这些对象会自动设置成Unity对应的tag、layer、sortingLayerName,下面举个sortingLayerName的例子:
首先在Unity中的Tags & Layers中的Sorting Layers里加入一个Layer,设置为Background:如下图:
注意层的关系,我把Default层拖到Background下,这样Background背景层始终在最下面。然后在Tiled编辑器中的图块层和对象层我都加了unity:sortingLayerName,设置为Background,如下:
注意图块层也是可以加自定义属性的,这样导出后,我的图块层就被自动设置为Background了,由于我生成的角色会默认为Default层,这样永远保证角色会在地图上面显示,下图是导出后Unity中该图块自动加的图层:
下面是我加入角色后会在地图上方:
tag和layer也是这么设置使用,就不多介绍了。
5、导出时加载数据
在导入到Unity后,每个对象都携带了在Tiled编辑器中的属性,除了自定义数据,并作为TileObject脚本组件绑定到对象上:
对照本篇的3,你可以看到对应关系,所以我们可以在TileObject中获得一些基础属性。
但自定义数据怎么在代码中获取呢,首先我们看Tiled2Unity在Unity中导入的包,找到ICustomTiledImporter文件,路径如下:
我们看看里面的代码:
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 scriptvoid 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 GameObjectif (props.ContainsKey("AddComp")){gameObject.AddComponent(props["AddComp"]);}}public void CustomizePrefab(GameObject prefab){// Do nothing}
}
*/
这个类是干吗的呢,就是负责导出我们自定义数据的加载类,人家很贴心的在注释里写了个例子,可供参考。其实就两个接口, HandleCustomProperties是我们处理自定义数据的地方,它传递两个参数,gameObject是每一个对象,props是自定义属性组成的字典。CustomizePrefab是我们对导出的地图prefab可以操作的地方,传递的prefab是我们的地图prefab。
我在工程目录下建个Editor文件夹,然后在其下新建个脚本:CustomImporter_StrategyTiles,内容如下:
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 objectif (obj.TmxType == "Level") {BoxCollider2D box = gameObject.AddComponent<BoxCollider2D> ();box.offset = new Vector2 (2, 1.3f);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时调用的,所有数据在导入时就已经都加载好了,跟游戏运行没关系。
嗯,再多说一点,除了上述数据,我们还可以获得整张地图的数据,点击我们的地图prefab,你可以看到它绑了个TiledMap脚本:
我们从中可以看到层数NumLayers,横向格子数NumTilesWide,纵向格子数NumTilesHigh,每个格子宽TileWidth,高TileHeight,导出缩放值ExportScale,地图像素宽MapWidthInPixels,高MapHeightInPixels。
如果读者还记得我设计的最小单位是32的话,那按这个最小单位我其实要用MapWidthInPixels和MapHeightInPixels计算我横向和纵向需要多少个最小单位,而不是直接用上面的NumTilesWide和NumTilesHigh,那对我没用。
就说这么多吧,上面那些只是基础,要跟地图做交互还要考虑摄像机的Size,位置,防止地图边缘漏出来,尤其是地图可以拖动缩放的情况。
Tiled结合Unity实现瓦片地图——Unity实战篇相关推荐
- Tiled结合Unity实现瓦片地图
前段时间应公司需求做瓦片地图,cocos与瓦片地图的结合案例很多,但unity的却少之又少,做瓦片地图少不了Tiled Map Editor(下载地址),这个教程很多,也自带例子,关于怎么拼地图,这里 ...
- Tiled结合Unity实现瓦片地图——Tiled2Unity篇
本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/75356478 前段时间应公司 ...
- Tiled Map Editor(瓦片地图编辑器)的Java和QT版本区别
尊重作者劳动,转载时请标明文章出处. 作者: Bugs Bunny 地址: http://www.cnblogs.com/cocos2d-x/archive/2012/05/03/2479469.ht ...
- Unity实现瓦片地图tile map
2019独角兽企业重金招聘Python工程师标准>>> Unity自定义mesh绘制 基于上篇的mesh修改,实现tile map 第一步,修改mesh 顶点和三角片信息,生成方格 ...
- Unity(9)-TileMap瓦片地图
文章目录 前言 相关介绍 其他介绍 上一篇笔记 下一篇笔记 一.图片预处理 二.创建调色板(TilePalette) 三.创建瓦片(Tile) [1]. 方式一 [2]. 方式二 四.修改瓦片(Til ...
- Tiled瓦片地图的使用
Tiled软件使用的注意事项: 1️⃣文件的导入.图层文件的导入不能有中文名字,最好是先把需要的资源文件导入到工程的Resource文件夹中,让后到这个文件夹中导入Tiled软件,进行瓦片地图的绘制. ...
- 【Unity入门计划】基本概念(8)-瓦片地图 TileMap 01
目录 1 TileMap概念 主要思想 优点 创建的层级 2 Unity中的TileMap 2.1 自动父级Grid 网格 2.2 Sprite精灵 2.3 Tile 瓦片 2.4 Tile Pale ...
- unity使用tiled文件,将数据用unity打开,可以无限tiled地图
做游戏时,先实现游戏的基本功能,最后可能会用到更多的地图,对于创建地图如果有方便的软件,就更容易了,现在咱们展示一下如何用tiled制造地图,生成数据库,然后用unity显示出地图. 首先会使用的软件 ...
- unity超级马里奥2d游戏开发-03瓦片地图场景搭建
大家好,我是小兵,今天给大家带来Untiy开发超级马里奥游戏的第3课,瓦片地图搭建,如果你想查看完整的教程,请访问我的个人博客geekape.net. 前两节课都没涉及具体的游戏制作,算是一个开胃菜, ...
最新文章
- 【C语言学习趣事】_GCC源代码分析_2_assert.h
- mysql delete and or_Mysql delete操作
- VS2015 解决方案 或者项目 卡 正在加载 的解决办法
- 《理解 ES6》阅读整理:块绑定(Block Binding)
- Tag recommendaion... 论文中的小例子,使用HOSVD算法推荐
- ping github超时问题
- 第二次冲刺阶段(第七天)
- MySQL类型介绍以及适用范围
- 解决github无法访问的问题
- 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
- linux 下创建GRE隧道
- 相同布局在不同手机上显示不同_React Native布局详细指南
- 字符串,字节,二进制转换
- Docker Image执行流程
- Google搜索技巧终极收集 - 101个Google技巧
- 小菜找实习——阿里3月20日笔试第二题
- MAC VMware Fusion Centos 设置静态IP
- 大连商务英语考试中心百家外语商务英语的特点及翻译方法
- JS 不可逆加密后半部分,去混淆还原代码。
- 未来计算机的图片大全集,小学生未来的机器人儿童画图片大全
热门文章
- Jmeter-Android手机端脚本录制
- 安徽省2019c语言二级答案,安徽省计算机等级二级考试真题C语言.doc
- 一不小心把此电脑删了,如何把此电脑添加到桌面?
- 使用计算机制作数字文本格式,电脑excel表格如何将文本格式变成数字格式
- 海量上传文件服务器端,bat批量上传ftp文件到服务器
- 全球及中国非接触式红外数字温度计行业研究及十四五规划分析报告
- Java中JDBC详解
- 只需5分钟教会你使用React中的JSX
- java catch空指针异常处理_Java基础学习:java文件空指针异常处理
- UrlEncode编码/UrlDecode解码 - 站长工具