繁体   English   中英

如何在 Unity 中获得流畅的 2D 跳跃?

[英]How to get smooth 2D jumping in Unity?

我想让我的角色跳跃,但我的动作非常滞后。 这就像角色正在传送而不是慢慢上升。 你有什么想法吗? 我正在使用 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。

请帮忙。 提前致谢。

如果您想要基于物理的跳跃,请不要使用 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 作为加速力。

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

例子:

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

我有这个问题。 就好像角色正在传送而不是慢慢上升。

我通过更改代码解决了它。

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

我将上面的代码用于我的角色运动,但它导致了我的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM