团结跳跃问题 - 如果角色走向平台,角色不会跳跃

时间:2018-04-16 09:49:17

标签: unity3d

(这是一个2D项目)

我有一个跳跃的问题,如果我的角色走进X平台,她就不会跳,但当她跳到X平台时,她可以跳跃。

对于平台我目前正在使用2个Box Collider 2D(一个带有"触发"已检查)

对于角色我目前正在使用2个Box Collider 2D(一个带有"触发"检查)和Rigidbody 2D。

下面是我正在尝试使用的跳跃和接地的代码。

{
    public float Speed;
    public float Jump;
    bool grounded = false;

    void Start()
    {
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            if (grounded)
            {
                GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, Jump);
            }
        }
    }

    void OnTriggerEnter2D()
    {
        grounded = true;
    }

    void OnTriggerExit2D()
    {
        grounded = false;
    }
}

问题出现在每个平台的同一部分。 (每个方块代表一个平台精灵,它们具有完全相同的特征,因为我复制粘贴其中的每一个)。请查看此链接上的照片:https://imgur.com/a/vTmHw

2 个答案:

答案 0 :(得分:3)

之所以发生这种情况,是因为你的方块有单独的碰撞器。想象一下:

有两个区块:AB。你站在A区块。现在,您尝试在B区块上行走。只要您的Rigidbody2D碰撞器碰到阻止B,您的角色就会获得一个事件OnTriggerEnter2D(...)。现在你声称,你已经停飞了 但是,此时您仍然与块A发生碰撞。只要Rigidbody2D不再与阻止A发生碰撞,您的角色就会收到OnTriggerExit2D(...)。现在你声称,你不再是基础了。但事实上,你仍然在与B块碰撞。

解决方案

您可以拥有名为bool的{​​{1}}类型变量,而不是使用byte变量进行检查:

  • 输入触发器后 - 增加计数器。
  • 退出触发器后 - 减少计数器。

做一些检查以确保你实际上在对撞机上方!

现在,一旦你需要检查你的角色是否接地,你可以使用

collisionsCounter

修改

实际上,在进一步投入问题之后,我意识到你有完全不必要的对手(我说的是触发器)。删除那些。现在每个对象只有一个碰撞器。但要获得碰撞请求,您需要更改:

  • if (collisionsCounter > 0) { // I am grounded, allow me to jump } OnTriggerEnter2D(...)
  • OnCollisionEnter2D(Collision2D)OnTriggerExit2D(...)

最终代码

OnCollisionExit2D(Collision2D)

这里可能是小错别字,因为所有代码都是在记事本中输入的......

答案 1 :(得分:2)

我认为这里有几个问题。

首先,使用Triggers来检查这种类型的碰撞可能不是最好的方法。我建议使用触发器,而是使用OnCollisionEnter2D()Triggers只检测两个物体的碰撞空间是否相互重叠,而正常碰撞碰撞每个物体,就像它们是两个固体物体一样。看起来好像你正在探测你是否已经降落在地板上,你不想像Triggers那样摔倒地板。

其次,我建议使用AddForce代替GetComponent<Rigidbody2D>().velocity

您的最终脚本可能如下所示:

public class PlayerController : MonoBehaviour 
{         
     public float jumpForce = 10.0f;     
     public bool isGrounded;
     Rigidbody2D rb;

     void Start()
     {
         rb = GetComponent<Rigidbody2D>();
     }

     void OnCollisionEnter2D(Collision2D other)
     {
         // If we have collided with the platform
         if (other.gameObject.tag == "YourPlatformTag")
         {
             // Then we must be on the ground
             isGrounded = true;
         }
     }

     void Update()
     {
         // If we press space and we are on the ground
         if(Input.GetKeyDown(KeyCode.Space) && isGrounded)
         {     
             // Add some force to our Rigidbody
             rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);

             // We have jumped, we are no longer on the ground
             isGrounded = false;
         }
     }
}