统一c#脚本与2个刚体。当一个刚体撞到另一个刚体时跳不起来

时间:2016-03-15 08:36:36

标签: c#

第二个刚体使用与第一个相同的脚本,但使用"&球员号码== 1"在if-instances中。

问题是如果第一个刚体跳到另一个上面然后跳起来,第二个就完全无法跳跃。 (反之亦然)

这是一个简单的解决方案吗?

using UnityEngine;

using System.Collections;

public class PlayerController : MonoBehaviour 
{

//Movement
public float speed;
public float jump;
float moveVelocity;

//Grounded Vars
bool grounded = true;

int playernumber;


void Update () 
{
    if (Input.GetKeyDown (KeyCode.Alpha1)) {
        playernumber = 1;
    }

    if (Input.GetKeyDown (KeyCode.Alpha2)) {
        playernumber = 2;
    }

    if (Input.GetKeyDown (KeyCode.Alpha3)) {
        playernumber = 3;
    }
    //Jumping   
    if ((Input.GetKeyDown (KeyCode.Space) || Input.GetKeyDown (KeyCode.UpArrow) || Input.GetKeyDown (KeyCode.Z) || Input.GetKeyDown (KeyCode.W))  & playernumber == 1  ) 
    {
        if(grounded)
        {
            GetComponent<Rigidbody2D> ().velocity = new Vector2 (GetComponent<Rigidbody2D> ().velocity.x, jump);
        }
    }



    moveVelocity = 0;

    //Left Right Movement
    if ((Input.GetKey (KeyCode.LeftArrow) || Input.GetKey (KeyCode.A)) & playernumber == 1 ) 
    {
        moveVelocity = -speed;
    }
    if ((Input.GetKey (KeyCode.RightArrow) || Input.GetKey (KeyCode.D)) & playernumber == 1 ) 
    {
        moveVelocity = speed;
    }

    GetComponent<Rigidbody2D> ().velocity = new Vector2 (moveVelocity, GetComponent<Rigidbody2D> ().velocity.y);

}

//Check if on the ground
void OnTriggerEnter2D()
{
    grounded = true;
}
void OnTriggerExit2D()
{
    grounded = false;
}
}

1 个答案:

答案 0 :(得分:0)

这些触发事件在实际事件发生时触发,因此:

  1. player1和player2产生并触摸地板或smt。沿着thosel lines =&gt;两者都触发了onTriggerEnter事件,它们都是接地的
  2. player1跳上了player2
    • player1 jumps =&gt; onTriggerExit - 没有接地
    • player1登陆player2 =&gt; onTriggerEnter为两名球员开火并且他们都已接地
  3. 播放器1跳出播放器2 =&gt; onTriggerExit同时触发 - 两者都没有接地
    • player1然后击中地板并触发onTriggerEnter,所以他接地,但是球员2并不意味着他没有接地,因此无法跳跃
  4. 当用户跳转时,您可以简单地将接地设置为false,并使用onTriggerEnter将其重置为true并废弃onTriggerExit:

    if(grounded){
        GetComponent<Rigidbody2D> ().velocity = new Vector2 (GetComponent<Rigidbody2D> ().velocity.x, jump);
        grounded = false;
    }
    

    编辑:我没有注意到两种触发方法都不匹配代码中的their appropriate signatures,因为它们错过了Collider2D参数。

    void OnTriggerEnter2D(Collider2D collider) {
        grounded = true;
    }