如何使光线投射忽略触发碰撞器?
How to make raycast ignore Trigger colliders?
我有一个函数可以检查一个游戏对象是否可以看到另一个游戏对象而没有任何东西挡住它的视线:
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" 标志的碰撞体发生碰撞;我希望光线投射忽略它们。有什么想法吗?
在 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;
}
}
图层蒙版操作不需要。如果这只是为了忽略标记为触发器的碰撞器,则不必使用图层。此操作现已内置于 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
to false
if you don't want it to detect triggers. Set it to true
when you want it to detect triggers once again. Make sure to set it before calling the Physics2D.Raycast
函数。
不检测触发器:
Physics2D.queriesHitTriggers = false;
检测触发器:
Physics2D.queriesHitTriggers = true;
您正在寻找 2D 版本。
注:
我看到有关这在某些特定版本的 Unity 上不起作用的报告,这是一个错误,但我认为它现在已修复。如果不是,则使用 .
所述的图层
要让您的光线投射忽略 5.2 中的所有触发碰撞器,请转到:
编辑 > 项目设置 > 物理 > 取消选中 "Queries Hit Triggers"
(如果您使用的是旧版本的 Unity,则复选框名称为 "Raycasts Hit Triggers")
实际上在版本 5.2.0f3 中它不再说 Raycasts... 现在显示为:"Queries Hit Triggers" 如果您希望光线投射通过触发碰撞器,请取消选中。
我有一个函数可以检查一个游戏对象是否可以看到另一个游戏对象而没有任何东西挡住它的视线:
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" 标志的碰撞体发生碰撞;我希望光线投射忽略它们。有什么想法吗?
在 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;
}
}
图层蒙版操作不需要。如果这只是为了忽略标记为触发器的碰撞器,则不必使用图层。此操作现已内置于 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
to false
if you don't want it to detect triggers. Set it to true
when you want it to detect triggers once again. Make sure to set it before calling the Physics2D.Raycast
函数。
不检测触发器:
Physics2D.queriesHitTriggers = false;
检测触发器:
Physics2D.queriesHitTriggers = true;
您正在寻找 2D 版本。
注:
我看到有关这在某些特定版本的 Unity 上不起作用的报告,这是一个错误,但我认为它现在已修复。如果不是,则使用
要让您的光线投射忽略 5.2 中的所有触发碰撞器,请转到:
编辑 > 项目设置 > 物理 > 取消选中 "Queries Hit Triggers"
(如果您使用的是旧版本的 Unity,则复选框名称为 "Raycasts Hit Triggers")
实际上在版本 5.2.0f3 中它不再说 Raycasts... 现在显示为:"Queries Hit Triggers" 如果您希望光线投射通过触发碰撞器,请取消选中。