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

问题描述

我希望我的玩家能够检测到第8层中的所有游戏对象。我找到了可以检测以上所有游戏对象的代码,但它只能像这些图中的x = 0线上那样进行检测,

What It does

What I want

   RaycastHit[] hitsUp = Physics.RaycastAll(transform.position,transform.up,distance);
   RaycastHit[] hitsDown = Physics.RaycastAll(transform.position,-transform.up,distance);
   foreach (RaycastHit hit in hitsUp)
   {
       if (hit.collider.gameObject.layer == 8)
       {
            Physics.IgnoreCollision(hit.collider,GetComponent<Collider>());
       }
   }
   foreach (RaycastHit hit in hitsDown)
   {
       if (hit.collider.gameObject.layer == 8)
       {
            Physics.IgnoreCollision(hit.collider,GetComponent<Collider>(),false);
       }
   }

我该如何解决这个问题?谢谢您的答复。

解决方法

只需在您的Raycast中添加layermask过滤器即可。

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,layerMask);

foreach不需要。

,

问题是您的Raycast只能捕捉到播放器正上方的“命中”,因为它沿着一条直线。

您可以将所有gameObjects放在单个父对象中,并遍历每个gameObject,检查其图层,然后检查它是否在您之上或之下

类似的事情可能起作用:

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
        }
    }
}

另外,您应该尝试存储Collider组件,而不要使用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],false); //GameObjects below the player
        }
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...