首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >统一C#检测以上所有游戏对象

统一C#检测以上所有游戏对象
EN

Stack Overflow用户
提问于 2020-09-13 13:39:57
回答 2查看 588关注 0票数 0

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

它所做的

我想要的

代码语言:javascript
运行
复制
   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);
       }
   }

我怎样才能解决这个问题?谢谢你的答复。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-13 14:55:00

问题是,你的雷卡斯特只是捕捉到的“命中”,是直接高于球员,因为它遵循一条直线。

您可以将所有的gameObjects放在一个父对象中,然后循环遍历每个gameObject,检查它的层,然后检查它在上面还是下面。

像这样的东西可以起作用:

代码语言:javascript
运行
复制
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<>(),因为它非常慢。

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

代码语言:javascript
运行
复制
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
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-09-13 13:56:45

只需在你的光线广播中加入分层掩膜过滤器。

代码语言:javascript
运行
复制
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);

不需要foreach

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63871466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档