我有一个函数,检查游戏对象是否可以看到另一个游戏对象,而不会阻止其视图:
public bool CheckVision(GameObject target)
{
RaycastHit2D ray = (Physics2D.Raycast(transform.position, target.transform.position - transform.position, m_VisionRange));
if(ray.collider.name == target.name)
{
Debug.DrawRay(transform.position, target.transform.position - transform.position);
return true;
}
else
{
return false;
}
}
唯一的问题是我不希望它与设置了“isTrigger”标志的碰撞器碰撞;我希望raycast能够忽略它们。有任何想法吗?
要让你的光线投射忽略5.2中的所有触发器碰撞器,请转到:
编辑>项目设置>物理>取消选中“查询命中触发器”
(如果您使用的是较旧版本的Unity,则复选框称为“Raycasts Hit Triggers”)
实际上在版本5.2.0f3中它不再说Raycasts ......它现在显示为:“查询命中触发器”如果你想让光线投射通过触发器碰撞器,请取消选中。
此操作不需要层掩码操作。如果仅忽略标记为触发器的碰撞器,则不必使用图层。此操作现在内置于Unity 5.2及更高版本。
1.对于3D,将QueryTriggerInteraction.Ignore
传递给Physics.Raycast
函数。
int layer = 1 << LayerMask.NameToLayer("Default");
Physics.Raycast(cameraRay, out hit, distance, layer, QueryTriggerInteraction.Ignore);
2.对于2D,如果您不希望它检测触发器,请将Physics2D.queriesHitTriggers
设置为false
。如果希望它再次检测触发器,请将其设置为true
。确保在调用Physics2D.Raycast
函数之前设置它。
不检测触发器:
Physics2D.queriesHitTriggers = false;
检测触发器:
Physics2D.queriesHitTriggers = true;
您正在寻找2D版本。
注意:
我已经看到有关这种情况的报告不能用于某些特定版本的Unity,这是一个错误,但我认为它现在已经修复。如果没有,那么使用l1sten描述的图层。
在Ignore Raycast上更改触发的GameObjects图层或使用LayerMask https://docs.unity3d.com/ScriptReference/LayerMask.html
int targetLayer = 1 << LayerMask.NameToLayer("Target Layer");
public bool CheckVision(GameObject target)
{
RaycastHit2D ray = (Physics2D.Raycast(transform.position, target.transform.position - transform.position, m_VisionRange, targetLayer ));
if(ray.collider.name == target.name)
{
Debug.DrawRay(transform.position, target.transform.position - transform.position);
return true;
}
else
{
return false;
}
}