origin | 射线在世界坐标系中的起点。 |
direction | 射线的方向。 |
maxDistance | 射线应该检查碰撞的最大距离。 |
layerMask | 一个层蒙版,用于在投射射线时有选择地忽略碰撞器。 |
queryTriggerInteraction | 指定此查询是否应该命中触发器。 |
bool 如果射线与碰撞器相交,则返回 true,否则返回 false。
从点origin
,沿方向direction
,长度为maxDistance
,针对场景中的所有碰撞器投射一条射线。
您可以选择提供一个层蒙版,以过滤掉您不感兴趣的任何与之生成碰撞的碰撞器。
指定queryTriggerInteraction
允许您控制触发器碰撞器是否生成命中,或者是否使用全局Physics.queriesHitTriggers 设置。
注意:射线投射不会检测到射线投射原点位于碰撞器内部的碰撞器。在所有这些示例中,使用的是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
和ray.direction
而不是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
和ray.direction
而不是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); } }