运行时,通过按住鼠标左键拖动创建资产,可设置笔刷半径,创建资产的密度,运行效果如下:
逻辑梳理:
笔刷显示:添加一个Sphere的静态网格体,每隔0.1s拿一次鼠标的位置,设置Sphere的位置(Tick每秒执行60次,频率太高了,所以用timerhandle去刷新)
资产创建:依次在鼠标扫过的区域创建资产,假设鼠标当前在绿色部分,就在阴影部分创建资产
新增鼠标扫过的面积:我是用动态网格体的ApplyMeshBoolean基于第二个网格体进行并集运算,鼠标每次移动新增区域(如下阴影部分)的面积 = 整个网格体的面积 - 上次网格体的面积
要创建资产的位置:以当前鼠标为圆心形成的正方形内部随机取点,满足 1. 到圆心的距离小于半径(保证在笔刷半径内)2. 与鼠标之前经过的所有圆的圆心距离不小于半径(不与之前的位置重复)
鼠标点击事件不响应,获取鼠标位置看第一篇
整体逻辑:
实现:
1.创建两个动态材质,一个临时记录每次笔刷的圆形区域,一个将每次笔刷生成的圆形区域并集成一个整体
2.创建TimerHandle,生成笔刷(通过测试笔刷的半径正好是sphere的50倍,比如半径1000,sphere的scale是20)
3.创建资产
3.1 获取鼠标当前扫过的新增区域(之前创建过资产的位置就不再创建)
如果给动态网格体添加材质(未创建资产时)可以看到如下效果:
3.2 获取要创建的资产总数(因为用户输入的半径乘了100,所以这里面积除以10000,总数算法需要优化)
3.3 笔刷当前位置与地面相交的圆形区域的外接矩形内随机生成一个坐标
3.4 判断当前随机位置是否跟之前的位置重复
3.5 获取贴地位置(设置资产的位置是世界坐标,所以射线检测拿的也是世界坐标)
3.6 创建资产
3.7 删除资产
同上一篇,运行时创建的资产,下次打开就没有,所以可以资产位置本地存储或者存到服务器,下次打开的时候根据保存的数据创建。