2D地形九宫格笔刷

前言

参考地址:War3 魔兽争霸悬崖地形算法

主要思路如下

  1. 划分cell的内部格子为0001,0010,0100,1000四部分
    img

  2. 在笔刷采样时采样划分出的小格
    image-20220810195820987

  3. 计算每个cell被采样到的小格之和作为weight权重,用weight来采样对应texture,
    如上图中image-20220810200104542最终采样的结果为image-20220810200154620

    采样地形纹理贴图:
    img

    最终结果:

    img

实现过程

  • 主要通过Odin设计编辑器+ScriptableObject记录笔刷数据、地图数据、笔刷资源的方式
  • 对地图中所有cell生成对应的4个小格brushCell,整合为Sample Map,通过射线方式采样九宫格范围内的brushCell,同时记录下对应实际地图cell的weight,最终通过每个cell的weight采样获取对应的贴图

项目使用

创建地图

  • 在Tools/2DBrush中打开编辑界面
  • 放置一个GameObject作为地图cell存放的parent,这里取名为MapRoot
  • 在Map/MapConfig中右键创建MapConfig,并配置地图数据参数
    image-20220810201018401
  • 在MapMenuEditor中选择对应的MapConfig,读取对应的配置信息,在修改后可以通过save map Asset进行保存
    image-20220810201126107
  • 将MapRoot的物件拖入到界面的MapRoot中,点击GenerateMap可以生成地图
    image-20220810201258281

Tips:注意因为二维数组不支持序列化,所以在编译后会导致MapRoot中存储的地图Grid的GameObject消息丢失,这时需要在GenerateMap界面中选择对应的MapConfig和拖入MapRoot后点击Reload Map重新生成,后面可能会改成直接用child的顺序index来获取对应位置或者更改可序列化数据结构,也可以通过列表mapCells来重新加载二维数组Grid

地图笔刷

  • 在Map/BrushConfig中创建笔刷配置BrushConfig,在Map/SampleConfig中创建2D采样贴图配置BrushConfig主要用于显示划分小格,
    image-20220810201653267

  • 打开MapMenuEditor中的MapBrush,选取对应的MapConfig和BrushConfig,随后拖入生成的地图MapRoot

    image-20220811190639882

  • 进行笔刷

    • Single笔刷:对单个cell进行贴图笔刷,拖入对应的singleMat作为刷子,点击StartBrush生成小格权重图覆盖在MapRoot上方,进行笔刷操作,左键刷材质,结束后点击StopBrush关闭采样图
      image-20220811190614291

    • Sample笔刷:输入划分的行数SplitNum,选择对应的SampleConfig,点击StartBrush生成小格权重图,左键点击小格进行选取,笔刷范围为小格为单位的九宫格,在选取结束后点击SampleTexture根据权重采样对应贴图,结束笔刷则点击StopBrush关闭采样图
      采样方式

      • Texture:直接用美术给出的图进行UV切分采样到对应的小格,在实现的过程中用MaterialPropertyBlock进行优化

        优化代码:image-20220811193056962)
        对shader的修改:image-20220811191210374

      • SO:需要先在Map/SampleConfig/中配置好对应的采样配置asset
        image-20220811191403863
        在SampleConfig中选择
        image-20220811191441290

      采样小格:

      image-20220810211518001
      采样贴图:
      image-20220810211631954

      整体过程:
      笔刷流程

Tips:

  • 在StartBrush后会隐藏掉BrushType,不能切换,点击StopBrush后才能切换
  • 如果发现BrushMap时mapRoot脚本因为重新生成了地图而丢失,可以点击RefreshRoot按钮重新获取
    image-20220811193915001