玩家在 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_directionfloor_max_angle 用来决定什么是 floor/slope。


附录

it only slides a bit on big ramps

如果问题是陡坡,请尝试增加 floor_max_angle0.785398 的值是 8 圈(当然是 TAU * 0.125,弧度)。或者 45 度,如果您愿意的话。 0.8 不多,它是 45.8 度 (TAU * 0.127324)。


其他:你在打两个电话,似乎垂直速度是重力速度的两倍,至少在空中是这样。考虑到这一点让我有了另一个想法。如果您对垂直分量使用 move_and_collide(即仅重力),则不会有滑动。然后你可以使用 move_and_slidemove_and_slide_with_snap 进行另一个移动。


顺便说一下,move_and_slide_with_snap中的“snap”指的是相关但不相同的东西。

考虑一个角色在斜坡上,沿水平方向移动斜坡下降,但下降速度不够快(因为斜坡太陡,水平速度对它来说太大,或者重力太低) .没有捕捉,角色就在空中。 所以,是的,捕捉很重要,但不一定是滑动的解决方案。

捕捉对于让角色粘在墙上也很有用。例如墙 运行.

什么决定什么是地板什么是墙? up_directionfloor_max_angle。可能是您的角色“滑动了一点”,因为坡道不算地板,而是墙。