环境、版本及语言: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