版本: Unity 6 (6000.0)
语言英语
  • C#

Physics.Raycast

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交的内容,但我们会阅读用户提出的每项建议,并在适用时进行更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

参数

origin 射线在世界坐标系中的起点。
direction 射线的方向。
maxDistance 射线应该检查碰撞的最大距离。
layerMask 一个层蒙版,用于在投射射线时有选择地忽略碰撞器。
queryTriggerInteraction 指定此查询是否应该命中触发器。

返回值

bool 如果射线与碰撞器相交,则返回 true,否则返回 false。

描述

从点origin,沿方向direction,长度为maxDistance,针对场景中的所有碰撞器投射一条射线。

您可以选择提供一个层蒙版,以过滤掉您不感兴趣的任何与之生成碰撞的碰撞器。

指定queryTriggerInteraction 允许您控制触发器碰撞器是否生成命中,或者是否使用全局Physics.queriesHitTriggers 设置。

注意:射线投射不会检测到射线投射原点位于碰撞器内部的碰撞器。在所有这些示例中,使用的是FixedUpdate,而不是Update。请参阅事件函数执行顺序,了解UpdateFixedUpdate之间的区别,以及它们如何与物理查询相关。

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!"); } }

声明

public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask, QueryTriggerInteraction queryTriggerInteraction);

参数

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); } }

声明

public static bool Raycast(Ray ray, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

参数

ray 射线的起点和方向。
maxDistance 射线应该检查碰撞的最大距离。
layerMask 一个层蒙版,用于在投射射线时有选择地忽略碰撞器。
queryTriggerInteraction 指定此查询是否应该命中触发器。

返回值

bool 当射线与任何碰撞器相交时返回 true,否则返回 false。

描述

与上面相同,使用ray.originray.direction 而不是origindirection

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!"); } }

声明

public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

参数

ray 射线的起点和方向。
hitInfo 如果返回 true,则hitInfo 将包含有关最近碰撞器在哪里被命中的更多信息。(其他资源:RaycastHit)。
maxDistance 射线应该检查碰撞的最大距离。
layerMask 一个层蒙版,用于在投射射线时有选择地忽略碰撞器。
queryTriggerInteraction 指定此查询是否应该命中触发器。

返回值

bool 当射线与任何碰撞器相交时返回 true,否则返回 false。

描述

与上面相同,使用ray.originray.direction 而不是origindirection

此示例在检测到碰撞时沿射线的长度绘制一条线

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); } }