进行排球比赛,重叠不起作用

时间:2018-08-07 16:08:50

标签: unity3d overlap

我正在Unity上进行2D游戏,并且创建了一个重叠区域以查看球是否在击中区域。但是,每当我按下击打按钮时,即使球离开了球员,球也会被击中。我正在发送播放器的代码,其中包含到目前为止所需的内容,以查看可能出了什么问题。假设应该使用hitColliders中的foreach hitCollider进行修复,但是它对我没有用,只是无法解决问题。

public int speed;
public bool estoyFloor, subiendo, bajando;
public bool canRight, canLeft;
public bool canMove;

public float posYinit;
public Vector3 posInitPlayer;
bool m_Started;
public LayerMask m_LayerMask;
public GameObject volleyBall;

// Use this for initialization
void Start () {
    m_Started = true;
}

void FixedUpdate()
{

    Collider2D[] hitColliders = Physics2D.OverlapBoxAll(gameObject.transform.position, transform.localScale / 2, 0);


    foreach (Collider2D hitCollider in hitColliders)
    {
        if (Input.GetButtonDown("Fire1"))
        {
            volleyBall.GetComponent<Rigidbody2D>().velocity = Vector3.zero;
            volleyBall.GetComponent<Rigidbody2D>().AddForce(new Vector3(300, 500));
        }
    }
}

void OnDrawGizmos()
{
    Gizmos.color = Color.red;
    if (m_Started)
        Gizmos.DrawWireCube(transform.position, transform.localScale / 2);
}

// Update is called once per frame
void Update () {

    if (Input.GetButtonDown("Fire1"))
        canMove = true;

    if (Input.GetAxisRaw("Horizontal") > 0 && canRight)
        transform.position += Vector3.right * speed * Time.deltaTime;
    if (Input.GetAxisRaw("Horizontal") < 0 && canLeft)
        transform.position += Vector3.left * speed * Time.deltaTime;

    if (Input.GetButtonDown("Jump") && estoyFloor)
    {
        subiendo = true;
        posYinit = transform.position.y;
    }

    if (transform.position.y > posYinit + 2.5f)
    {
        subiendo = false;
        bajando = true;
    }

    if (!estoyFloor && !subiendo)
        bajando = true;

    Debug.DrawLine(transform.position, transform.position + new Vector3(0, -1, 0), Color.red);
    Debug.DrawLine(transform.position, transform.position + new Vector3(0.8f, 0, 0), Color.red);
    Debug.DrawLine(transform.position, transform.position + new Vector3(1.5f, 0, 0), Color.red);

    RaycastHit2D[] hitDown = Physics2D.LinecastAll(transform.position, transform.position + new Vector3(0, -1, 0));
    RaycastHit2D[] hitsRight = Physics2D.LinecastAll(transform.position, transform.position + new Vector3(0.8f, 0, 0));
    RaycastHit2D[] hitsLeft = Physics2D.LinecastAll(transform.position, transform.position + new Vector3(1.5f, 0, 0));

    estoyFloor = false;
    foreach (RaycastHit2D hit in hitDown)
    {
        if (hit.collider.name == "Floor")
        {
            bajando = false;
            estoyFloor = true;
        }
    }

    canRight = true;
    foreach (RaycastHit2D hit in hitsRight)
    {
        if (hit.collider.tag == "Wall")
            canRight = false;
    }

    canLeft = true;
    foreach (RaycastHit2D hit in hitsLeft)
    {
        if (hit.collider.tag == "Wall")
            canLeft = false;
    }

    if (subiendo)
        transform.position += Vector3.up * speed * Time.deltaTime;

    if (bajando)
        transform.position += Vector3.down * speed * Time.deltaTime;
}

1 个答案:

答案 0 :(得分:0)

您的重叠框可能与其所在的播放器相撞。因为您不检查对撞机是否属于循环中的排球,所以无论如何都将球击中。尝试从对撞机获取变换并检查其标签以查看它是否是排球,然后再向球上加力,然后查看是否起作用。您还可以在“重叠框”复选框上使用一个图层蒙版,以确保仅检测到排球。