我想让我的玩家检测第8层中的所有游戏对象。我已经找到了一个代码,可以检测上面所有的游戏对象,但是它只是在x=0行上检测,就像在这些图中一样,
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);
}
}
我怎样才能解决这个问题?谢谢你的答复。
发布于 2020-09-13 14:55:00
问题是,你的雷卡斯特只是捕捉到的“命中”,是直接高于球员,因为它遵循一条直线。
您可以将所有的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], myCollider, false); //GameObjects below the player
}
}
}
发布于 2020-09-13 13:56:45
只需在你的光线广播中加入分层掩膜过滤器。
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
。
https://stackoverflow.com/questions/63871466
复制相似问题