如何解决Unity C#检测以上所有游戏对象
我希望我的玩家能够检测到第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);
}
}
我该如何解决这个问题?谢谢您的答复。
解决方法
只需在您的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
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。