考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了
C#篇、unity通用篇、unity3D篇、unity2D篇
。
- 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的同学入门。
- 【unity通用篇】:主要讲解unity的基础通用的知识,包括unity界面、unity脚本、unity资源管理、unity动画、unity摄像机等,适合unity初学者入门。
- 【unity3D篇】:主要讲解unity3D的知识,unity3D角色、unity3D物理系统、unity3D光照等,适合只想做2D游戏的开发者学习。
- 【unity2D篇】unity2D篇:主要讲解unity2D的知识,包括unity2D角色、unity2D物理系统、unity2D光照等,适合只想做3D游戏的开发者学习。
这样方便大家按需选择性的去学习,比如有编程基础的大概率可以直接从unity通用篇开始入门,没有编程基础的建议从C#篇开始学习。只想做2D游戏的话,可以直接从unity2D篇开始学习,3D篇大概率就不需要看了,节约学习时间成本。
文章目录
前言
1、什么是Tilemap
Unity的Tilemap 一般称之为瓦片地图或者平铺地图,是 Unity2017 中新增的功能,主要用于快速编辑 2D 游戏中的场景,通过复用资源的形式提升地图多样性。
Tilemap工作原理就是用一张张的小图排列组合为一张大地图。
总结起来,Unity的Tilemap是一个强大的工具,可以帮助开发者创建和管理2D地图。它提供了一系列易于使用的编辑器功能和组件,让你能够更快速地建立自己的游戏世界。无论是初学者还是有经验的开发者,都可以通过Tilemap轻松地构建出具有丰富内容的游戏地图。
2、Tilemap和SpriteShape的异同
前面我们介绍过【SpriteShape】,也可以创建2D 地形或路径。
- 共同点:
- 他们都是用于制作2D游戏的场景或地图的。
- 不同点:
- SpriteShape可以让地形有弧度,TileMap不行。
- TileMap可以快捷制作有伪“Z”轴的地图,SpriteShape不行。
3、3D中使用TileMap
TileMap主要是用在2d游戏中,但是在3D游戏中其实也可以应用,参考:【unity实战】实现一个放置3d物品建造装修系统
一、Tilemap的使用
1、准备工作
1.1 从PackageManager中引入Tilemap包
如果你创建的不是2Dunity项目,可能需要自己手动去安装Tilemap包
,将图片的Sprite Mode设置为Multiple(多个),然后点击Apply(应用)按钮保存。
接着,点击Sprite Editor按钮,打开编辑工具。
在弹出的Sprite Editor窗口中,点击切片按钮,然后选择类型为Grid By Cell Size,设置切割尺寸,比如我这里设置了16x16(因为最小格瓦片就是16x16),最后点击切片按钮。
ps:你也可以选择然后选择类型为Grid By Cell Count,设置列数和行数,比如可以这里设置了25 23,这里的列数行数需要根据你自己整图的排版而定
我们可以看到,整图生成了一张张小格子纹理图:
2、创建瓦片画板
2.1 创建文件夹存放画板文件
先创建一个TipleMap
文件夹,用于下面存放画板文件。
2.2 打开平铺调色板
接着点击菜单:窗口>2D ->Tile Palette(平铺调色板)
2.3 创建瓦片调色板
此时会打开平铺调色板窗口,点击创建新调色板按钮,输入画板名字,比如New Palette,点击创建按钮,就保存在刚才创建的TipleMap文件夹下。
注意
:后面会单独介绍每种瓦片的具体使用,这里先用矩形网格举例。
瓦片调色板我们可以创建多个,然后在这里进行切换
2.4 创建瓦片调色器相关参数
(1) Name:瓦片调色器的名称
(2) Grid:瓦片的网格布局
Rectangle
:矩形瓦片Hexagon
:六边形瓦片。选择这个下面会多出一个参数。Hexagon Type:六边形瓦片地图类型,决定了六边形的旋转位置。
Point Top:点朝顶部的六边形
Flat Top:面朝顶部的六边形
Isometric
:等距瓦片,单元格为菱形
Isometric Z as Y
:等距瓦片并且将单元格 Z 轴转换为局部 Y 坐标
(3) Cell Size:瓦片绘制到单元格的大小
这里unity的翻译有点问题
- Automatic:基于瓦片资源的精灵大小自动设置
- Manual:自定义大小
3、创建瓦片
3.1 创建文件夹存放瓦片文件
先创建一个Tiles
文件夹,用于存放下面的瓦片文件。
3.2 生成瓦片文件
将整图拖入Tile Palette窗口中,选择瓦片保存目录为Tiles,即可将图片添加到画板中,并且生成瓦片文件。
3.3 单独保存某张瓦片
我们也可以只拖某张小图到画板中,单独保存某张瓦片,像这样子:
3.4 生成的瓦片文件参数介绍
(1) Preview:预览图
(2) Sprite:瓦片关联的精灵纹理
(3) Color:瓦片色调颜色
(4) Collider Type:碰撞器类型
- None:不生成碰撞器
- Sprite:基于精灵轮廓生成碰撞器形状
- Gird:基于瓦片单元格生成碰撞器形状
(5) unity6新增的属性
GameObject to Instantiate
要实例化的GameObject:置于瓦片地图上时要实例化的GameObject。Flags
标志:现在我也不清楚是干什么用的,官方文档也没写,后面有用到了再来补充
4、TilePalette瓦片调色板窗口基本操作技巧
4.1 单击瓦片——选择瓦片
4.2 在多个瓦片上移动——选择多个瓦片
4.3 Alt+鼠标左键拖动、按住鼠标右键、按住滚轮键拖动
——平移
4.4 旋转滚轮键——放大/缩小
4.5 编辑瓦片
注意
:点亮Edit编辑按钮才能编辑
复制删除
移动
- 选择工具(S)
- 移动工具(M)
- 画笔工具(B):使用选取器吸了一个图后,会自动切换到画笔工具,单个填充。点击格子会放置吸收的图。
- 框填工具(U):使用选取器吸了一个图后,再切换到框填工具,画一个框框进行范围填充
- 选取器工具(I):选取填充样本,相当于吸管吸一个图
- 橡皮擦工具(D)或者使用画笔工具时按住Shift,按住ctrl批量框这清除:单个擦除
- 填充工具(G):使用选取器后再切换到填充工具,批量填充
5、创建网格
5.1 创建
在Hierarchy视图空白处右键鼠标,点击菜单2D对象 -> 瓦片地图
。
ps
:可以看到这里的参数是和前面瓦片画板的Grid(网格)
参数类型是对应的,因为前面我们创建的是矩形画板,这里也选择矩形。
此时就会在场景中创建一个Grid / Tilemap
节点,此时在Scene场景中就可以看到一个个网格了。
5.2 Grid参数介绍
(1) Cell Size:网格单元格的大小
改成2x2效果
(2) Cell Gap:网格之间的间隔大小
间隙改成1x1
(3) Cell Layout:网格单元的形状和排列
如果前面创建时选错了类型,可以在这修改
- Rectangle:矩形瓦片
- Hexagon:六边形瓦片
- Isometric:等距瓦片,单元格为菱形
- Isometric Z as Y:等距瓦片并且将单元格 Z 轴转换为局部 Y 坐标
(4) Cell Swizzle:Unity 将 XYZ 单元格坐标重新排序为你选择的类型
5.3 Tilemap参数介绍
(1) Animation Frame Rate 动画帧速率
播放瓦片动画的速率,相当于倍速
(2) Color 颜色
瓦片色调颜色
(3) Tile Anchor 平铺锚
瓦片的锚点偏移
(4) Orientation 方向
瓦片地图上瓦片的方向,相当于 2D 平面使用的是 Unity 中的哪两个轴
5.4 Tilemap Renderer参数介绍
(1) Sort Order 排序次序
设置所选瓦片地图上的瓦片排序方向,其实就是选择原点在哪。
(2) Mode 模式
选择渲染器的渲染模式。
- Chunk:按位置对瓦片进行分组,并将瓦片精灵一起批处理进行渲染,性能较好。
- Individual:单独渲染每个瓦片,会考虑它们的位置和排序顺序。会让瓦片精灵和场景中其他渲染器或自定义排序轴进行交互。
- SRP Batch:选择此模式可以使瓦片渲染器组件与可脚本渲染管线批处理程序兼容,一旦满足兼容性要求。注意:此模式仅在通用渲染管线版本 15 及以上版本中受支持。此渲染模式按瓦片的位置和它们精灵使用的纹理对瓦片进行分组,然后批量渲染。只有当具有相同纹理的组按照渲染器排序顺序选择的方位顺序排列时,才会动态地将它们批量在一起。
(3) Detect Chunk Culling Bounds 检块剔除边界
渲染器如何剔除瓦片地图的边界,就是超出瓦片的范围不渲染的方式。
- Auto 自动:渲染器会自动检查瓦片使用的精灵,以确定要使用的扩展剔除边界。
- Manual 手动:用于扩展瓦片地图块裁剪边界的值是手动设置的,而不是使用编辑器的自动检测。
- Chunk Culling Bounds 区块剔除边界
仅当将检测块裁剪边界设置为手动时,此属性才可见。
- Chunk Culling Bounds 区块剔除边界
其他参数都和SpriteRenderer组件一样,具体可以参考:【零基础入门unity游戏开发——2D篇】SpriteRenderer精灵渲染器组件
6、在网格上刷瓦片
6.1 画出瓦片
打开刚刚的Tile Palette画板窗口,点击画笔(顶部第三个按钮,快捷键B),然后选中你要绘制的瓦片,在场景的格子中按住鼠标拖动即可在网格中连续画出瓦片了,如下:
不过这里我们发现了一个问题,瓦片图片并没有铺满一个格子,这是为什么呢?
6.2 解决瓦片没有占满格子的问题
瓦片图片没有铺满格子的问题,是因为在Unity中,一个单元格绘制多少像素是由图片本身设置决定的,我们选择瓦片整图,可以看到Pixels Per Unit是100,它表示一个单元格显示100个像素。
而我们一个瓦片图片的尺寸是16 x 16,
所以,想要让瓦片铺满一个格子,我们把Pixels Per Unit设置为16即可。
可以看到,现在瓦片刚好铺满一个格子了。
6.3 解决瓦片之间有缝隙的问题
方法一 像素风素材
虽然瓦片铺满了格子,但是它们之间是有缝隙的,而且图片模糊,我们在Game视图中观察可能会更清楚一点,如下:
解决办法是把瓦片整图的Filter Mode设置为点(无过滤器),
可以看到现在没有缝隙了,图片也清晰了
方法二 非像素风素材
使用Tilemaps时的一个常见问题是图块之间显示的间隙
如果你不是像素风的素材,我们还可以创建了一个Sprite Atlas来将Spritesheet拖入其中
把你的瓦片素材拖入
效果
6.5 旋转和翻转瓦片快捷键
旋转瓦片:[ ]
键
翻转瓦片:shift + [ ]
键
7、擦除瓦片
画瓦片的时候,可能不小心画错了,需要擦除。
我们只需在画板工具上点击橡皮擦按钮(快捷键D
),然后在网格中点击即可擦除对应的瓦片,如下:
8、区域瓦片绘制
我们可以在画板找那个选中一个区域的瓦片,就可以直接在网格中一次画出来了,如下:
9、瓦片吸取
我们可以在画板中选择瓦片然后在网格中画,我们也可以直接在网格中通过吸取工具(快捷键I)选择对应的瓦片,如下:
10、填充瓦片
我们可以给一个闭包的区间填充瓦片(快捷键G),选中瓦片,然后在一个闭包的区域点击一下即可填充,如下:
11、瓦片分层(渲染顺序)
瓦片地图中有多层时,可以再这里选择层级进行绘制
我们可以创建多个Tilemap,比如我创建了一个Tilemap2用来绘制柱子,
我们可以看到柱子的层与地面的层的渲染顺序不对
我们希望地面的层在前面,只需要选择地面的Tilemap把Order in Layer调大即可,比如调成1。(柱子层的Order in Layer是0)。
现在渲染顺序就对了,
12、添加碰撞体
12.1 添加Tilemap Collider 2D碰撞体
注意:想要生成碰撞器的瓦片
Collider Type
(及前面每个瓦片的碰撞器类型) 类型要进行设置,不能为 None
我们的主角需要能够站在地面上,所以地面层的Tilemap需要添加碰撞体,我们给地面层的Tilemap节点添加Tilemap Collider 2D组件,如下:
我们可以看到地面层的瓦片都带上了碰撞体。
12.2 合并碰撞体
我们可以看到,碰撞体是一格一格的,为了提升性能,建议把碰撞体进行合并,只需要在地面层的Tilemap节点再挂一个Composite Collider 2D组件(它会自动再挂一个Rigidbody 2D组件)。
将Rigidbody 2D组件的Body Type设置为Static(静态),否则地面会受到重力往下掉。
将Tilemap Collider 2D组件的Used By Composite(使用复合)勾选上,这样碰撞体格子会进行合并。
合并后的碰撞体如下:
12.3 自定义编辑图片的物理碰撞区域
默认的瓦片碰撞可能并不是你想要的,这时候就需要去编辑图片的物理形状了
调整完选刷新才会生效
效果
12.4 去除部分瓦片碰撞效果
有些瓦片我们可能不需要碰撞效果,比如花草等,这时我们可以打开对应的tile修改碰撞类型为none即可
13、瓦片透视排序
我想要站在它后面的选项,以给人一种深度的错觉。
为此,我们将使用Y轴而不是Z轴排序。这样,屏幕上的资产越高,它就会渲染到最后面
根据您的渲染管线,打开它的渲染首选项,将透明度排序模式设置为自定义轴并切换Z和Y值。
如果是URP项目,URP项目的配置和前面其实类似,只不过配置文件信息被放到Renderer 2D Data文件中了而已
在最右边的Tilemap Renderer:将Mode设置为Individual
把对应图片的轴心放在底部
为了使其更加准确,我们可以更改角色的轴心位置也在底部
并修改角色的精灵排序点为轴心
效果,可以看到,角色在栅栏上角色在后,角色在栅栏前角色在前
三、 Isometric Z as Y 的等距瓦片调色板
1、什么是等距瓦片?
等距瓦片地图为六边形瓦片,但是它将瓦片分为了两部分,一部分用于表示地面,一部分用于表示高度。
像是上图这种形式的瓦片,白色部分用于表示地面,而棕色部分则是代表高度,并且这些瓦片的高度可以进行堆叠,实现类似2.5d的效果。
这是Unity给出的示例,实际上是用下面这种等距瓦片绘制的。
2、 创建模式为 Isometric Z as Y 的瓦片调色板
3、导入等距瓦片素材及配置
将资源拖入其中,拖拽资源进去,会发现资源和瓦片格子不适配。
原因是在调色板中默认会将图片的中心点和菱形的中心点重合,我们这里需要在 Sprite Editor 窗口中调整 Sprite 的中心点(轴心)的位置在菱形的中心即可
调整好后,方块的上表面即可与菱形平面对齐
4、创建等距瓦片地图网格
在Hierarchy视图空白处右键鼠标,点击菜单2D 对象 -> 瓦片地图 -> 等距z作为Y
5、绘制等距瓦片
5.1 直接绘制
直接把等距的瓦片进行绘制上去,会发现有点奇怪。
5.2 自定义排序模式
因为 Unity 内部设置的原因,我们需要修改URP项目的配置文件,修改透明度排序模式为自定义渲染,调整透明度排序轴为(0, 1, -0.26)
(这是一个固定的数值)。
如果是非URP项目,则在项目设置里修改
5.3 修改瓦片渲染器模式
改了之后还是不起作用,因为我们还把瓦片地图的瓦片渲染器中修改模式为individual
。渲染顺序就会作用生效了。
5.4 效果
可以看到渲染表现正常了
6、绘制更改瓦片z轴位置
假如不改变瓦片原始精灵图片的轴心点的话。
可以把下方的框拉起。取消勾选锁定z轴位置,为每一张图片手动设置高度。
吸住瓦片丢到场景中去的时候,按+号或者-号调整其中的位置。蓝色的框代表当前瓦片z的位置。
这样我们就可以完全不改变瓦片原始精灵图片的轴心点,而是在绘制时动态的去手动设置高度,或者在瓦片调色板为每一张图片手动设置高度。
这里加入了一个模拟z轴的概念。可以在同一个砖块,放不同z轴的瓦片。相当于在同一砖块中,是存在z轴的。在同一个砖块的不同z轴是可以同时渲染的。橡皮擦也会受z轴影响。比如擦z=0的平面的时候擦不到z=1的平面的瓦片。
三、Tilemap Extras官方拓展包
1、安装Tilemap Extras扩展包
如果没有安装的,先去安装Tilemap Extras扩展包,并导入相关示例,方便我们后面学习使用。
拓展包为 Tilemap 添加新的瓦片类型,帮助我们更加方便的编辑 2D 场景
记得使用都是拖入我们配置的瓦片进入调色板,就可以和前面一样绘制了
2、规则瓦片 Rule Tile(重要
)
实战参考:
- 【实现100个unity游戏之20】制作一个2d开放世界游戏,TileMap+柏林噪声生成随机地图
- 【unity实战】手戳一个类似星露谷物语的建筑系统
- 【用unity实现100个游戏之13】复刻类泰瑞利亚生存建造游戏——包括建造系统和库存系统
2.1 Default Sprite:默认图片
不满足任何四面八方规则时显示的图片。
2.2 Default GameObject:默认游戏对象
默认瓦片可以关联游戏对象,但是一般不会关联。
实战参考:【unity实战】2d血液飞溅喷射到墙上和TileMap上,留下血迹的效果
2.3 Default Collider 默认碰撞器规则
- None:不生成碰撞器
- Sprite:基于精灵轮廓生成碰撞器形状
- Gird:基于瓦片单元格生成碰撞器形状
2.4 Tiling Rules:平铺规则,可以自己添加删除
(1) 单一瓦片
瓦片规则的设置特别简单,就是设置那个九宫格。
当整个九宫格都满足自己设置的条件时,九宫格中央区域将显示最右方选择的图片
在右边的九宫格内左键单击可以选中 ✔️,表示这个九宫格位置有图片;右键单击可以选中 ❌,表示这个九宫格位置没有图片,双击可以切换选中形态
九宫格中间可以设置旋转
,这样我们就不用自己设置旋转之后的规则了。
例如下面的规则,当该瓦片上边和左边没有瓦片,且下边和右边有瓦片时,显示右侧精灵图。如果旋转该瓦片之后也符合规则,则旋转精灵图并显示。
再比如下面的规则,如果四边都没有瓦片,就显示该精灵图。并且没有设置旋转。
实例
效果演示,绘制会按配置的九宫格自动选择对应的瓦片填充区域
(2) 随机瓦片
适合做一些地图加工,比如随机添加花草树木
绘制效果
(3) 动画效果瓦片
这个和下面的Animated Tile,实现的效果其实是一样的,比如下面做的形成2d水流瀑布的效果
2、动画瓦片 Animated Tile
可以指定序列帧,产生可以播放序列帧动画的瓦片,比如下面做的形成2d水流瀑布的效果。其实前面RuleTile的动画效果瓦片实现一样的效果。
- Number of Animated Sprites:动画有多少张图构成
- Minimum Speed:最小播放速度
- Maximum Speed:最大播放速度
- Start Time:开始播放的时间
- Start Frame:从哪一帧开始播放
- Collider Type:碰撞器规则
- None:不生成碰撞器
- Sprite:基于精灵轮廓生成碰撞器形状
- Gird:基于瓦片单元格生成碰撞器形状
效果演示
运行,我们流动的瀑布效果就实现啦!
3、规则覆盖瓦片 Rule Override Tile
在规则瓦片的基础上,改变已经设置的规则对应的图片
4、高级规则覆盖瓦片 Advanced Rule Override Tile
在规则瓦片的基础上,改变已经设置的规则与对应的图片,可以通过选择已有Rule Tile,启动禁用进行批量替换,是上面的更高级用法
四、笔刷类型
1、GameObject Brush 游戏对象笔刷
可以在场景中选择和擦除游戏对象,仅限于选定的游戏对象的子级。
- 勾选改变z轴的选项后按+或-也可以改变z轴。
遇到比较大的瓦片,如何绘制呢?比如房子,树等等
当然,把房子分成几部分,分开绘制也是可以的,但是我建议是先把它弄成一个预制体
并将瓷砖Pallete的笔刷更改为GameObject笔刷
效果
2、Group Brush 组合笔刷
可以设置参数,当点击一个瓦片样式时,会自动取出一个范围内的瓦片。
- 吸取的范围根据Gap和Limit确定。
- Gap决定x、y、z遇到几个空格之后就不继续扩充吸取的范围。
- Limit决定最大的吸取范围,从0开始。
比如下图,Limit xyz填3会x和y最多吸4个格子,Gap空格数满足x小于1y小于2就会被连接起来纳入吸收的范围。
3、Random Brush 随机笔刷
可以指定瓦片进行关联,随机刷出对应瓦片。
- Tile Set Size瓦片大小,是设置刷瓦片时一次刷几个格子。
设置随机图片数量和格子数量。选择关联的图片。假如XY填22的话下面每个TileSet就有4个图要关联,一次性画四个。
4、Line Brush 线性笔刷
决定起点和终点画一条线出来。
选择线性笔刷后点击画笔可以在瓦片地图中点击确定起点和终点,会用选择的瓦片连成线。
- Line Start Active 是否以上一次绘制的起点作为新的起点。
- Fill Gaps 自动填充,会把线画的更粗。
- 勾选改变z轴的选项后按+或-也可以改变z轴。
四、代码管理 Tilemap
Tilemap 组件:用于管理瓦片地图
TileBase 组件:瓦片资源对象基类
Grid 组件:用于坐标转换
使用它们需要引用命名空间:
using UnityEngine.Tilemaps;
using UnityEngine;
using UnityEngine.Tilemaps;
public class TileMap : MonoBehaviour
{
// 瓦片地图信息 可以通过它得到瓦片格子
public Tilemap map;
// 格子位置相关控制 可以通过它 进行坐标转换
public Grid grid;
// 瓦片资源基类通过它可以得到瓦片资源
public TileBase tileBase;
void Start()
{
// 1.清空瓦片地图
// map.ClearAllTiles();
// 2.获取指定坐标格子
TileBase tmp = map.GetTile(new Vector3Int(-2, 0, 0));
// 3.设置删除瓦片
map.SetTile(new Vector3Int(0, -4, 0), tileBase); // 设置
map.SetTile(new Vector3Int(-2, 0, 0), null); // 删除
// 4.替换瓦片
map.SwapTile(tmp, tileBase); // tmp 的所有瓦片将变成 tileBase
// 5.世界坐标转格子坐标
// 传入的参数是世界坐标
Debug.Log(grid.WorldToCell(new Vector3(0, 1, 0)));
}
}
运行效果
源码
https://gitcode.net/unity1/unity2d-tilemap

专栏推荐
地址 |
---|
【零基础入门unity游戏开发——C#篇】 |
【零基础入门unity游戏开发——unity通用篇】 |
【零基础入门unity游戏开发——unity3D篇】 |
【零基础入门unity游戏开发——unity2D篇】 |
【制作100个Unity游戏】 |
【推荐100个unity插件】 |
【实现100个unity特效】 |
【unity框架/工具集开发】 |
完结
好了,我是向宇
,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!