当前位置: 首页 > news >正文

Unity 射线检测

文章目录

  • 1. 定义
  • 2. 重要类和方法
    • 2.1 Ray
    • 2.2 从屏幕发出射线:
    • 2.3 Raycast
    • 2.4 RaycastAll
    • 2.5 RaycastHit 碰撞信息
    • 2.6 layerMask 让射线检测只检测指定层级的对象

1. 定义

在Unity中,射线检测(Raycasting)是一种常用的技术,用于检测射线是否与场景中的物体相交。这在游戏开发中用于实现点击物体、射线武器的碰撞检测、角色与环境的交互等方面非常有用。

2. 重要类和方法

2.1 Ray

定义:表示从一个点沿着特定方向延伸的虚拟线段
属性:

  • direction 射线的方向。
  • origin 射线的原点。

构造函数:

public Ray (Vector3 origin, Vector3 direction);

在场景中绘制射线(仅在 Debug 下可见):

 // 创建射线
Ray ray = new Ray(Vector3.zero, Vector3.forward);// 在场景中绘制射线,可选操作(仅用于调试目的)
Debug.DrawRay(ray.origin, ray0.direction * 10f, Color.red);

2.2 从屏幕发出射线:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

void Update()
{if (Input.GetMouseButton(0)) {Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);Debug.DrawRay(ray.origin, ray.direction * 10f, Color.red);}}

2.3 Raycast

定义:射线检测获取相交的单个物体,它可以检测射线是否与某个物体相交,如果相交,还可以获取有关交点的信息

bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);
参数含义:
Ray——射线对象
RaycastHit——碰撞(相交)对象信息
maxDistance——射线检测的最大距离
layerMask——层蒙版(用于只检测特定层对象)
返回值含义:
bool——当射线和物体相交时返回true

void Update()
{if (Input.GetMouseButtonDown(0)) {Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;if (Physics.Raycast(ray, out hitInfo)){// 射线与物体相交Debug.Log($"Name:{hitInfo.collider.name},Point:{hitInfo.point}");}}
}

在这里插入图片描述

2.4 RaycastAll

定义:射线检测获取相交的多个物体
RaycastHit[] RaycastAll(Ray ray, float maxDistance, int layerMask);
RaycastHit[]——当射线和物体相交时,返回相交的物体们,如果没有碰撞到,数组长度为0

void Update()
{if (Input.GetMouseButtonDown(0)) {Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit[] hitInfos;hitInfos = Physics.RaycastAll(ray, int.MaxValue);// 射线与物体相交foreach (var item in hitInfos){Debug.Log($"Name:{item.collider.name},Point:{item.point}");}       }
}

在这里插入图片描述

2.5 RaycastHit 碰撞信息

在这里插入图片描述

2.6 layerMask 让射线检测只检测指定层级的对象

LayerMask.NameToLayer(层名):根据层名字转换为层编号的方法
层编号:
在这里插入图片描述
1 << LayerMask.NameToLayer(“Cube”)

void Update()
{if (Input.GetMouseButtonDown(0)) {Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;// 1 << LayerMask.NameToLayer("Cube") 将 1 左移得到的层级编号位数,得到层级编号的二进制if (Physics.Raycast(ray, out hitInfo, int.MaxValue, 1 << LayerMask.NameToLayer("Cube"))){// 射线与物体相交Debug.Log($"Name:{hitInfo.collider.name},Point:{hitInfo.point}");}}
}

在这里插入图片描述

http://www.lryc.cn/news/128685.html

相关文章:

  • 微信支付报非法的密钥大小: Caused by: java.security.InvalidKeyException: Illegal key size
  • React 调试开发插件 React devtools 的使用
  • linux 搜索命令
  • 如何使用Spark/Flink等分布式计算引擎做网络入侵检测
  • 基于php驾校驾驶理论考试模拟系统
  • vue3+elementPlus table里添加输入框并提交校验
  • ios swift5 collectionView 瀑布流(两列)
  • 创建一个简单的HTML Viewer应用程序
  • 无公网IP,公网SSH远程访问家中的树莓派教程
  • 「UG/NX」Block UI 超级截面SuperSection
  • 高层建筑全景vr火灾隐患排查模拟培训软件助力群众防范火灾伤害
  • 【WPF】 本地化的最佳做法
  • VS2017编译同事VS2022创建的库,报错无法运行rc.exe
  • Leetcode49. 字母异位词分组
  • 设计模式之工厂方法模式(FactoryMethod)
  • python的进度条tqdm库,显示时进度条不换行设置
  • spark的使用
  • 力扣:66. 加一(Python3)
  • Go的标准库Context理解
  • Nuxt3_1_路由+页面+组件+资源+样式 使用及实例
  • Kafka第三课
  • elasticsearch修改es集群的索引副本数量
  • 【SpringCloud】Ribbon定制化配置
  • Mac terminal 每次打开都要重新配置文件
  • el-button实现按钮,鼠标移入显示,移出隐藏
  • uniapp+uview封装小程序请求
  • idea常见错误大全之:解决全局搜索失效+搜索条件失效(条件为空)+F8失灵
  • 【论文阅读】基于深度学习的时序预测——LTSF-Linear
  • 02.FFMPEG的安装和添加硬件加速自编译
  • elementUI 的上传组件<el-upload>,自定义上传按钮样式