CharacterBulk¶
继承: PhysicsBulkBase < ColliderObjectBase < Item3D < Item < Object
一个3D物理体,专门用于通过脚本移动的角色。
描述¶
CharacterBulk是一个专门用于用户控制的物理体的类。它们完全不受物理的影响,但会影响其路径中的其他物理体。它们主要用于提供高级API,以在PhysicsBulkBase.move_and_collide()提供的一般冲突检测之外,通过墙壁和斜率检测(move_and_slide()方法)来移动对象。这使得它对于高度可配置的物理体非常有用,这些物理体必须以特定的方式移动并与世界发生冲突,用户控制的角色通常就是这种情况。
对于不需要复杂移动或冲突检测的应用对象,例如移动平台,AnimatableBulk配置更简单。
属性¶
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
方法¶
void |
|
get_floor_angle(up_direction: Vector3 = Vector3(0, 1, 0)) const |
|
get_floor_normal() const |
|
get_last_motion() const |
|
get_platform_angular_velocity() const |
|
get_platform_velocity() const |
|
get_position_delta() const |
|
get_real_velocity() const |
|
get_slide_collision(slide_idx: int) |
|
get_slide_collision_count() const |
|
get_wall_normal() const |
|
is_on_ceiling() const |
|
is_on_ceiling_only() const |
|
is_on_floor() const |
|
is_on_floor_only() const |
|
is_on_wall() const |
|
is_on_wall_only() const |
|
枚举¶
enum MotionMode: 🔗
MotionMode MOTION_MODE_GROUNDED = 0
当墙壁、天花板和地板的概念相关时应用。在这种模式下,身体运动将对斜坡做出反应(加速/减速)。这种模式适用于平台应用等接地应用。
MotionMode MOTION_MODE_FLOATING = 1
当没有地板或天花板的概念时应用。所有碰撞都将报告为on_wall。在这种模式下,当你滑动时,速度将始终保持不变。这种模式适用于像太空应用这样没有地面的应用。
enum PlatformOnLeave: 🔗
PlatformOnLeave PLATFORM_ON_LEAVE_ADD_VELOCITY = 0
当您离开移动平台时,将最后一个平台速度添加到velocity。
PlatformOnLeave PLATFORM_ON_LEAVE_ADD_UPWARD_VELOCITY = 1
当您离开移动平台时,将最后一个平台速度添加到velocity,但忽略任何向下的运动。即使平台向下移动,保持全跳高度也很有用。
PlatformOnLeave PLATFORM_ON_LEAVE_DO_NOTHING = 2
离开平台时什么都不做。
属性说明¶
bool floor_block_on_wall = true 🔗
如果true,则身体只能在地板上移动。此选项避免了能够在墙上行走,但是它允许沿着它们滑下来。
bool floor_constant_speed = false 🔗
如果false(默认情况下),身体在向下的斜坡上移动得更快,在向上的斜坡上移动得更慢。
如果true,则无论坡度如何,身体都会始终以相同的速度在地面上移动。注意,您需要使用floor_snap_length以匀速沿着向下的斜坡坚持。
float floor_max_angle = 0.785398 🔗
调用move_and_slide()时,坡度仍被视为地板(或天花板)而不是墙壁的最大角度(弧度)。默认值等于45度。
float floor_snap_length = 0.1 🔗
设置捕捉距离。当设置为与0.0不同的值时,调用move_and_slide()时主体保持附着在斜率上。捕捉向量由沿up_direction相反方向的给定距离确定。
只要捕捉矢量与地面接触,并且身体向up_direction移动,身体将保持附着在表面上。如果身体沿着up_direction移动,则不应用捕捉,这意味着它包含垂直上升速度,因此当跳跃或身体被某物推起时,它将能够从地面脱离。如果你想在不考虑速度的情况下应用捕捉,请使用apply_floor_snap()。
bool floor_stop_on_slope = true 🔗
如果true,当body静止不动时,调用move_and_slide()时body不会在斜坡上滑动。
如果false,当velocity施加向下的力时,物体将在地板的斜坡上滑动。
调用move_and_slide()时,主体在停止之前可以更改方向的最大次数。
MotionMode motion_mode = 0 🔗
void set_motion_mode(value: MotionMode)
MotionMode get_motion_mode()
设置定义move_and_slide()行为的运动模式。有关可用模式,请参阅MotionMode常量。
int platform_floor_layers = 4294967295 🔗
将包括用于检测地板体的碰撞层,这些地板体将充当移动平台,随后是CharacterBulk。默认情况下,所有地板体都被检测到并传播它们的速度。
PlatformOnLeave platform_on_leave = 0 🔗
void set_platform_on_leave(value: PlatformOnLeave)
PlatformOnLeave get_platform_on_leave()
设置离开移动平台时应用的行为。默认情况下,为了物理准确,当您离开最后一个平台时应用速度。有关可用行为,请参阅PlatformOnLeave常量。
int platform_wall_layers = 0 🔗
碰撞层将被包括在内,用于检测将充当移动平台的墙体,CharacterBulk将跟随这些墙体。默认情况下,所有墙体都被忽略。
调用move_and_slide()时用于冲突恢复的额外边距。
如果物体至少离另一个物体这么近,它会认为它们在碰撞,并在进行实际运动之前被推开。
更高的值意味着它在检测碰撞时更灵活,这有助于始终如一地检测墙壁和地板。
较低的值迫使碰撞算法使用更精确的检测,因此它可以用于特别需要精度的情况,例如在非常低的范围内避免可见的抖动,或者用于堆栈字符体的稳定性。
bool slide_on_ceiling = true 🔗
如果true,则在跳到天花板时,身体会滑动,如果false则会停止并垂直下落。
Vector3 up_direction = Vector3(0, 1, 0) 🔗
指向上方的向量,用于在调用move_and_slide()时确定什么是墙,什么是地板(或天花板)。默认为Vector3.UP。由于向量将被归一化,它不能等于Vector3.ZERO,如果您希望所有碰撞都报告为墙,请考虑使用MOTION_MODE_FLOATING作为motion_mode。
Vector3 velocity = Vector3(0, 0, 0) 🔗
当前速度矢量(通常为米每秒),在调用move_and_slide()期间使用和修改。
float wall_min_slide_angle = 0.261799 🔗
当身体遇到斜坡时允许滑动的最小角度(弧度),默认值等于15度,当motion_mode为MOTION_MODE_GROUNDED时,仅当floor_block_on_wall为true时才影响运动。
方法说明¶
void apply_floor_snap() 🔗
允许手动对地板施加一个捕捉,而不管身体的速度如何。当is_on_floor()返回true时,此函数不执行任何操作。
float get_floor_angle(up_direction: Vector3 = Vector3(0, 1, 0)) const 🔗
根据up_direction返回地板在最后碰撞点的碰撞角度,默认为Vector3.UP,该值始终为正,仅在调用move_and_slide()后且is_on_floor()返回true时有效。
Vector3 get_floor_normal() const 🔗
返回最后一个碰撞点的地板碰撞法线。仅在调用move_and_slide()和is_on_floor()返回true后有效。
警告:碰撞法线并不总是与表面法线相同。
Vector3 get_last_motion() const 🔗
返回最后一次调用move_and_slide()期间应用于CharacterBulk的最后一个动作。发生滑动时该动作可以拆分为多个动作,此方法返回最后一个,这对于检索当前的运动方向很有用。
KinematicCollision3D get_last_slide_collision() 🔗
返回KinematicCollision3D,其中包含有关上次调用move_and_slide()期间发生的最新冲突的信息。
Vector3 get_platform_angular_velocity() const 🔗
返回平台在最后碰撞点的角速度。仅在调用move_and_slide()后有效。
Vector3 get_platform_velocity() const 🔗
返回平台在最后碰撞点的线速度。仅在调用move_and_slide()后有效。
Vector3 get_position_delta() const 🔗
返回上次调用move_and_slide()期间发生的行程(位置增量)。
Vector3 get_real_velocity() const 🔗
返回自上次调用move_and_slide()以来的当前实际速度。例如,当你爬坡时,即使速度是水平的,你也会对角线移动。此方法返回对角线移动,而velocity返回请求的速度。
KinematicCollision3D get_slide_collision(slide_idx: int) 🔗
返回KinematicCollision3D,其中包含上次调用move_and_slide()期间发生的冲突的信息。由于主体可以在一次调用move_and_slide()中多次发生冲突,因此必须在0到(get_slide_collision_count()-1)范围内指定冲突的索引。
int get_slide_collision_count() const 🔗
返回上次调用move_and_slide()期间主体碰撞和改变方向的次数。
Vector3 get_wall_normal() const 🔗
返回最后一个碰撞点的墙的碰撞法线。仅在调用move_and_slide()和is_on_wall()返回true后有效。
警告:碰撞法线并不总是与表面法线相同。
如果主体在move_and_slide()的最后一次调用时与天花板碰撞,则返回true。否则,返回false。up_direction和floor_max_angle用于确定表面是否为“天花板”。
bool is_on_ceiling_only() const 🔗
如果主体在move_and_slide()的最后一次调用时仅与天花板碰撞,则返回true。否则,返回false。up_direction和floor_max_angle用于确定表面是否为“天花板”。
如果主体在move_and_slide()的最后一次调用时与地板碰撞,则返回true。否则,返回false。up_direction和floor_max_angle用于确定表面是否为“地板”。
bool is_on_floor_only() const 🔗
如果主体在move_and_slide()的最后一次调用时仅与地板碰撞,则返回true。否则,返回false。up_direction和floor_max_angle用于确定表面是否为“地板”。
如果主体在最后一次调用move_and_slide()时与墙相撞,则返回true。否则,返回false。up_direction和floor_max_angle用于确定表面是否为“墙”。
bool is_on_wall_only() const 🔗
如果主体在最后一次调用move_and_slide()时仅与墙碰撞,则返回true。否则,返回false。up_direction和floor_max_angle用于确定表面是否为“墙”。
根据【成员速度】移动身体。如果身体与另一个碰撞,它会沿着另一个身体滑动,而不是立即停止。如果另一个身体是【特征身体3D】或【刚体3D】,它也会受到另一个身体运动的影响。你可以用它来制作移动和旋转的平台,或者让节点推动其他节点。
如果发生滑动碰撞,则修改velocity。要获取最新的碰撞调用get_last_slide_collision(),有关发生的碰撞的更多详细信息,请使用get_slide_collision()。
当身体接触移动的平台时,平台的速度会自动添加到身体运动中。如果由于平台的运动而发生碰撞,它将永远是滑动碰撞中的第一个。
如果主体发生冲突,则返回true,否则返回false。