如何在 Unity 中获得平滑的 2D 跳跃?

Posted

技术标签:

【中文标题】如何在 Unity 中获得平滑的 2D 跳跃?【英文标题】:How to get smooth 2D jumping in Unity? 【发布时间】:2019-04-23 11:22:50 【问题描述】:

我想让我的角色跳跃,但我的动作很慢。就像角色正在传送而不是缓慢上升一样。你有什么想法吗?我正在使用 tilemap 和 Unity 2019.1.0f2

我已经试过了:

rb.AddForce(Vector2.up * jumpForce), rb.velocity = Vector2.up * jumpForce, rb.MovePosition(new Vector2(transform.position.x, transform.position.y+jumpForce).

这是我的其余移动脚本,没有前面提到的代码:

public float speed;
public float jumpVelocity;
float timeBtwJumps = 0f;
float startTimeBtwJumps = 0.3f;

Rigidbody2D rb;

private void Awake()

    rb = GetComponent<Rigidbody2D>();
                                  

private void Update()

    float horizontal = Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
    Vector2 position = new Vector2(transform.position.x, transform.position.y);
    rb.MovePosition(new Vector2(position.x + horizontal, position.y));


private void FixedUpdate()

    if (Input.GetAxisRaw("Vertical") > 0f && timeBtwJumps <= 0f)
    
        Jump();
        timeBtwJumps = startTimeBtwJumps;
    
    else
        timeBtwJumps -= Time.deltaTime;


void Jump()



一切都在从 MonoBehaviour 派生的类中。 这是我的刚体和玩家设置:

Body Type: Dynamic 
Material: None
Simulated: true
Use Auto Mass: false
Mass:1
Linear Drag: 0
Angular Drag: 0.05
Gravity Scale:1
Collision Detection: Discrete
Sleeping Mode: Start Awake
Interpolate: None
Freeze Rotation: z-true

玩家拥有默认设置的 Box Collider 2D。

请帮忙。提前致谢。

【问题讨论】:

你看到了吗:docs.unity3d.com/ScriptReference/Vector2.Lerp.html 【参考方案1】:

如果您想要基于物理的跳跃,请不要使用 MovePosition。 MovePosition 只会将刚体移动到取决于您的插值设置的位置。由于您的插值是无的,因此您会得到“非常滞后的运动”。

相反,您应该使用脉冲力量。在您只尝试加速力之前。此外,您的水平运动也必须相应地改变以适应增加力量的方法。试试这样:

void Jump()
 
    rb.AddForce(Vector2.up*jumpVelocity, ForceMode2D.Impulse);

要对此进行测试,您现在应该禁用水平移动。或者你可以这样做:

private void Update()

    float horizontal = Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
    rb.AddForce(horizontal * Vector2.right);

还有一些事情:

-永远不要在 FixedUpdate 循环中检查输入!您的游戏可能会以 100 fps 的速度运行,并且取决于固定更新(它被称为修复,因为 unity 试图保持物理更新帧速率固定)您可能会错过按钮按下。

-如果你使用MovePosition,只能在FixedUpdate中使用。

-您可能想要更改检查跳跃输入的方式,也可能想要检查播放器是否接地。

-您还应该注意,在 Update 中使用 AddForce 作为加速力也应该避免。

【讨论】:

【参考方案2】:

首先您需要从FixedUpdate 调用Rigidbody 的方法,因为这是计算物理的地方。其次将你的向量值乘以Time.fixedDeltaTime

示例:

void FixedUpdate()
    
        rb.MovePosition(rb.position + position * Time.fixedDeltaTime);
    

【讨论】:

【参考方案3】:

我遇到了这个问题。就像角色是在传送而不是缓慢上升一样。

我通过更改代码解决了这个问题。

我使用了以下代码: MainBodyRigidBody.velocity = new Vector3 (Delta_X, 0, Delta_Y) * MovementSpeed * Time.deltaTime;

但我应该使用MainBodyRigidBody.velocity +=

我将我的代码更改为:

MainBodyRigidBody.velocity += new Vector3 (Delta_X, 0, Delta_Y) * MovementSpeed * Time.deltaTime;

我在角色移动中使用了上述代码,但它导致了我的问题。

【讨论】:

以上是关于如何在 Unity 中获得平滑的 2D 跳跃?的主要内容,如果未能解决你的问题,请参考以下文章

Unity 中某些动画期间平滑过渡和碰撞的动画

如何在 Unity3D 中制作平滑的十字准线?

如何获得光滑的滑块以在循环中平滑过渡

实现Unity2D游戏中跳跃功能和相关问题解决

unity2D背景移动补偿从而获得3d错觉效果

Unity 2D角色跳跃