玩家在 godot 中滑动斜坡
Player slides ramps in godot
所以我在 Godot 3.3.4 中开发了这个基于 3D 的俯视游戏。我已经为玩家移动编写了一些代码,但它会导致玩家在站在斜坡上时缓慢滑动。
我有点能想象如何修复它,但我认为我设计了一个非常简单的修复程序,所以我问社区。有没有一种简单的方法可以让玩家在接触地面时留在原地?
(我知道 move_and_slide_with_snap() 方法,但我也无法使其正常工作)
(我也知道我忘了应用增量)
代码如下:
export var speed = 7.5
const GRAVITY = Vector3.DOWN * 100
var velocity = Vector3.ZERO
func _physics_process(delta):
velocity += GRAVITY * delta
velocity = move_and_slide(velocity, Vector3.UP)
var input_vector = Vector2.ZERO
input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
input_vector.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
input_vector = input_vector.normalized()
velocity.x = input_vector.x * speed
velocity.z = input_vector.y * speed
move_and_slide(velocity)
这是我的第一个社区提问,所以你好,谢谢你。
已解决
我得到了一些 gif,但显然你需要 10 个代表而且我是新手所以...
谢谢 Theraot,我已经启用了坡度功能,但有时只是工作。所以我做了一些更改,我认为我可以接受:
extends KinematicBody
export var speed = 750
const GRAVITY = Vector3.DOWN * 10
var velocity = Vector3.ZERO
func _physics_process(delta):
velocity += GRAVITY * delta
velocity = move_and_slide_with_snap(velocity, Vector3.DOWN, Vector3.UP, true, 1, 0.80)
var input_vector = Vector2.ZERO
input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
input_vector.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
input_vector = input_vector.normalized()
velocity.x = input_vector.x * speed * delta
velocity.z = input_vector.y * speed * delta
move_and_slide_with_snap(velocity, Vector3.DOWN, Vector3.UP, true, 0, 0.785398)
我敢肯定,该代码还有很多工作要做,但运动还不错,它只会在大坡道上滑动一点,所以这可能是一件“有趣”的事情。
我将关闭它,但如果有人想更正该代码,我可以接受。玩得开心。
看看move_and_slide
的参数:
Vector3 move_and_slide ( Vector3 linear_velocity, Vector3 up_direction=Vector3( 0, 0, 0 ), bool stop_on_slope=false, int max_slides=4, float floor_max_angle=0.785398, bool infinite_inertia=true )
它说 bool stop_on_slope=false
。我相信这就是你想要的。
因此您的 move_and_slide
调用将如下所示:
velocity = move_and_slide(velocity, Vector3.UP, true)
我还想提一下 up_direction
和 floor_max_angle
用来决定什么是 floor/slope。
附录
it only slides a bit on big ramps
如果问题是陡坡,请尝试增加 floor_max_angle
。 0.785398
的值是 8 圈(当然是 TAU * 0.125
,弧度)。或者 45 度,如果您愿意的话。 0.8
不多,它是 45.8 度 (TAU * 0.127324
)。
其他:你在打两个电话,似乎垂直速度是重力速度的两倍,至少在空中是这样。考虑到这一点让我有了另一个想法。如果您对垂直分量使用 move_and_collide
(即仅重力),则不会有滑动。然后你可以使用 move_and_slide
或 move_and_slide_with_snap
进行另一个移动。
顺便说一下,move_and_slide_with_snap
中的“snap”指的是相关但不相同的东西。
考虑一个角色在斜坡上,沿水平方向移动斜坡下降,但下降速度不够快(因为斜坡太陡,水平速度对它来说太大,或者重力太低) .没有捕捉,角色就在空中。 所以,是的,捕捉很重要,但不一定是滑动的解决方案。
捕捉对于让角色粘在墙上也很有用。例如墙 运行.
什么决定什么是地板什么是墙? up_direction
和 floor_max_angle
。可能是您的角色“滑动了一点”,因为坡道不算地板,而是墙。
所以我在 Godot 3.3.4 中开发了这个基于 3D 的俯视游戏。我已经为玩家移动编写了一些代码,但它会导致玩家在站在斜坡上时缓慢滑动。
我有点能想象如何修复它,但我认为我设计了一个非常简单的修复程序,所以我问社区。有没有一种简单的方法可以让玩家在接触地面时留在原地?
(我知道 move_and_slide_with_snap() 方法,但我也无法使其正常工作) (我也知道我忘了应用增量)
代码如下:
export var speed = 7.5 const GRAVITY = Vector3.DOWN * 100 var velocity = Vector3.ZERO func _physics_process(delta): velocity += GRAVITY * delta velocity = move_and_slide(velocity, Vector3.UP) var input_vector = Vector2.ZERO input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left") input_vector.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up") input_vector = input_vector.normalized() velocity.x = input_vector.x * speed velocity.z = input_vector.y * speed move_and_slide(velocity)
这是我的第一个社区提问,所以你好,谢谢你。
已解决
我得到了一些 gif,但显然你需要 10 个代表而且我是新手所以...
谢谢 Theraot,我已经启用了坡度功能,但有时只是工作。所以我做了一些更改,我认为我可以接受:
extends KinematicBody
export var speed = 750
const GRAVITY = Vector3.DOWN * 10
var velocity = Vector3.ZERO
func _physics_process(delta):
velocity += GRAVITY * delta
velocity = move_and_slide_with_snap(velocity, Vector3.DOWN, Vector3.UP, true, 1, 0.80)
var input_vector = Vector2.ZERO
input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
input_vector.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
input_vector = input_vector.normalized()
velocity.x = input_vector.x * speed * delta
velocity.z = input_vector.y * speed * delta
move_and_slide_with_snap(velocity, Vector3.DOWN, Vector3.UP, true, 0, 0.785398)
我敢肯定,该代码还有很多工作要做,但运动还不错,它只会在大坡道上滑动一点,所以这可能是一件“有趣”的事情。
我将关闭它,但如果有人想更正该代码,我可以接受。玩得开心。
看看move_and_slide
的参数:
Vector3 move_and_slide ( Vector3 linear_velocity, Vector3 up_direction=Vector3( 0, 0, 0 ), bool stop_on_slope=false, int max_slides=4, float floor_max_angle=0.785398, bool infinite_inertia=true )
它说 bool stop_on_slope=false
。我相信这就是你想要的。
因此您的 move_and_slide
调用将如下所示:
velocity = move_and_slide(velocity, Vector3.UP, true)
我还想提一下 up_direction
和 floor_max_angle
用来决定什么是 floor/slope。
附录
it only slides a bit on big ramps
如果问题是陡坡,请尝试增加 floor_max_angle
。 0.785398
的值是 8 圈(当然是 TAU * 0.125
,弧度)。或者 45 度,如果您愿意的话。 0.8
不多,它是 45.8 度 (TAU * 0.127324
)。
其他:你在打两个电话,似乎垂直速度是重力速度的两倍,至少在空中是这样。考虑到这一点让我有了另一个想法。如果您对垂直分量使用 move_and_collide
(即仅重力),则不会有滑动。然后你可以使用 move_and_slide
或 move_and_slide_with_snap
进行另一个移动。
顺便说一下,move_and_slide_with_snap
中的“snap”指的是相关但不相同的东西。
考虑一个角色在斜坡上,沿水平方向移动斜坡下降,但下降速度不够快(因为斜坡太陡,水平速度对它来说太大,或者重力太低) .没有捕捉,角色就在空中。 所以,是的,捕捉很重要,但不一定是滑动的解决方案。
捕捉对于让角色粘在墙上也很有用。例如墙 运行.
什么决定什么是地板什么是墙? up_direction
和 floor_max_angle
。可能是您的角色“滑动了一点”,因为坡道不算地板,而是墙。