Physics.Raycast 简介 ▼
Physics.Raycast 官方文档中提供的参数如下
Physics.Raycast 从指定的位置发射一条射线,如果射线与物体发生碰撞返回true否则返回false
其中射线的起点,方向是不可以省略的,其他参数可以省略
案例▼
- 第1,2个参数定义了一条射线的起点与方向
- 第3个参数为RaycastHi用以从射线获取参数
RaycastHit hit;
void Update()
{
//如果检测到物体
if (Physics.Raycast(transform.position, transform.forward, out hit))
{
Debug.Log(hit.collider);//命中的 Collider。
//打印一条从物体到碰撞点的红色射线,hit.point世界空间中射线命中碰撞体的撞击点
Debug.DrawLine(transform.position, hit.point, Color.red);
}
else //没有检测到物体
{
//打印一条从物体出发的黄色射线
Debug.DrawRay(transform.position, transform.position + transform.forward * 100, Color.yellow);
}
}
运行效果如下 可以看到射线与其他物体碰撞变成红色 ▼
也可以直接定义一条射线ray替换1,2条参数。下面的代码与上面的代码功能相同
Ray ray;
RaycastHit hit;
void Update()
{
ray = new Ray(transform.position, transform.forward);
//如果检测到物体
if (Physics.Raycast(ray, out hit))
{
Debug.Log(hit.collider);//输出命中的 Collider。
//打印一条从物体到碰撞点的射线,hit.point世界空间中射线命中碰撞体的撞击点
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
}
else //没有检测到物体
{
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
}
}
给射线设置一个检测距离之后,射线距离之外的物体不会发生碰撞
Physics.Raycast(ray, out hit,3)(可以看到射线碰撞到第一个方块之后变为红色,碰撞到第二个方块后没有改变,这是因为第二个方块超出了射线检测范围)▼
给Physics.Raycast设置一个遮罩参数之后可以有选择的忽略碰撞体。
(Physics.Raycast(ray, out hit, 10, mask)
这里我们给正方体Layer设置为Default,球形Layer设置为Sphere。之后选定Mask为Sphere
Ray ray;
RaycastHit hit;
public LayerMask mask;
void Update()
{
ray = new Ray(transform.position, transform.forward);
//如果检测到物体
if (Physics.Raycast(ray, out hit, 10, mask))
{
Debug.Log(hit.collider);//输出命中的 Collider。
//打印一条从物体到碰撞点的射线,hit.point世界空间中射线命中碰撞体的撞击点
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
}
else //没有检测到物体
{Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
}
}
运行效果如下,射线在接触到正方体是没有发生改变,接触到球形时变为红色▼
为Physics.Raycast设置一个QueryTriggerInteraction.Ignore参数之后,射线不在检测触发器
▼操作如下▼
为红色方块选择Is Triggr属性。蓝色方块不选。
- QueryTriggerInteraction.Collide 检测触发器
- QueryTriggerInteraction.Ignore 不检测触发器
Ray ray;
RaycastHit hit;
public LayerMask mask;
void Update()
{
ray = new Ray(transform.position, transform.forward);
//如果检测到物体
//QueryTriggerInteraction.Collide 检测触发器
//QueryTriggerInteraction.Ignore 不检测触发器
if (Physics.Raycast(ray, out hit, 10, mask, QueryTriggerInteraction.Ignore))
{
Debug.Log(hit.collider);//输出命中的 Collider。
//打印一条从物体到碰撞点的射线,hit.point世界空间中射线命中碰撞体的撞击点
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
}
else //没有检测到物体
{
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
}
}
运行效果如下▼ (射线碰撞到红色方块时没有发生改变,碰撞到蓝色方块变为红色)
Physics.Raycast 的使用 ▼
- 配合寻路导航系统,做移动到鼠标点击位置功能
---Unity中寻路导航的基本使用文章来源:https://www.toymoban.com/news/detail-716177.html
文章来源地址https://www.toymoban.com/news/detail-716177.html
using UnityEngine;
using UnityEngine.AI;
public class MoveToClickPoint : MonoBehaviour {
NavMeshAgent agent;
void Start() {
agent = GetComponent<NavMeshAgent>();
}
void Update() {
if (Input.GetMouseButtonDown(0)) {
RaycastHit hit;
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100)) {
agent.destination = hit.point;
}
}
}
}
到了这里,关于Unity中Physics.Raycast 的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!