割草demo 第一期 RVO应用

几次想要实现割草游戏都因为各种原因劝退,如今终于有一点时间做些demo+分享,立帖做个学习记录。

源码会免费放在官方商店中…
先看第一期的效果。
Cocos Creator - snake - Google Chrome 2023-04-03 14-07-08 (1)

暂时实现了怪物追踪主角,动态创建不同速度,不同大小的对象。
以及简易的测试攻击来回收怪物。

以前尝试过用其他的方式实现怪物不重叠,即用过物理引擎,也用过纯粹的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&timestamp=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中文社区

17赞

继续加油呀!

我写了个差不多的游戏,最近不想维护了。准备免费开源了

3赞

棒棒的朋友~

嗯嗯 正在加四叉树,商店的免费demo还在审核 后面再发出来

上线微信赚钱啊

Mark 111

点赞楼主的探索和分享精神

最近也正好写完了这部分,和你进度差不多。
学习下,看有没有自己可以优化的地方~

赚不了多少钱,不如分享出来。

没事,赚大钱六七分看天,先进行自己感兴趣的技术积累优先级高一点。 :grinning:

确实,所以直接放出来。现在有点bug未修复,等过段时间有时间把bug改了。直接放出来

嗯嗯,点赞!!

卧槽,我前段时间还在搞这个,愣是没看懂rvo2,但是直接引包用了起来

哈哈哈 共勉共勉,我也是做个学习记录。 :rofl:

能私聊一下 发个包吗, 刚好最近也要用到 ,学习一下

加上四叉树后现在最多能支持 几个单位呢 ,

不好意思才看到,我找个时间改点东西直接放git吧

已经解决了哈

大佬想问一下 Simulator 中的 addObstacle 是设置路障的方法吗?我试了一下好像没有成功,以及addObstacle传的参数是什么意思,我在想是不是我理解错了

RVO有没有优化版本?内部计算都是各种new Vector2,很容易触发GC