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

时间:2019-04-23 11:22:51

标签: c# unity3d 2d

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

我已经尝试过:

rb.AddForce(Vector2.up * jumpForce)rb.velocity = Vector2.up * jumpForcerb.MovePosition(new Vector2(transform.position.xtransform.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。

请帮助。预先感谢。

3 个答案:

答案 0 :(得分:0)

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

示例:

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

答案 1 :(得分:0)

如果要基于物理的跳跃,请不要使用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的速度运行,并且取决于固定更新(之所以称为“固定”,是因为统一尝试将物理更新的帧速率保持固定),您可能会错过按下按钮的机会。

-如果您使用MovePosition,请仅在FixedUpdate中使用它。

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

-您还应注意,还应避免在Update中使用AddForce来获得加速力。

答案 2 :(得分:0)

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

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

我使用了以下代码: 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;

我在角色运动中使用了上面的代码,但这会导致我的问题。