-
射线检测
2019-10-16 11:07:13unity中射线检测时非常实用也经常实用的一种手段。下面讲解一下射线检测问题 1.射线Ray 根据射线端点和射线的方向定义一条射线,Ray ray= new Ray(transform.position, transform.forward); 定义一个包含射线投射...
unity中射线检测时非常实用也经常实用的一种手段。下面讲解一下射线检测问题1.射线Ray
根据射线端点和射线的方向定义一条射线,Ray ray= new Ray(transform.position, transform.forward);
定义一个包含射线投射信息的变量RaycastHit hit,并进行射线检测Physics.SphereCast:RaycastHit hit; if(Physics.SphereCast(ray,1f,out hit)) { if(hit.distance<3f) { float angle = Random.Range(90, 110); print(angle); transform.Rotate(0, angle, 0); } }
通过结构体变量hit既可以获取射线碰到物体后相关数据,如hit.Point(碰撞点坐标),hit.transform.gameObject(碰撞物体对象,进而可以获取游戏物体上的脚本组件,进而可以调用组件上的方法或者变量); 射线检测时可以用Raycast也可以用SphereCast,具体用什么类型的射线投射可以根据需求自己选择
2.屏幕射线
屏幕射线(摄像机射线)为有camera发出的射线,从point点像摄像机方向发出射线。
Ray ray = mainCamera.ScreenPointToRay(point); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { StartCoroutine(CreateOnShow(hit.point)); GameObject hitGobj = hit.transform.gameObject; ReactTOHIt newReactor = hitGobj.GetComponent<ReactTOHIt>(); if(newReactor!=null) { newReactor.React(); } }
-
画射线,射线检测
2020-03-24 09:50:04画射线,射线检测 //射线 public LineRenderer line; void Update() { //射线检测,画射线 RayBehaviour(); //射线检测 RayBuild(); } public void RayBehaviour() { //0 表示射线的起点 line.SetPosition(0, ...画射线,射线检测
[RequireComponent(typeof(LineRenderer))]
//射线
public LineRenderer line;
void Update()
{
//射线检测,画射线
RayBehaviour();
//射线检测
RayBuild();
}
public void RayBehaviour()
{
//0 表示射线的起点
line.SetPosition(0, OriginPos.position);
Ray ray = new Ray(OriginPos.position, OriginPos.forward);
RaycastHit hitInfo;
//20是射线的长度,射线检测
if (Physics.Raycast(ray, out hitInfo, 20))
{
//1 是射线的终点,当然了后面还可以添加很多值 可以画折线什么的 2 3 4,每一个都是一个线段的位置
line.SetPosition(1, hitInfo.point);
//cursor.position = hitInfo.point;
}
else
{
//检测在射线前方没有物体时,设置射线的长度
line.SetPosition(1, OriginPos.position + OriginPos.forward * 1);
//这个是自己做的一个物体的跟随,cursor的位置一直处于射线的前端
//cursor.position = OriginPos.position + OriginPos.forward * 1;
}
}//射线检测 void RayBuild() { Ray ray = new Ray(OriginPos.position, OriginPos.forward); RaycastHit hitInfo; if (Physics.Raycast(ray, out hitInfo, 20,~(1<<10))) { Debug.Log(hitInfo.transform); Debug.Log(hitInfo.transform.name); } }
-
unity 射线检测真机失效_Unity射线检测的用法总结
2020-12-19 23:07:19RayCast 射线检测本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)Chinar—— 心分享、心创新!助力快速理解Unity中射线检测的...RayCast 射线检测
本文提供全流程,中文翻译。
Chinar坚持将简单的生活方式,带给世人!
(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)
Chinar—— 心分享、心创新!
助力快速理解Unity中射线检测的基本用法
为新手节省宝贵的时间,避免采坑!
Chinar教程效果:
全文高清图片,点击即可放大观看(很多人竟然不知道)
1
Raycast —— 射线检测
Unity 中提供了一种控制方案,用以检测鼠标点在屏幕上后
具体点在了Unity 场景中,三维世界的哪个点上
用法上多种多样,在这里就不一一列举了,尽以检测到的点来做一个总结
这种解决方案,就是射线检测
通过鼠标点击屏幕,由屏幕点,向Unity三维直接发射一条无限长的射线
当检测到碰撞物体后,会返回被碰撞物体的所有信息,以及交点信息等等….
这里我用简单的划线来方便理解
2
Scritps —— 脚本
创建一个地板,和一个小球,作为简单的场景用于测试
讲脚本挂载空物体上,并在Inspector 面板将小球拖进Ball
具体代码如下
using UnityEngine;
using UnityEngine.AI;
///
/// 射线检测类
///
public class ChinarRayCast : MonoBehaviour
{
public Transform Ball; //小球(用来标记坐标)
//设置射线在Plane上的目标点target
private Vector3 target;
void Update()
{
if (Input.GetMouseButton(1)) //点击鼠标右键
{
object ray = Camera.main.ScreenPointToRay(Input.mousePosition); //屏幕坐标转射线
RaycastHit hit; //射线对象是:结构体类型(存储了相关信息)
bool isHit = Physics.Raycast((Ray) ray, out hit); //发出射线检测到了碰撞 isHit返回的是 一个bool值
if (isHit)
{
Debug.Log("坐标为:" + hit.point);
target = hit.point; //检测到碰撞,就把检测到的点记录下来
}
}
//如果检测到小球的坐标 与 碰撞的点坐标 距离大于0.1f,就移动小球的位置到 碰撞的点 :target
Ball.position = Vector3.Distance(Ball.position, target) > 0.1f ? Vector3.Lerp(Ball.position, target, Time.deltaTime) : target;
//Move(target);//以上是Move函数的简写,此函数可不调用
}
///
/// 移动方法
///
///
void Move(Vector3 target)
{
if (Vector3.Distance(Ball.position, target) > 0.1f)
{
Ball.position = Vector3.Lerp(Ball.position, target, Time.deltaTime);
}
//如果物体的位置和目标点的位置距离小于 0.1时直接等于目标点
else
Ball.position = target;
}
}
3
Effect —— 效果
通过邮件点击,可以查看最终效果
4
Extend —— 扩展
射线检测的牛逼之处在于,只要发出的射线与带有碰撞盒的物体,都会发生碰撞
并可以返回各种信息,例如被碰撞物体的位置、名称、法线等等一系列的数据
另外可以自定义发出射线的 距离、影响到的图层等等
///
/// 射线检测
///
public class ChinarRay : MonoBehaviour
{
void Update()
{
Ray ray = new Ray(transform.position, Vector3.down); //创建一条射线对象
RaycastHit hit; //碰撞信息对象结构体
bool isRaycast = Physics.Raycast(ray, out hit);
if (isRaycast)
{
Debug.DrawLine(ray.origin, hit.point, Color.green);
print("坐标" + hit.transform.position);
print("点" + hit.point);
print("重心坐标" + hit.barycentricCoordinate);
print("碰撞盒" + hit.collider);
print("距离" + hit.distance);
print("光线地图坐标" + hit.lightmapCoord);
print("法线" + hit.normal);
print("刚体" + hit.rigidbody);
print("纹理坐标" + hit.textureCoord);
print("三角指数" + hit.triangleIndex);//等等
}
}
}
支持
May Be —— 搞开发,总有一天要做的事!
拥有自己的服务器,无需再找攻略!
Chinar 提供一站式教程,闭眼式创建!
为新手节省宝贵时间,避免采坑!
技术交流群:806091680 !Chinar 欢迎你的加入
END
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址
-
unity 射线检测真机失效_Unity Raycast 射线检测
2020-12-21 19:52:30本文简要分析了Unity中射线检测的基本原理及用法,包括:Ray 射线RaycastHit 光线投射碰撞信息Raycast 光线投射SphereCast 球体投射OverlapSphere 相交球等项目地址:Raycast - SouthBegonia ...本文简要分析了Unity中 射线检测 的基本原理及用法,包括:
Ray 射线
RaycastHit 光线投射碰撞信息
Raycast 光线投射
SphereCast 球体投射
OverlapSphere 相交球等
项目地址:Raycast - SouthBegonia (https://github.com/SouthBegonia/UnityWorld/tree/master/Raycast)
Ray 射线
含义:官方解释为一条无穷的线,开始于origin点,朝向direction方向(但是,根据项目验证来看其默认长度为单位向量,只有对direction进行乘以倍率,才可实现延长射线,而非无穷)
用法:
Ray ray = new Ray(transform.position,transform.forward)
Ray camerRay = Camera.main.ScreenPointToRay(Input.mousePosition)
RaycastHit 光线投射碰撞信息
含义:取得从Raycast函数中得到的碰撞信息(注意不是collider哈,是包含collider信息)
关键变量:point、collider、rigidbody、transform
检测方法 - 线型检测
Physics.Raycast 光线投射
功能:在已有一条射线(也可无)的基础上,使用射线(新建射线)进行一定距离内的定向检测。可修改射线长度,限制其检测的Layer层,并且可以得到射线检测到的碰撞信息。但仅能检测到 第一个被射线碰撞的物体 ,后面的物体无法被检测到
用法:
Raycast(transform.position, Vector.forward, distance, LayerMask.GetMask("Enemy"))
Raycast(transform.position, Vector.forward, distance, out RaycastHitInformation ,LayerMask.GetMask("Enemy"))
Raycast (MyRay, distance, LayerMash.GetMask("Enemy"))
Raycast (MyRay, out RaycastHitInformation, distance, LayerMask.GetMask("Enemy"))适用场合:配合相机坐标转换实现各类交互
Physics.RaycastAll 所有光线投射
功能:机理用法大致同Raycast,当区别在于可检测射线路径上的 所有物体 ,返回检测信息的数组。其他带All后缀的方法也同理
用法:
RaycastHit[] hits = RaycastAll(Vector3.zero, Vector.forward, distance, LayerMask.GetMask("Enemy"))RaycastHit[] hits = RaycastAll(MyRay, distance, LayerMash.GetMask("Enemy"))
适用场合:穿透性检测
Physics.Linecast 线段投射
功能:建立 某两点之间 的射线进行检测,返回bool类型
用法:
Linecast(startPos, endPos, LayerMask.GetMask("Enemy"))
Linecast(startPos, endPos, out RaycastHit, LayerMask.GetMask("Enemy"))适用场合:特定地点局部距离射线检测
检测方法 - 体型检测
Physics.SphereCast 球体投射
功能:扩展检测范围为球形,返回bool类型。但是该投射用法需要万分小心,见下
用法:
SphereCast (originPos, radius, direction, out RaycastHit, distance, LayerMask.GetMask("Enemy"))
SphereCast (Ray, radius, out RaycastHit, distance, LayerMask.GetMask("Enemy"))适用场合:检测目的地是否可抵达,从而判断可移动性
Physics.Boxcast 块体投射/ CapsuleCast 胶囊体投射
功能:同球体投射
用法:同球体投射
Physics.OverlapSphere 相交球
功能:同样检测球形,但与SphereCast存在较大区别
用法:
Collider[] hits = Physics.OverlapSphere(startPos, radius, LayerMask.GetMask("Enemy"))
:以startPos为原点,创建半径为radius的球形,检测区域为整个球形包围体(实心),检测Enemy层上的物体,返回所有碰撞物体的collider而不是RaycastHit
适用场合:检测挂载物体球形范围内是否存在碰撞,常用方法
Physics.IgnoreCollision 忽略碰撞
IgnoreCollision (collider1, collider2, ignore)
参考
Physics.Raycast - UnityDocumentation
Unity常用射线检测方法 - 昵称好难写
Unity的学习笔记(射线检测) - 小鸟游
Unity3DAPI射线检测 - 码迷
声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。
作者:SouthBegonia
来源:https://www.cnblogs.com/SouthBegonia/p/11732340.html
More:【微信公众号】 u3dnotes
-
UGUI射线检测
2019-02-18 16:44:23主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上)。 Ignore Reversed Graphics:是否忽略反方向的图形,如果为true,则表示图形正面展示时,会... -
射线检测中CMOS的研究
2020-10-19 22:15:39射线检测技术利用X射线探测材料内部的不连续性,并在记录介质上显示出图像。随着技术的不断进步,射线检测从传统的以胶片为记录介质的照相方法不断扩展,形成了多种数字化射线检测手段,如底片的数字化处理技术... -
Unity 射线检测
2020-02-25 16:10:42要使用射线检测,物体必须是触发器或者碰撞器。 什么是触发器,碰撞器请看https://blog.csdn.net/qq_27461747/article/details/104492748 射线检测函数在Physics 类中。由于射线无法看见,调试起来非常不方便。Unity... -
unity射线检测
2020-03-06 13:08:47射线检测步骤 在代码中声明一个射线,可以是自定义的射线,也可以是鼠标位置或者其他什么的射线,自定义射线(通过定义射线的起始位置和发射方向):Ray mRay = new Ray(transform.position, transform.forward);... -
VRTK射线检测
2019-05-15 14:17:00VRTK射线检测回调事件 本人在工作中做VR隐患排查项目开发的时候,有个功能需要做到:按下手柄触摸板发送射线,松开触摸板的时候处理射线最后检测到的那个游戏物体。 功能构思:1、按下触摸板,从手柄上发射射线; ... -
unity鼠标射线检测
2020-03-04 16:07:56unity鼠标射线检测 首先获取鼠标在屏幕上点击的位置发出的射线,用方法Camera.ScreenPointToRay(Input.mousePosition) 声明射线检测的结果RaycastHit 使用物体射线的检测结果Physics.Raycast(),有很多重载的方法,... -
Unity射线检测功能
2019-09-18 19:27:20射线检测功能 -
UGUI射线检测或触碰检测
2020-06-06 14:06:08在开发移动端时,往往需要触碰UI实现与UI的交互,要是使用射线检测机制,这时候问题来了,会发现与UI交互不起作用,这是为什么呢? 解决方法有挺多的,以下是个人常用的两种解决办法: 方法一: 首先,要使用射线... -
Unity射线检测
2020-02-19 16:37:05射线检测 一般情况是从摄像机到鼠标点击位置生成射线。 void Update () { if (Input.GetMouseButtonDown(0)) { Ray ray = _cam.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit... -
unity 射线检测真机失效_Unity射线检测的各种方法(不是原创)
2020-12-19 23:07:271.普通射线检测(一般用于检测某一个物体)Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);Debug.DrawRay(ray.origin ,ray.direction , Color.red);RaycastHit hit;if(Physics .Raycast (ray,out hit,... -
Unity - 射线检测
2020-05-13 10:27:56Unity - 射线检测 本文简要分析了Unity中各类射线检测的基本原理及用法,及不同检测手段的性能对比。内容包括: Ray 射线 RaycastHit 光线投射碰撞信息 Raycast 光线投射 BoxCast/SphereCast/CapsuleCast 体... -
Unity中射线检测
2019-04-09 20:41:08主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上)。 Ignore Reversed Graphics:是否忽略反方向的图形,如果为true,则表示图形正面展示时,会...
-
细谈多维灰色预测模型GM(1,n)
-
svchost是什么程序
-
Spring Boot2.X仿朋友圈PC版系统实战_架构1.0
-
安装问题及安装全过程讲解.pdf
-
Python中输出的图如何调整图形位置
-
转行做IT-第2章 HTML入门及高级应用
-
preflight-2.0.13.jar
-
python数据分析基础
-
单元测试UnitTest+Pytest【Selenium3】
-
算法导论(基础知识)——编程大牛的必经之路
-
自适应权值的跨尺度立体匹配算法
-
CentOS7 MySQL8 主备安装
-
第3章 入门程序、常量、变量
-
电商设计专业思维
-
内部管理系统Spring boot/Spring MVC/Mybati
-
GTA5 v1.44 无限加载故事模式解决方法.zip
-
Redis数据库入门与使用
-
2021最新Kubernetes(k8s)集群实战精讲
-
soul源码学习(十一)-divide插件分析
-
JavaScrpit入门笔记