欢迎光临散文网 会员登陆 & 注册

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

2021-07-11 23:49 作者:汉人吃汉堡  | 我要投稿

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

包边的草地小岛

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

这肯定不是想要的结果

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

这是想要的结果

一、修改官方包中的.cs文件

  为使用RuleTile,通常会在包管理器的Unity注册表下添加名为2D Tilemap Extras的官方包,以此方法添加的包,在修改cs文件后,编译时会报immutable asset错误,即该包为只读的,而后Unity以修改前的状态开始播放,即修改被无效化,再回到VS时cs文件也被重置到修改前的代码。

  因为每个添加的官方包都会在项目文件目录下的Library\PackageCache中从服务器上下载对应的包,当检测到包里编译的文件与服务器上的标准版本不一致时,会无效化修改,并使用标准版本重置你修改的部分。

  为避免官方包的检测和重置,就不要通过Unity注册表把包添加到我们的项目中。操作方法如下:从PackageCache复制你想要的包,并放到其他地方,然后在包管理器里将其移除,再通过包管理器添加来自磁盘的包。这样一来包就会收纳在自定义那里,下面就可以开始修改了。

添加来自磁盘的包
选择package.json文件
添加成功,可以修改包里的cs文件了

二、修改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方法:

  修改前:

  修改后:


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

分享到微博请遵守国家法律