我有一个函数可以检查游戏对象是否可以看到另一个游戏对象,而不会阻挡其视图:
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能够忽略它们。有什么想法吗?
答案 0 :(得分:8)
图层蒙版操作不需要。如果仅忽略标记为触发器的碰撞器,则不必使用图层。此操作现在内置于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所描述的图层。
答案 1 :(得分:2)
要让你的光线投射忽略5.2中的所有触发器碰撞器,请转到:
编辑&gt;项目设置&gt;物理学&gt;取消选中“查询点击触发器”
(如果您使用的是旧版Unity,则复选框称为“Raycasts Hit Triggers”)
实际上在版本5.2.0f3中它不再说Raycasts ......它现在显示为:“查询命中触发器”如果你想让光线投射通过触发器碰撞器,请取消选中。
答案 2 :(得分:0)
在忽略光线投射上更改触发的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;
}
}