Godot GDScript 实现CharacterBody2D推动2D碰撞物体(被动移动)

环境、版本及语言:Windows10,Godot 4.2.1.stable,GDScript

一、move_and_slide()及力度优化

Character2D内置方法move_and_slide():

        根据 velocity 移动该物体。该物体如果与其他物体发生碰撞,则会沿着对方滑动(默认只在地板上滑动),不会立即停止移动。如果对方是 CharacterBody2D 或 RigidBody2D,还会受到对方运动的影响。可以用于制作移动、旋转的平台,也可用于推动其他节点。

        该方法可以实现简单的推动效果,在MotionMode=MOTION_MODE_FLOATING(即俯视角模式)下推动效果表现比较糟糕(力度过小),可通过额外添加被动移动来实现更大力度的推动效果,该方法在MotionMode=MOTION_MODE_GROUNDED(即平台跳跃类侧视角)下同样适用

推动CharacterBody2D

const PUSH_FORCE = 40  # 最大速度下的额外推力
const MIN_PUSH_FORCE = 30  # 最小推动力度

var speed = 300

#
# 物体本身的移动
#

move_and_slide()
		
for i in get_slide_collision_count():
    var c = get_slide_collision(i)  # 最近一次调用move_and_slide()时发生的碰撞信息
    if c.get_collider() is CharacterBody2D:
        # 推力大小
        var push_force = (PUSH_FORCE * velocity.length() / speed) + MIN_PUSH_FORCE
        # 修改被碰撞物体的速度
        c.get_collider().velocity = -c.get_normal() * push_force

物体本身的移动(主动移动)可根据项目自行定义,以上代码仅修改被动移动方式,在move_and_slide()后发生碰撞,并修改被碰撞物体的速度来模拟推力,在被碰撞物体静止时效果更为显著,力度大小可修改PUSH_FORCE和MIN_PUSH_FORCE,根据施力物体自身速度的大小,推动力度大小区间为[MIN_PUSH_FORCE,MIN_PUSH_FORCE + PUSH_FORCE]。

推动RigidBody2D

const PUSH_FORCE = 40  # 最大速度下的额外推力
const MIN_PUSH_FORCE = 30  # 最小推动力度

var speed = 300

#
# 物体本身的移动
#

move_and_slide()
		
for i in get_slide_collision_count():
    var c = get_slide_collision(i)  # 最近一次调用move_and_slide()时发生的碰撞信息
    if c.get_collider() is RigidBody2D:
        # 推力大小
        var push_force = (PUSH_FORCE * velocity.length() / speed) + MIN_PUSH_FORCE
        # 对被碰撞的刚体施加脉冲
        c.get_collider().apply_central_impulse(-c.get_normal() * push_force)

与CharacterBody的区别为从修改速度变为施加脉冲,力度大小同样可修改PUSH_FORCE和MIN_PUSH_FORCE

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值