Unity C#检测上面的所有游戏对象

Unity C#检测上面的所有游戏对象,c#,unity3d,physics,collider,C#,Unity3d,Physics,Collider,我想让我的玩家检测第8层中的所有游戏对象。我发现了一个可以检测上面所有游戏对象的代码,但它只检测x=0行,就像这些图中的一样 RaycastHit[]hitsUp=Physics.RaycastAll(transform.position,transform.up,distance); RaycastHit[]hitsDown=Physics.RaycastAll(transform.position,-transform.up,distance); foreach(hitsUp中的Rayc

我想让我的玩家检测第8层中的所有游戏对象。我发现了一个可以检测上面所有游戏对象的代码,但它只检测x=0行,就像这些图中的一样

RaycastHit[]hitsUp=Physics.RaycastAll(transform.position,transform.up,distance);
RaycastHit[]hitsDown=Physics.RaycastAll(transform.position,-transform.up,distance);
foreach(hitsUp中的RaycastHit命中)
{
if(hit.collider.gameObject.layer==8)
{
IgnoreCollision(hit.collider,GetComponent());
}
}
foreach(raycastthit在hitsDown中命中)
{
if(hit.collider.gameObject.layer==8)
{
IgnoreCollision(hit.collider,GetComponent(),false);
}
}

我如何解决这个问题?感谢您的回复。

只需将layermask过滤器添加到您的Raycast中即可

int layerMask = 1 << 8; // - detects raycasts only on 8 layer
RaycastHit[] hitsUp = Physics2D.Raycast(transform.position, transform.up, distance, layerMask);
RaycastHit[] hitsDown = Physics.RaycastAll(transform.position, -transform.up, distance, layerMask);

int layerMask=1问题在于,你的光线投射只捕捉到玩家正上方的“命中”,因为它沿着一条直线

你可以把所有的游戏对象放在一个单一的父对象中,在每个游戏对象中循环,检查它的图层,然后看它是否在你的上面或下面

类似这样的方法可能会奏效:

public Transform parent;
private Collider myCollider;

private void Start() 
{
    myCollider = GetComponent<Collider>();
}

private void DetectObjects()
{
    //Loop through each object above/below
    foreach (Transform child in parent)
    {
        GameObject childObj = child.gameObject;
        if (childObj.layer == 8) //Is the object on the correct layer?
        {
            if (child.position.y > transform.position.y) Physics.IgnoreCollision(childObj.GetComponent<Collider>(), myCollider);             //GameObjects above the player
            else if (child.position.y < transform.position.y) Physics.IgnoreCollision(childObj.GetComponent<Collider>(), myCollider, false); //GameObjects below the player
        }
    }
}
公共转换父级;
私人对撞机;
私有void Start()
{
myCollider=GetComponent();
}
私有空检测对象()
{
//循环浏览上面/下面的每个对象
foreach(在父对象中转换子对象)
{
GameObject childObj=child.GameObject;
if(childObj.layer==8)//对象是否位于正确的层上?
{
if(child.position.y>transform.position.y)physical.IgnoreCollision(childObj.GetComponent(),myCollider);//玩家上方的游戏对象
else if(child.position.y
此外,您应该尝试存储碰撞器组件,而不是使用
GetComponent()
,因为它非常慢

根据是否创建/删除对象,您也可以为它们存储碰撞器,这将大大提高代码的性能,例如:

public Transform parent;
private Collider myCollider;
private Collider[] objColliders;

private void Start() 
{
    myCollider = GetComponent<Collider>();
    //If any gameObject is inactive it can also be grabbed by adding true as a paramater
    objColliders = parent.GetComponentsInChildren<Collider>();
}

private void DetectObjects()
{
    GameObject childObj;
    //Loop through colliders
    for (int i = 0; i < objColliders.Length; i++)
    {
        childObj = objColliders[i].gameObject; //Store as gameObject reference
        if (childObj.layer == 8)
        {
            if (childObj.transform.position.y > transform.position.y) Physics.IgnoreCollision(objColliders[i], myCollider);             //GameObjects above the player
            else if (childObj.transform.position.y < transform.position.y) Physics.IgnoreCollision(objColliders[i], myCollider, false); //GameObjects below the player
        }
    }
}
公共转换父级;
私人对撞机;
私人对撞机[]目标对撞机;
私有void Start()
{
myCollider=GetComponent();
//如果任何游戏对象处于非活动状态,也可以通过添加true作为参数来抓取它
ObjColleders=parent.GetComponentsInChildren();
}
私有空检测对象()
{
游戏对象childObj;
//环行对撞机
for(int i=0;itransform.position.y)physical.IgnoreCollision(objColliders[i],myCollider);//玩家上方的游戏对象
else if(childObj.transform.position.y
public Transform parent;
private Collider myCollider;
private Collider[] objColliders;

private void Start() 
{
    myCollider = GetComponent<Collider>();
    //If any gameObject is inactive it can also be grabbed by adding true as a paramater
    objColliders = parent.GetComponentsInChildren<Collider>();
}

private void DetectObjects()
{
    GameObject childObj;
    //Loop through colliders
    for (int i = 0; i < objColliders.Length; i++)
    {
        childObj = objColliders[i].gameObject; //Store as gameObject reference
        if (childObj.layer == 8)
        {
            if (childObj.transform.position.y > transform.position.y) Physics.IgnoreCollision(objColliders[i], myCollider);             //GameObjects above the player
            else if (childObj.transform.position.y < transform.position.y) Physics.IgnoreCollision(objColliders[i], myCollider, false); //GameObjects below the player
        }
    }
}