0

我正在 Unity 中制作 2D 游戏。我添加了一个 2D 盒子对撞机和一个圆形对撞机作为我的精灵角色的触发器。角色站立的平台也有一个 2D 盒子对撞机。因此,当我的角色移动到平台边缘附近时,它会经历一种力或某种将其拉离边缘的东西。你可以认为它是一种保护力量,可以帮助你的角色不掉下飞机,但问题是这种力量不是游戏的一部分,这就是为什么它不应该存在的原因。以下是我用来移动角色的代码:

// call this method to move the player
void Move(float h)
{
    // reduces character velocity to zero by applying force in opposite direction
    if(h==0)
    {
        rigidBody.AddForce(new Vector2(-rigidBody.velocity.x * 20, 0.0f));
    }

    // controls velocity of character
    if(rigidBody.velocity.x < -topSpeed || rigidBody.velocity.x > topSpeed)
    {
        return;
    }

    Vector2 movement = new Vector2 (h, 0.0f);
    rigidBody.AddForce (movement * speed * Time.deltaTime);
}

这是属性的图像的图像。如果我继续推动角色,它会从边缘掉下来,但如果我只靠边缘停下来,不需要的保护力会将它拉回到平面上。

此外,如果角色撞到另一个 2D 盒子对撞机,它会反弹回来,而不仅仅是摔倒。

编辑- 弹跳效果主要出现在玩家在跳跃时撞到其他物体时。跳跃的代码是

void Update()
{
// The player is grounded if a linecast to the groundcheck position hits anything on the ground layer.
    grounded = Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Ground"));  

    // If the jump button is pressed and the player is grounded then the player should jump.
    if(Input.GetButtonDown("Jump") && grounded)
        jump = true;
}

void Jump()
{
    if (jump) 
    {
        jump = false;
        rigidBody.AddForce (Vector2.up * jumpSpeed * Time.deltaTime);
    }
}
4

1 回答 1

0

问题在于您如何实施将玩家减速到零的“阻力”力。因为游戏物理是逐步发生而不是连续发生的,所以你的反作用力可能会过​​冲并短暂地导致角色朝相反的方向移动。

在这种情况下,您最好的选择是将您的速度乘以每帧的某个分数(可能在 0.8 和 0.95 之间),或者使用 Mathf.Lerp 将您的 X 速度移向零。

rigidbody.velocity += Vector2.right * rigidbody.velocity.x * -0.1f;

或者

Vector3 vel = rigidbody.velocity; //Can't modify rigidbody.velocity.x directly
vel.x = Mathf.Lerp(vel.x, 0, slowRate * Time.deltaTime);
rigidbody.velocity = vel;

还要考虑在 FixedUpdate() 而不是 Update() 中执行与运动/物理相关的代码,并使用 Time.fixedDeltaTime 而不是 Time.deltaTime。这将允许独立于帧速率的更一致的结果。

于 2015-03-27T16:21:02.917 回答