Unity射线编程详解

简介: Unity射线编程详解

⚠️:本文为上篇文章:http://t.csdn.cn/VQy63中对射线检测编程的补充


一、射线碰撞信息

射线检测有着丰富的碰撞信息,如可以获取到碰撞点坐标、被碰撞物体的所有信息,甚至可以获取到碰撞点的发现。这些信息都被保存在RaycastHit结构体中。

以下几个Raycast()函数的重载可以获取到碰撞信息

bool Raycast(Vector3 origin,Vector3 direction,out RaycastHit hitInfo,float maxDistance);

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

bool Raycast(Ray ray,out RaycastHit hitInfo,float maxDistance,int layerMask);

综合用法演示如下

//声明变量,用于保存信息
RaycastHit hitInfo;
//发射射线,起点是当前物体的位置,方向时世界前方
if(Physiics.Raycast(transform.position,Vector3.forward,out hitInfo))
{
//如果碰到物体,会运行到这里
//获取碰撞点的世界坐标
Vector3 point=itInfo.point;
//获取对方的碰撞体组件
Collider coll=hitInfo.collider;
//获取对方的Transform组件
Transform trans=hitInfo.transform;
//获取对方的物体名称
string name=coll.gameObject.namel
//获取碰撞点的法线向量
Vector3 normal=hitInfo.normal;

二、其他形状的射线

射线不仅可以有长度,还可以有粗细和形状。如球形、盒子、和胶囊体射线。

与发射射线类似,各种形状的射线也有很多种函数重载,以下是几种常用的重载形式

//球形射线

bool SphereCast(Ray ray,float radius);

bool SphereCast(Ray ray,float radius,out RaycastHit hitInfo);

//盒子射线

bool BoxCast(Vector3 center,Vector3 halfExtents,Vector3 direction);

bool BoxCast(Vector3 center,Vector3 halfExtents,Vector3 direction,out RaycastHit hitInfo,Quaternion orientation);

//胶囊体射线

bool CapsuleCast(Vector3 point1,Vector3 point2,float radius,Vector3 direction);

bool CapsuleCast(Vector3 point1,Vector3 point2,float radius,Vector3 direction,out RaycastHit hitInfo,float maxDistance);

可以看出,它们都与直线型射线差不多,只是多了半径、体对角线、朝向之类的。

三、穿过多个物体的射线

有时候需要射线在遇到第一个物体时不停止,继续前进,穿过多个物体。

Physics.RaycastAll()函数可以获取到射线沿途碰撞到的所有碰撞信息,返回值为RaycastHit数组。举例如下

RaycastHit[] RaycastAll(Ray ray,float maxDistance);

RaycastHit[] RaycastAll(Vector3 origin,Vector3 direction,float maxDirection);

RaycastHit[] RaycastAll(Ray ray,float maxDistance,int layerMask);

RaycastHit[] RaycastAll(Ray ray);

同样,也有SpherecastAll、BoxcastAll和CapsulecastAll。

四、区域覆盖型射线(Overlap)

有时需要检测一个空间范围,物理系统也提供了这类函数,均以Physics.Overlap开头,举例如下

Collider[] OverlapBox(Vector3 center,Vector3 halfExtents,Quaternion orientation,int layerMask);

Collider[] OverlapCapsule(Vector3 point0,Vector3 point1,float radius,int layerMask);

Collider[] OverlapSphere(Vector3 position,float radius,int layerMask);

以球形检测OverSphere为例,调用函数时,会返回原点为position、半径为radius的球体内满足一定条件的碰撞体集合(以数组表示),而这球体称为"3D相交球"。

五、射线调试技巧

看到这里我们会发现,射线检测函数类型多、参数多、重载多,很容易把自己绕懵。这里介绍一个提高编程效率的方法:使用Debug.DrawLine()函数和Debug.DrawRay()函数。将看不见的射线以可视化的形式表现出来,方便查看参数是否正确。

Debug.DrawLine(),Debug.DrawRay()函数的常用形式如下

void DrawLine(Vector3 start,Vector3 end,Color color);

void DrawLine(Vector3 start,Vector3 end,Color color,float duration);

void DrawRay(Vector3 start,Vector3 dir,Color color);

void DrawRay(Vector3 start,Vector3 dir,Color color,float duration);

Debug.DrawLine()函数通过制定线段的起点、终点和颜色(默认为红色),绘制一条线段

Debug.DrawRay则是通过制定起点和方向向量,绘制一条射线。

这里需要注意的是,DrawLine第二个参数是终点坐标,而不是一般的方向向量。

以上函数的最后一个参数,duration,可以省略。省略后这条参考线只出现一帧。如果在代码中每帧都会直线条,则可以省略。如果只出现一帧且看不清,则可以听写一个较大的持续时间(单位为秒),让射线停留在屏幕上以便查看。


相关文章
|
12月前
|
图形学
Unity射线检测的避坑指南
Unity射线检测的避坑指南
|
2月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
40 0
|
5月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
137 2
|
5月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
102 0
|
10月前
|
算法 图形学
Unity物理系统脚本编程(下)
Unity物理系统脚本编程(下)
|
10月前
|
人工智能 图形学
Unity物理系统脚本编程(上)
Unity物理系统脚本编程(上)
|
图形学
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
369 0
|
API 图形学 C++
【Unity趣味编程】——c++实现小球的自由移动
【Unity趣味编程】——c++实现小球的自由移动
130 0
|
图形学
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
413 1
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
|
数据可视化 vr&ar 图形学
Unity可视化编程XDreamer插件导入
前言 XDreamer是一款基于Unity平台开发的,可在Unity(包括编辑器与运行时)中使用的可扩展的中文交互编辑软件,可进行2D、3D、VR、AR、MR开发。 本期博客为XDreamer的官方讲解的学习记录。可以理解为UE4中的蓝图效果。是从事美术人员的福音,美术人员也可不用编写程序进行游戏的制作。 一、下载XDreamer官方插件包 XDreamer中文交互编辑器http://www.xdreamer.com.cn/请在官网进行下载,得到如下的文件。 二、插件加载 目前我导入到URP
579 0
Unity可视化编程XDreamer插件导入