几次想要实现割草游戏都因为各种原因劝退,如今终于有一点时间做些demo+分享,立帖做个学习记录。
源码会免费放在官方商店中…
先看第一期的效果。
暂时实现了怪物追踪主角,动态创建不同速度,不同大小的对象。
以及简易的测试攻击来回收怪物。
以前尝试过用其他的方式实现怪物不重叠,即用过物理引擎,也用过纯粹的AABB控制怪物方向。效果多少有些差强人意。
其中物理引擎的方式不确定是不是自己的使用不当,300+个对象就会出现较严重的掉帧现象,而且当时没有优化怪物的出生逻辑,一旦怪物出生在已经扎堆的怪物之中,刷新出一个重叠的怪物,那一瞬间的顿挫让自己怀疑是不是要蓝屏了。
因此找寻了几个资料后尝试使用RVO解决问题,这里贴出两个git上的RVO TS实现。
https://github.com/shangdibaozi/RVO
https://github.com/kylin206/RVO2-TS/blob/master
demo中目前用的是第一个链接的算法,大致看了下应该差别不是很大。
目前测试的瓶颈大概600个挤压在一起同时避障就会出现掉帧的情况。不过对于一般的割草类游戏来说,理论上不需要同屏达到如此多的怪物数量。毕竟其中弹道,技能等效果并不需要RVO来管理。
RVO的原理之前看过大概,在这里不做深入的讨论,有兴趣的同学可以参考这位大佬的讲解,算是我接触过的讲解中最“平易近人”的大哥了。
https://www.bilibili.com/video/BV1wg4y1E7Ht/?buvid=ZB4A52B7B0779DEE420781585CA5671B7C06&is_story_h5=false&mid=3lLjzBGZvQ6W0lQ19bNq2Q%3D%3D&p=1&plat_id=116&share_from=ugc&share_medium=iphone&share_plat=ios&share_session_id=09BC9AEE-689A-4811-A40B-01A8A647CC13&share_source=WEIXIN&share_tag=s_i×tamp=1680503877&unique_k=m9og2Ey&up_id=5981196
接下来是demo中的核心部分,因为只是实现效果,代码仅供参考,客观门还请海涵。
首先是设置RVO的默认计算参数
如图所示,各个参数的定义照搬大佬的描述,mass还有些模糊,没有经过严格的测试但是目前感觉应该是对象在进行速度调整和偏移时的一个类似灵敏度的参数,暂时理解为质量?(越重越是难掉头)
后续稍稍修改了一些Simulator中的代码让agent支持不同的半径,最大速度等参数。
可以理解为每一个怪物在RVO中有一个对应的agent对象。
我们不再用直接代码去修改物体的速度,而是修改agent对象的期望线速度。(setAgentPrefVelocity)
在当前demo中自然就是当前位置和被追踪主角的 方向向量*预设给agent的最大速度了。
然后在设置怪物实际的位置之前,要保证RVO算法正常计算完。如图:
至此就几乎完成了怪物依托RVO算法追踪主角的全部逻辑。
第二期:
割草demo 第二期 合批shader(受击、内发光、消融) 受击击退 四叉树 - Creator 3.x - Cocos中文社区