非专业UnitySRPG游戏开发笔记——修改RuleTile使其可以在不同种Tile之间应用平铺规则

在Unity使用Tilemap制作SRPG的瓦片地图时,有时会用到RuleTile来刷地形,RuleTile可以用一种瓦片直接画出一个包边的地形。例如画一个被海洋包围的小岛

RuleTile的平铺规则对于周围的八个方位,只能设置三种判定条件:“不关心”、“有瓦片”、“无瓦片”,另一种瓦片均视为“无瓦片”。在同一个瓦片地图里,如果要在小岛上画另一种瓦片,那结果就会是,这另一种瓦片的旁边的草地就变成了小岛的海岸。比如画条河。

要将岛上的河流和岛上的草地正确衔接起来,就得平铺规则改成视另一种瓦片为“有瓦片”。


一、修改官方包中的.cs文件
为使用RuleTile,通常会在包管理器的Unity注册表下添加名为2D Tilemap Extras的官方包,以此方法添加的包,在修改cs文件后,编译时会报immutable asset错误,即该包为只读的,而后Unity以修改前的状态开始播放,即修改被无效化,再回到VS时cs文件也被重置到修改前的代码。
因为每个添加的官方包都会在项目文件目录下的Library\PackageCache中从服务器上下载对应的包,当检测到包里编译的文件与服务器上的标准版本不一致时,会无效化修改,并使用标准版本重置你修改的部分。
为避免官方包的检测和重置,就不要通过Unity注册表把包添加到我们的项目中。操作方法如下:从PackageCache复制你想要的包,并放到其他地方,然后在包管理器里将其移除,再通过包管理器添加来自磁盘的包。这样一来包就会收纳在自定义那里,下面就可以开始修改了。




二、修改RuleTile.cs和SrpgTileEditor.cs
想要有选择地使用:将视不同种瓦片视为“有瓦片”的规则,需要在RuleTile.cs里添加bool变量和修改检测方法,在SrpgTileEditor.cs里添加bool变量的GUI勾选框。
(1)在RuleTile.cs的RuleTile类里添加成员变量:

(2)在RuleTile.cs的RuleTile类里修改RuleMatch方法:
修改前:
参数neighbor是规则矩阵某一方位的判定条件,有“有瓦片”、“无瓦片”、其他值(“不关心”),参数other是处于规则矩阵中这一方位的瓦片。该方法的作用就是把另一种瓦片视为“无瓦片”,返回false,所有方位都会做一次这样的检测,其中有一个false,就会使该规则不匹配,RuleTile不会变成该规则指定的图片。
修改后:
当被检测的neighbor被设置为绿色箭头时(即TilingRule.Neighbor.This):
①如果m_CheckAnyTile为true,返回检测结果为被检测的瓦片是否为非空。
②如果m_CheckAnyTile为false,返回检测结果为被检测的瓦片是否与中间的瓦片是同种瓦片。
当被检测的neighbor被设置为红色交叉时(即TilingRule.Neighbor.This):
①如果m_CheckAnyTile为true,返回检测结果为被检测的瓦片是否为空。
②如果m_CheckAnyTile为false,返回检测结果为被检测的瓦片是否与中间的瓦片不是同种瓦片。
返回结果被修改为如果CheckAnyTile勾上了,被检测的方位有瓦片的话,则视为“有瓦片”。

(3)在SrpgTileEditor.cs的RuleTileEditor类里修改OnInspectorGUI方法:
修改前:
修改后: