为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
杨魅力 2022-12-24 14:45:05
我想让我的角色跳跃,但我的动作非常缓慢。这就像角色正在传送而不是缓慢上升。你有什么想法吗?我正在使用 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: NoneSimulated: trueUse Auto Mass: falseMass:1Linear Drag: 0Angular Drag: 0.05Gravity Scale:1Collision Detection: DiscreteSleeping Mode: Start AwakeInterpolate: NoneFreeze Rotation: z-true播放器具有默认设置的 Box Collider 2D。
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

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


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


-你可能想改变你检查跳跃输入的方式,你也可能想检查玩家是否接地。


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


查看完整回答
反对 回复 2022-12-24
?
慕村9548890

TA贡献1884条经验 获得超4个赞

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


例子:


void FixedUpdate()

    {

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

    }


查看完整回答
反对 回复 2022-12-24
?
繁花如伊

TA贡献2012条经验 获得超12个赞

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

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

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

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


查看完整回答
反对 回复 2022-12-24
  • 3 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号