切割好素材之后,就可以使用图片资源了。拖拽图片到层级窗口就可以在场景中编辑地图,这是基础的方法。但它存在一个明显的问题就是如果创建一个关卡就需要反复的复制图片资源去调整位置,这样的效率是极其低下的。特别是在复杂的地图上,甚至更多的关卡中就需要消耗大量的时间。
所以使用unity提供的TileMap系统。
创建TileMap之后会在场景中出现Grid即网格,下拉菜单中重命名为Background
,使它成为背景并保存当前场景。
Window–2D–Tile Palette
在下拉菜单Create New Palette
中创建新的Palette命名为Map
,并保存在项目文件夹TileMap–TilePalette中。
拖拽切割好的图集到Map,并保存在目标文件夹TileMap--Tiles
中。
在这里如果需要对图集信息进行修改可以点击Edit按钮,使用上方的工具栏对当前图集进行操作,如果不进行修改,需要关闭Edit按钮
。
⚠️在Palette菜单中,有一栏Active TileMap
,它指的是当前激活的TileMap即地图画在哪一张TileMap上,可以在下拉菜单选择对应的想画的平台。每次进行操作前需要留言当前激活的TileMap是谁。
首先将MainCamera的大小改为7
层级窗口中选中Grid--Background
,在Paletee中选中需要的瓦片,使用方格工具可以在场景中大面积绘制地图信息。
⚠️当删除瓦片信息,就会漏出背景的样子,并且后续加载player时需要它放置在平台上而不与背景发生碰撞,所以需要在Grid下创建新的TileMap存放平台等。
使用unity官方2D-Extra扩展包为TileMap系统增加额外的功能。
官方地址:https://github.com/Unity-Technologies/2d-extras
在网络条件良好的情况下,复制git地址栏。
https://github.com/Unity-Technologies/2d-extras.git
在菜单栏Window -- Package Manager -- Add package from git URL
添加地址
安装好了之后,在新建文件夹右键菜单中可以看到增加的扩展包里各样式的瓦片.
创建一个RuleTile命名为Ground,即按照规则生成一个瓦片,在右侧的Inspector添加瓦片的规则:
在图片的九宫格中,中心表示图片位置,外围表示图片周围的8个方向。绿色箭头表示当前选择图片的箭头方向可以生存图片,反之红叉表示指定方向不能生成。
将定义好规则的Ground拖入Tile Paletee中,接着在Platform上绘制方格如图左侧所示,绘制出来的就是一个按照规则中心为空的四周有围墙的网格。
在实际绘制的过程中,可能存在以下情况,在拐角的地方呈现直角,造成内角缺失。
添加四个内角进行填充,并将空白处的八个方向全部填充。如下图所示:
用同样的方法为背景图添加规则瓦片,相比1.4的背景周边已经添加了规则,显得更加真实。如下图所示:
修改Sorting Layer
为游戏场景添加层级,可以添加一个Background的层级,谁在下面谁会优先显示。
由此,根据前四步使用TileMap绘制出自己的游戏场景如下图
现在的场景虽然画在不同的图层上,其实都是图片,图片与图片之间没有真实的物理模拟效果。需要创建的人物,环境因素或者敌人都需要站在平台上。,所以要为Platform添加TileMapCollider2D碰撞体,使它能与其他物体产生物理的碰撞。
通过上图可以发现,platform上有很多绿色的格子,这其实是为平台上的每一个瓦片都添加了一个盒型碰撞器。如果绘制平台的瓦片不是正方形,就会导致平台表面不平整,人物移动的过程中出现问题。此时需要添加一个额外的碰撞体,Composite Collider2D
,同时也会添加一个刚体。
将刚体的Body Type改为Static
,固定不变的,保证游戏运行场景不会掉落出屏幕。需要注意的是,当BodyType为Dynamic,把Gravity Scale修改为0,场景同样不会掉出屏幕,但是它会受到物理碰撞的影响,比如人物跳跃到平台会带着平台一起掉落。
此时场景中是一块一块的碰撞体,最后还需要把TileMapCollider2D的Used By Composite勾选上
将场景变为一整块碰撞体。
创建一些可以互动的物体来构成场景的背景元素增加游戏的乐趣。找到素材中提供的一些场景元素,把他们拖动到层级目录。
使用这些场景元素之前,需要更改他们的像素单位改为32Pixels Per Unit -- 32
,过滤模式改为点采样模式Filter Mode -- Point
,Point屏幕像素会去找最近的贴图像素点来作为输出,这种比较生硬,但是性能好,不抗锯齿。还有压缩改为NoneCompression -- None
。
以椅子为例子,把它拖拽到层级目录,修改Order in Layer为1
置于场景上层。并为它添加刚体组件Rigidbody2D
,主要考虑Mass质量和GravityScale重力比例。重力默认的设置是-9.8模拟向下的重力,质量并不会影响重力向下落的速度。
如果是添加一个碰撞体BoxCollider2D,它会把盒子内空余的部分也作为碰撞体,如果椅子的旋转角度是侧方向的,那么将不是一个真是的落地效果。为了在游戏中模拟炸弹爆炸的时候可以把周围的所有的物体炸飞,所以需要添加一个多边形碰撞体PolygonCollider2D
。使用EditCollider拖拽形状点编辑角度使它更模拟真实的椅子角度,如下图所示。
遵照上述的方法同样为其他的场景物体添加多边形碰撞体,主要分为三步:
当游戏启动,所有的环境物体受重力影响掉落到平台底部,下面是启动游戏后的截图。
当场景中的物体叠加在一起时候,启动游戏游戏物体之间会产生碰撞。如下图所示,瓶子叠在桌子上,与桌子发生了碰撞。
在unity的层级菜单中的Layer选项系统默认设置了一些图层,这些图层之间其实是存在碰撞关系的。
打开2D碰撞环境,菜单 ——Edit—— project settings ——Physics 2D
红色框选的区域是系统默认的图层。勾选中表示当前游戏物体图层可以与其他各图层发生碰撞关系。
游戏人物在移动的过程中是不与游戏中的北京发生碰撞的,只是在进行攻击的时候才与这些物体发生碰撞。所以需要给游戏物体设置不同的layer让他们之间拥有不同的碰撞关系。
不同质量的游戏物体在受力的过程中会有不同反应。比如将桌子重力mass修改为3,那么它就比重力为1的瓶子受重能力越强。
Rigibody2D的collision Detection
检测碰撞的关系,修改为continues
。让它持续不断的检测碰撞的环境,避免在后续快速移动过程中穿过墙壁碰撞体。
Assets下创建文件夹Prefabs,保存预制体。