骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 1120|回复: 1

[功能与代码] 关于agent的飞行功能的第四种办法——attatch碰撞挤压法

[复制链接]

212

主题

1032

回帖

1048

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14847
精华
0
互助
93
荣誉
21
贡献
325
魅力
1382
注册时间
2017-11-5
鲜花(431) 鸡蛋(0)
发表于 2024-9-2 18:48:32 | 显示全部楼层 |阅读模式
本帖最后由 vegetto 于 2024-9-3 19:04 编辑

之前已经写过类似贴,并且很多同志也有突破。除了场景物托人、agent no dynamic取消重力物理效果使得可以坐标设置3D空间、以及骨骼动作参数调整  这三种办法外,我现在介绍第4种方法——【attatch碰撞挤压法】,不谈优劣,只谈扩散思维,一题多解。

首先这个碰撞在brf里的形状大小参考我的图片,是一个在人脚底的水平放置的正方体板子形状的模型生成的碰撞。
这个attach prop碰撞和直接用prop碰撞控制prop移动来托有什么区别呢,区别就是prop碰撞托就是以碰撞来托住人的脚底,相当于人踩在一个会移动的“地面”上,而attach产生的位移效果来源于更复杂的hitbox与colliision两种碰撞类型的挤压运动关系,并且由于attach每次只能固定一个身体相对坐标的位置,所以不能靠prop的运动控制来控制移动,而是靠挤压方向和部位来控制。
多说无益,示例和解释如下:


module_scene_props注册一个场景物
("ppp", 0, "0", "ppp", []),

则碰撞体在brf里命名就叫ppp

在mt里(0.000000, 0.000000, 0.000000, 条件写一个玩家飞的参考模板

(get_player_agent_no, ":var_0"),
(scene_prop_get_num_instances, ":var_2", "spr_ppp"),
(agent_get_position, pos1, ":var_0"),
(copy_position, pos2, pos1),
(try_begin),
    (eq, ":var_2", 0),
    (key_clicked, key_right_alt),
    (position_move_y, pos2, 400),
    (position_move_z, pos2, 500),
    (position_set_z_to_ground_level, pos2),
    (position_move_z, pos2, -500),
    (set_spawn_position, pos2),
    (spawn_scene_prop, "spr_ppp"),
    (agent_set_attached_scene_prop, ":var_0", reg0),
(try_end),
        (try_begin),
            (key_clicked, key_j),
            (agent_set_attached_scene_prop_z, ":var_0", 100),          #attach的碰撞在头上方
        (else_try),
            (key_clicked, key_v),
            (agent_set_attached_scene_prop_z, ":var_0", 60),          #attach的碰撞在眼睛附近
        (else_try),
            (key_clicked, key_b),
            (agent_set_attached_scene_prop_z, ":var_0", -20),        #attach的碰撞在腰附近
        (else_try),
            (key_clicked, key_n),
            (agent_set_attached_scene_prop_z, ":var_0", -60),          #attach的碰撞在脚底但偏上一点
        (else_try),
            (key_clicked, key_m),
            (agent_set_attached_scene_prop_z, ":var_0", -50000),     #在超远的下方 ,可考虑在这些操作里加关闭开启碰撞的op
        (try_end),




##################
分别讲一下不同attach部位的效果,如果你把一个有厚度的平板碰撞绑定在单位脚底偏上,也就是和脚有重叠的部分,则单位会不断上升,原因是两个碰撞互相挤压,系统认为你attach的碰撞是地面,就想把你脚底淹没在“地下”的部分自动抬起来,但是由于碰撞是attach状态,则又跟随你上升,产生死循环,使得agent不停的上升。

如果碰撞绑定在腰间,你在空中会向前移动,此时你甚至可以保留agent的碰撞判定以及不干扰agent在空中根据步行及视角方向改变移动方向。

如果碰撞绑定在脑袋和脖子附近,且与该身体部位的hitbox有重叠,会重重的把你从空中往下高速坠落,产生极高的致死伤害(所以你要配合ti on agent hurt条件将来自自身的伤害清0)

如果碰撞绑定位置脱离身体范围,那么没有什么效果,地面正常走,天空中则正常自由落体。


此外图片中的碰撞只是水平放置的效果,如果改为有一定倾斜角度,和代码 控制attach部位结合,还会产生其他位移效果,比如如果我稍微在brf把碰撞向后转一定角度,会产生斜向的飞行效果,就不是竖直了。

但是,但是,但是,这种实现飞行的功能做法有一定弊端,我后面再介绍。




360截图20240902183525239.jpg
360截图20240902183531789.jpg

212

主题

1032

回帖

1048

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14847
精华
0
互助
93
荣誉
21
贡献
325
魅力
1382
注册时间
2017-11-5
鲜花(431) 鸡蛋(0)
 楼主| 发表于 2024-9-3 06:46:24 来自手机 | 显示全部楼层
本帖最后由 vegetto 于 2024-9-3 07:31 编辑

这个方法的最大弊端其实是所有凡是牵扯到场景物碰撞或dynamic效果的飞行做法都会遇到的一个bug,如果你不仔细处理细节是不可避免的。你们应该见过有人用编辑模式把工程车撤掉,站在上面的人掉不下来的情况吧。人在空中停滞和缓缓移动时,这时候终止飞行产生自由落体的状态瞬间,脚下会生成一种编辑模式看不见的空气墙,像一种虚拟的地面,是你甚至不能通过高度检测判断你是否悬空,只能通过检测强制ai挪开,但这样系统才仅仅概率性清除这个虚拟地面碰撞,并且对ai的agent高概率容易出现,一旦出现这个,就会影响你对飞行终止执行下落的判断,人直接锁死高空点,哪怕你用的是dynamic法。而attach法出这种bug的概率最高,所以ai无论用哪种办法,都要加滞空bug的检测修复代码。然后玩家比较特殊,出现这种情况比较少,因为玩家的行为比较复杂多变,特高的高空偶尔卡住时,自己来回身体旋转蹭蹭就摆脱这个锁人的空气碰撞bug了,所以玩家可以随便使用各种飞行做法没有顾虑。
然后这种bug还有一个升级版,就是如果你在一个带斜面的建筑物碰撞上终止飞行下落时触发此bug,有概率形成的不是滞空bug了,而是无限升空bug,人一直垂直上天,这时候你哪怕检测到这人有bug你都动不了他去修正。
所以超越战团本身机制的功能,不会尽善尽美,一步到位,常常需要修补各种暴露的弊端,所以诸君注意取舍和不滥用。


最后是关于碰撞是否会跳出以及对性能的影响问题。
首先对于简单的物体就像我这种单纯的六面体形状的prop animate比attach性能影响大(但是attach人的碰撞如果奇形怪状过于复杂,以至于会让agent骨骼动作产生肢体晃动的过程中和这个碰撞频繁乱七八糟的挤压,这种情况就反过来了)。其次hitbox和collision只要不频繁反复摩擦,产生与人相对位置的频繁改变,是不容易跳出的,attach控好频率一定时间间隔保持一定相对位置即可。最后不用飞时取消碰撞也可以缓解对性能影响,已在百人战场应用多场战斗了,稳定性可以。不过呢代码不是分割的东西,还是要看你其他代码的配合,有的时候两块代码本身没有问题,你合在一起可能就有些奇怪的问题,这个就要你们自己判断了。

来自: iPhone客户端
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-11-19 08:50 , Processed in 0.110927 second(s), 18 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表