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

问题描述 投票:1回答:2

我想让我的角色跳起来,但我的动作非常迟钝。这就像角色传送而不是慢慢上升。你有什么想法吗?我正在使用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具有默认设置。

请帮忙。提前致谢。

c# unity3d 2d
2个回答
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加速力。


0
投票

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

例:

void FixedUpdate()
    {
        rb.MovePosition(rb.position + position * Time.fixedDeltaTime);
    }
© www.soinside.com 2019 - 2024. All rights reserved.