2D地形笔刷探索
2D地形九宫格笔刷
前言
参考地址:War3 魔兽争霸悬崖地形算法
主要思路如下
划分cell的内部格子为0001,0010,0100,1000四部分
在笔刷采样时采样划分出的小格
计算每个cell被采样到的小格之和作为weight权重,用weight来采样对应texture,
如上图中最终采样的结果为采样地形纹理贴图:
最终结果:
实现过程
- 主要通过Odin设计编辑器+ScriptableObject记录笔刷数据、地图数据、笔刷资源的方式
- 对地图中所有cell生成对应的4个小格brushCell,整合为Sample Map,通过射线方式采样九宫格范围内的brushCell,同时记录下对应实际地图cell的weight,最终通过每个cell的weight采样获取对应的贴图
项目使用
创建地图
- 在Tools/2DBrush中打开编辑界面
- 放置一个GameObject作为地图cell存放的parent,这里取名为MapRoot
- 在Map/MapConfig中右键创建MapConfig,并配置地图数据参数
- 在MapMenuEditor中选择对应的MapConfig,读取对应的配置信息,在修改后可以通过save map Asset进行保存
- 将MapRoot的物件拖入到界面的MapRoot中,点击GenerateMap可以生成地图
Tips:注意因为二维数组不支持序列化,所以在编译后会导致MapRoot中存储的地图Grid的GameObject消息丢失,这时需要在GenerateMap界面中选择对应的MapConfig和拖入MapRoot后点击Reload Map重新生成,后面可能会改成直接用child的顺序index来获取对应位置或者更改可序列化数据结构,也可以通过列表mapCells来重新加载二维数组Grid
地图笔刷
在Map/BrushConfig中创建笔刷配置BrushConfig,在Map/SampleConfig中创建2D采样贴图配置BrushConfig主要用于显示划分小格,
打开MapMenuEditor中的MapBrush,选取对应的MapConfig和BrushConfig,随后拖入生成的地图MapRoot
进行笔刷
Single笔刷:对单个cell进行贴图笔刷,拖入对应的singleMat作为刷子,点击StartBrush生成小格权重图覆盖在MapRoot上方,进行笔刷操作,左键刷材质,结束后点击StopBrush关闭采样图
Sample笔刷:输入划分的行数SplitNum,选择对应的SampleConfig,点击StartBrush生成小格权重图,左键点击小格进行选取,笔刷范围为小格为单位的九宫格,在选取结束后点击SampleTexture根据权重采样对应贴图,结束笔刷则点击StopBrush关闭采样图
采样方式Texture:直接用美术给出的图进行UV切分采样到对应的小格,在实现的过程中用MaterialPropertyBlock进行优化
优化代码:)
对shader的修改:SO:需要先在Map/SampleConfig/中配置好对应的采样配置asset
在SampleConfig中选择
采样小格:
采样贴图:整体过程:
Tips:
- 在StartBrush后会隐藏掉BrushType,不能切换,点击StopBrush后才能切换
- 如果发现BrushMap时mapRoot脚本因为重新生成了地图而丢失,可以点击RefreshRoot按钮重新获取