unity3d 射线的原理,基础用法
射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。
Ray射线类和RaycastHit射线投射信息类是射线中常用的两个工具类。
用途:射线多用于碰撞检测(如:射击游戏里是否击中目标)、角色移动、判断是否触碰到3D世界中的哪些物体对象,进而操作等。
基础API:
Ray 射线类 :【使用鼠标拾取或者判断子弹是否碰到對象,需要往特定方向发射射线。方向可能是世界坐标中的一个矢量方向,或屏幕上某一点。针对后者,提供了两个API,如下:】
1、Ray Camera.main.ScreenPointToRay(Vector3 pos) 返回一条射线Ray从摄像机的近口點nearClip到屏幕指定一个点;若射线未碰撞到物体[需要含有碰撞器组件],碰撞点hit.point的值是(0,0,0);pos:利用实际像素值表示射线到屏幕上的位置。pos的x或者y分量由0增到最大值,射线將由一边移到另一边。但pos是在屏幕上,故z分量始终是0;
2、Ray Camera.main.ViewportPointToRay(Vector3 pos) 返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点;pos:用單位化比例值的方式表示射线到屏幕上的位置。
RaycastHit 光线投射碰撞信息:
1、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)
射线与碰撞器发生碰撞时返回真,否则未穿过任何碰撞器则返回false。【origin:在世界坐标中射线起点;direction:射线的方向矢量;distance:射线长度,即起点到设定的终点的距离,默认是无限长;layerMask:显示层掩码,指定层次的碰撞器碰撞,其他层次的碰撞則会被忽略掉。】
2、 bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)
在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的信息,包括位置等的信息。
3、 bool Physics.Raycast(Ray ray, float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
4、 bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
注:如果从一个球型体的内部到外部用光线投射,返回为假。
distance: 射线的长度
hit: 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。
layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞
5、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)
投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。
6、layerMask:共有32個层,对应使用一个32位整数的个位來表示每个层级,这个位为1示使用该层,為0表示不使用该层。
将代码直接拖拽到主相机上,或者其他对象身上:
using UnityEngine;
using System.Collections; public class RayTest : MonoBehaviour { void Start () {
}
void Update ()
{
if(Input.GetMouseButton())
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出到点击坐标的射线
RaycastHit hitInfo;
if(Physics.Raycast(ray,out hitInfo))
{
Debug.DrawLine(ray.origin,hitInfo.point);//scene視圖可看到 DrawLine(Vector3 origin,Vector3 end,Color col):衹有儅發生碰撞時,在Scene視圖才可以看到畫出的射綫。
GameObject Obj = hitInfo.collider.gameObject; Debug.Log("click object name is " + Obj.name); if(Obj.tag == "xx")//当射线碰撞目标为名字為xx的對象 ,执行以下操作 { DoSomething.... } } } } }
若有不對之處,還請幫忙指正哦。
射线的讲解很清楚的一個链接:https://blog.csdn.net/u013490128/article/details/53317996
unity3d 射线的原理,基础用法的更多相关文章
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
原地址:http://www.cnblogs.com/xuling/archive/2013/03/04/2943154.html 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西 ...
- 【Unity3d】Ray射线初探-射线的原理及用法
http://www.xiaobao1993.com/231.html 射线是一个无穷的线,开始于origin并沿着direction方向. 当射线碰到物体后.它就会停止发射. 在屏幕中拉一个CUBE ...
- Nmap扫描原理与用法
Nmap扫描原理与用法 1 Nmap介绍 Nmap扫描原理与用法PDF:下载地址 Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Audit ...
- Web安全学习笔记之Nmap扫描原理与用法
1 Nmap介绍 Nmap扫描原理与用法PDF:下载地址 Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具.软件名字N ...
- 初涉IPC,了解AIDL的工作原理及用法
初涉IPC,了解AIDL的工作原理及用法 今天来讲讲AIDL.这个神奇的AIDL,也是近期在学习的,看了某课大神的解说写下的blog,希望结合自己的看法给各位同价通俗易懂的解说 官方文档:http:/ ...
- Python函数装饰器原理与用法详解《摘》
本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...
- ASM的基础用法
本文转载自ASM的基础用法 导语 新闻里使用的热补丁修复方案是基于AspectJ,AspectJ是AOP的一种实现. 无意接触到一种小巧轻便的Java字节码操控框架ASM,它也能方便地生成和改造Jav ...
- PropertyGrid控件由浅入深(二):基础用法
目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...
- Linux学习之CentOS(二十八)--RAID原理基础及Linux下软件RAID配置
一.RAID的原理基础 在 讲解RAID的原理基础之前,我们首先来了解一下传统磁盘的劣势.我们知道一台PC机种都会包含CPU.内存.主板.硬盘.网卡等硬件,影响计算机性能的 组建包括:CPU.主板总线 ...
随机推荐
- route 的标志位
linux下利用route命令查看当前路由信息时,会打印如下信息: root@root:/# route Kernel IP routing tableDestination Gateway ...
- 转载:Java中的字符串常量池详细介绍
引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...
- Ex 5_28 Alice想要举办一个舞会..._第十次作业
根据总人数建立顶点数量为总人数的无向图,顶点之间有边相连表示两个人相互认识,没有边则表示不认识.对于每一个顶点v,设d(v)表示顶点的度,若d(v)<5,即v认识的人数少于5,则不邀请v,若d( ...
- spring事物的传播行为及隔离
关于@Transactional注解: 添加事务注解1.使用 propagation 指定事务的传播行为, 即当前的事务方法被另外一个事务方法调用时如何使用事务, 默认取值为 REQUIRED, 即使 ...
- css之hover改变子元素和其他元素样式
参考地址:链接 +表示下一级元素,>表示子元素 <!DOCTYPE html> <html> <head lang="en"> <m ...
- STM32学习及应用笔记二:一次运算符优先级造成的错误
本人在最近一个项目的开发中,出现一个应为疏忽运算符优先级造成的问题,检查了很久才发现问题,所以觉得运算符的优先级问题还是有必要再研究一下.具体的问题是这样的,我采集了传感器的原始数据,然后会对数据进行 ...
- Laravel Eloquent 数据查询结果中日期的格式化
两种情况: 使用 Model 的查询 例如: $item = App\Models\Apple::first(); $date = $item->created_at->format('Y ...
- 全局JavaScript对象
- 《剑指offer》-统计整数二进制表示中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位 ...
- Angular2学习(一)
Angular2的新特性: angular2的核心: 模块.组件.元数据.模板.数据绑定.服务.指令.依赖注入.模块. 组件:层层嵌套,形成组件树.父子组件沟通有输入和输出接口 组件包含JavaScr ...