origin | 射线在世界坐标系中的起点。 |
direction | 射线的方向。 |
maxDistance | 射线应检查碰撞的最大距离。 |
layerMask | 层遮罩,用于在投射射线时有选择地忽略碰撞体。 |
queryTriggerInteraction | 指定该查询是否应该命中触发器。 |
bool 如果射线与任何碰撞体相交,返回 true,否则返回 false。
向场景中的所有碰撞体投射一条射线,该射线起点为 /origin/,朝向 /direction/,长度为 /maxDistance/。
您可以选择提供一个 LayerMask,以过滤掉不想生成与其碰撞的碰撞体。
您可以通过指定 queryTriggerInteraction
来控制是让触发碰撞体生成命中效果,还是使用全局 Physics.queriesHitTriggers 设置。
注意:对于射线投射起点位于碰撞体内的情况,Raycast 不会检测到碰撞体。在所有这些示例中,都使用了 FixedUpdate 而不是 Update。请参阅事件函数的执行顺序,以了解 Update 与 FixedUpdate 的区别,以及它们与物理查询的关系。
using UnityEngine;
// C# example.
public class ExampleClass : MonoBehaviour { // See Order of Execution for Event Functions for information on FixedUpdate() and Update() related to physics queries void FixedUpdate() { // Bit shift the index of the layer (8) to get a bit mask int layerMask = 1 << 8;
// This would cast rays only against colliders in layer 8. // But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask. layerMask = ~layerMask;
RaycastHit hit; // Does the ray intersect any objects excluding the player layer if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, Mathf.Infinity, layerMask)) { Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.yellow); Debug.Log("Did Hit"); } else { Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * 1000, Color.white); Debug.Log("Did not Hit"); } } }
该示例创建一个简单的射线投射 - 从对象的当前位置向前投影,延伸 10 个单位。
using UnityEngine;
public class ExampleClass : MonoBehaviour { // See Order of Execution for Event Functions for information on FixedUpdate() and Update() related to physics queries void FixedUpdate() { Vector3 fwd = transform.TransformDirection(Vector3.forward);
if (Physics.Raycast(transform.position, fwd, 10)) print("There is something in front of the object!"); } }
origin | 射线在世界坐标系中的起点。 |
direction | 射线的方向。 |
hitInfo | 如果返回 true,则 hitInfo 将包含有关最近的碰撞体的命中位置的更多信息。(另请参阅:RaycastHit)。 |
maxDistance | 射线应检查碰撞的最大距离。 |
layerMask | 层遮罩,用于在投射射线时有选择地忽略碰撞体。 |
queryTriggerInteraction | 指定该查询是否应该命中触发器。 |
bool 当光线与任何碰撞体相交时,返回 true,否则返回 false。
向场景中的所有碰撞体投射射线,并返回有关命中对象的详细信息。
该示例报告当前对象与报告的碰撞体之间的距离:
using UnityEngine;
public class RaycastExample : MonoBehaviour { // See Order of Execution for Event Functions for information on FixedUpdate() and Update() related to physics queries void FixedUpdate() { RaycastHit hit;
if (Physics.Raycast(transform.position, -Vector3.up, out hit)) print("Found an object - distance: " + hit.distance); } }
该示例重新引入 maxDistance
参数,以限制投射射线的距离:
using UnityEngine;
public class RaycastExample : MonoBehaviour { // See Order of Execution for Event Functions for information on FixedUpdate() and Update() related to physics queries void FixedUpdate() { RaycastHit hit;
if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0f)) print("Found an object - distance: " + hit.distance); } }
ray | 光线的起点和方向。 |
maxDistance | 射线应检查碰撞的最大距离。 |
layerMask | 层遮罩,用于在投射射线时有选择地忽略碰撞体。 |
queryTriggerInteraction | 指定该查询是否应该命中触发器。 |
bool 当光线与任何碰撞体相交时,返回 true,否则返回 false。
与上面使用 ray.origin
和 origin
(而不是 origin
和 /direction/)时相同。
using UnityEngine;
public class ExampleClass : MonoBehaviour { // See Order of Execution for Event Functions for information on FixedUpdate() and Update() related to physics queries void FixedUpdate() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, 100)) print("Hit something!"); } }
ray | 光线的起点和方向。 |
hitInfo | 如果返回 true,则 hitInfo 将包含有关最近的碰撞体的命中位置的更多信息。(另请参阅:RaycastHit)。 |
maxDistance | 射线应检查碰撞的最大距离。 |
layerMask | 层遮罩,用于在投射射线时有选择地忽略碰撞体。 |
queryTriggerInteraction | 指定该查询是否应该命中触发器。 |
bool 当光线与任何碰撞体相交时,返回 true,否则返回 false。
与上面使用 ray.origin
和 origin
(而不是 origin
和 /direction/)时相同。
该示例实现以下功能:每当检测到碰撞时,沿射线长度绘制一条线:
using UnityEngine;
public class ExampleClass : MonoBehaviour { // See Order of Execution for Event Functions for information on FixedUpdate() and Update() related to physics queries void FixedUpdate() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100)) Debug.DrawLine(ray.origin, hit.point); } }
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.