unity3d Unity 2D:如何在if语句条件中添加Collider2D列表?

xfb7svmp  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(114)

我有一个Collider2D列表,里面有很多Collider2D,我想检查一下玩家是否与Unity编辑器添加到列表中的任何一个碰撞器发生了碰撞。

using UnityEngine;
public class PlayerScript : MonoBehaviour
{
    private Rigidbody PlayerRB;
    public List<Collider2D> GroundCOlliders;
    public bool IsGrounded;
    
    private void Start()
    {
        PlayerRB = GetComponent<Rigidbody2D>();
        GroundColliders = new List<Collider2D>();
    }
    private void Update()
    {
        if (PlayerRB.IsTouching(GroundColliders))
        {
            IsGrounded = true;
        }
    }
}
3z6pesqy

3z6pesqy1#

典型的解决方案是从玩家的脚向下投射一个非常短的射线,看看它是否击中了地面碰撞器之一。考虑添加一个地面标签甚至层来检查,而不是持有地面碰撞器列表。类似于:

// Note the use of FixedUpdate over regular Update for physics-related calculations.
private void FixedUpdate()
{
    RaycastHit hit;
    if (Physics.Raycast(playerFeetPosition, Vector3.down, out hit, 0.25f) && hit.collider.CompareTag("Ground"))
    {
        IsGrounded = true;
    }
    else
    {
        IsGrounded = false;
    }
}

编辑:我意识到我的解决方案并没有直接回答你的问题,而是假设我知道你真正想要的是什么,以及如何做得更好。要想更直接地解决你的问题,请查看Physics.OverlapX函数族。

vngu2lb8

vngu2lb82#

如果你正在检查地面,你可以使用复选框,而对于碰撞者,你可以使用图层蒙版

Vector3 playerFeetPosition;
Vector3 playerBaseSize;
layermask groundmask;

private void FixedUpdate()
{
    RaycastHit hit;
    if ( Physics.CheckBox(playerFeetPosition, playerBaseSize,Quaternion.identity, groundmask)
    {
        IsGrounded = true;
    }
    else
    {
        IsGrounded = false;
    }
}

相关问题