当其他对撞机的边缘附近时,精灵字符会向后滑动

时间:2015-03-27 12:48:11

标签: unity3d unity3d-2dtools

我在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);
}

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

此外,如果角色碰到另一个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);
    }
}

1 个答案:

答案 0 :(得分:0)

问题在于你如何实现让你的玩家减速到零的“拖拽”力。因为游戏物理是以步骤而不是连续发生的,所以你的反向力可以超调并短暂地使角色向相反的方向移动。

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

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

OR

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来执行运动/物理相关代码。这将允许更独立于帧速率的更一致的结果。