unity射线碰撞检测+LayerMask的使用
射线在unity中是个很方便的东西,对对象查找、多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动等提供了很大的帮助,在此做个总结与大家分享下 ,若有不足欢迎吐槽
好了,话补多说啦,直接进入主题:
射线:在unity中射线是由一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。
相关API:
1、Ray Camera.main.ScreenPointToRay(Vector3 pos) 返回一条射线Ray从摄像机到屏幕指定一个点
2、Ray Camera.main.ViewportPointToRay(Vector3 pos) 返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点
3、Ray 射线类
4、RaycastHit 光线投射碰撞信息
5、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)
在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()。
bool Physics.Raycast(Ray ray, float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
注意:如果从一个球型体的内部到外部用光线投射,返回为假。
参数理解:
origin : 在世界坐标中射线的起始点
direction: 射线的方向
distance: 射线的长度
hit: 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。
layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞
6、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)
投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。
列子如下:
using UnityEngine;
using System.Collections;
public class RayTest : MonoBehaviour {
// Use this for initialization
void Start ()
{
mainCrma = Camera.main;
}
private Camera mainCrma;
private RaycastHit objhit;
private Ray _ray;
void Update ()
{
if (Input.GetMouseButtonDown(0))
{
_ray=mainCrma.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
Debug.DrawLine(_ray.origin,objhit.point,Color.red,2);//显示一条射线,只有在scene视图中才能看到
if (Physics.Raycast (_ray, out objhit, 100))
{
GameObject gameObj = objhit.collider.gameObject;
Debug.Log("Hit objname:"+gameObj.name+"Hit objlayer:"+gameObj.layer);
}
}
}
}
layerMask参数:
Raycast (ray : Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers)
其实很简单:1 << 10 打开第10的层。
~(1 << 10) 打开除了第10之外的层。
~(1 << 0) 打开所有的层。
(1 << 10) | (1 << 8) 打开第10和第8的层。
列子如下:
using UnityEngine;
using System.Collections;
public class LayerMaskTest : MonoBehaviour {
// Use this for initialization
void Start ()
{
mainCrma = Camera.main;
mask = 1<<( LayerMask.NameToLayer("cube"));//实例化mask到cube这个自定义的层级之上。
}
//private LayerMask mask 1<<10;
private LayerMask mask;
private Camera mainCrma;
private RaycastHit objhit;
private Ray _ray;
void Update ()
{
if (Input.GetMouseButtonDown(0))
{
_ray=mainCrma.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
Debug.DrawLine(_ray.origin,objhit.point,Color.red,2);//划出射线,只有在scene视图中才能看到
if (Physics.Raycast (_ray,out objhit, 100, mask.value))
{
GameObject gameObj = objhit.collider.gameObject;
Debug.Log("Hit objname:"+gameObj.name+"--Hit objlayerName:"+LayerMask.LayerToName (10));
}
}
}
}
创建2个cube,一个layer设置为:cube 一个layer设置为:Default
运行如下:
=============================
Ray只有起点和方向.函数附加x距离内的条件。
用到的Raycast主要有两个:
Physics.Raycast:
作用于任何物体,可以加限定 只检测某layer层
RaycastHit hit;
if(Physics.Raycast(transform.position, Vector3.down,out hit, 1000f))
print("dawdddd");
RaycastHit hit;
if(Physics.Raycast(transform.position, Vector3.down,out hit, 1000f,8))
print("dawdddd");
Collider.Raycast:
只检测ray是否穿过该Collider
RaycastHit hit;
Ray ray= new Ray(transform.position,Vector3.down);
if(collider.Raycast(ray,out hit,100))
print("dawdddd");
注意:
(1)无论是哪种raycast检测,从物体内部穿到外面的,都不视为穿过。只有从物体外穿到里面的才视为穿过。
(2)可以绘制 可见线 来辅助开发
1.Debug.DrawLine(V3 start,V3 end);
2. Gizmos.DrawLine (可以在编辑模式下显示,可视化更强)
如果在scene的Gizmos选项下 勾选 3D Gizmos, 那么线段位于真实3D空间里,有前后遮挡。
如果不勾选,则gizmo永远在最前显示。
void OnDrawGizmos () {
Vector3 checkPos_a =transform.position + new Vector3(0,0,0.2f);
Gizmos.color = Color.green;
Gizmos.DrawLine(checkPos_a,checkPos_a + Vector3.down*15);
}
unity 检测碰撞;unity射线使用;unity加碰撞;unity射线检测碰撞;射线检测unity;unity射线坐标;unity raycast layer;unity 查找所有子物体;unity 射线从自身发射;unity碰撞检测;unity 碰撞检测 没反应;unity 点 射线;unity中的射线;unity射线移动;unity碰撞;碰撞点 unity;unity产生碰撞;unity碰撞之后;unity碰撞后不移动;unity 射线碰撞检测;unity 射线检测 范围;unity 坐标射线;unity layer raycast;unity查找子物体;unity发射射线
unity射线碰撞检测+LayerMask的使用的更多相关文章
- Unity——射线系统
Unity射线系统 Demo展示 UI+Physical射线测试: FPS自定义射线测试: UGUI射线工具 实现功能,鼠标点击UI,返回鼠标点击的UI对象: 需要使用到鼠标点击事件-PointerE ...
- Unity——射线检测(鼠标点击开关门效果)
Unity射线检测--实现简单的开关门效果 简要:通过鼠标点击来发射一条射线,来获得射线所碰到的物体名称,再通过改变门的Rotation值来实现开关门的效果. 一.代码实现 1.1 简易的场景搭建 注 ...
- Unity Layout碰撞检测
第一次看到LayerMask根本不知道是什么东东,后来问问度娘,看了几篇文章,终于看明白一点点,在网上看到各路大神的解释,终于明白了,LayerMask实际上是一个位码操作,在Unity3d中Laye ...
- Unity射线检测的用法总结
RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...
- Unity学习-碰撞检测(七)
Unity脚本说明 Unity支持语言: C#(主流),JavaScript,Boo 创建脚本: [Assets-Create-C# Script] 学习案例 布置场景: 添加一个Plane,3个Cu ...
- unity射线检测
unity中射线检测时非常实用也经常实用的一种手段.下面讲解一下射线检测问题. 1)Ray 根据射线端点和射线的方向定义一条射线 Ray ray= new Ray(transform.position ...
- Unity射线
//射线原点 [SerializField] Transform tr; //射线长度 [SerializField] float dis = 5; //射线停留时间 [SerializFiel ...
- Unity项目 - 坦克大战3D TankBattle
目录 游戏原型 项目演示 绘图资源 代码实现 技术探讨 参考来源 游戏原型 游戏玩法:在有界的战场上,玩家将驾驶坦克,代表绿色阵营,与你的队友一起击溃红蓝阵营的敌人,在这场三方大战中夺得胜利! 操作指 ...
- Unity - LayerMask简析
本文简述了LayerMask的定义,后通过项目实战充分解析 LayerMask中的GetMask.LayerToName.NameToLayer 等函数的使用方法及其注意事项. 项目地址:3D坦克大战 ...
随机推荐
- Java日志框架介绍
一.序言 日志为系统的必不可少的一部分,通过输出的日志我们可以排查线上出现的各种问题,就像断案的线索一样.我们还可以通过日志数据分析用户的行为习惯做大数据分析. 二.日志框架分类及其历史 框架的种类: ...
- SpringBoot学习8:springboot整合freemarker
1.创建maven项目,添加pom依赖 <!--springboot项目依赖的父项目--> <parent> <groupId>org.springframewor ...
- Python 初始—(字符编码解码)
字符编码之间的编码转换则需要通过Unicode 进行转换,那么需要一个编码和解码实现与Unicode进行关联转换 例如utf-8转gbk utf-8----decode----->Unicode ...
- C/C++程序基础 (十一)标准模板库
标准模板库 标准模板库在标准函数库的定位 迭代器(类似指针)保证算法(常用算法)和容器(数据结构)的结合. vector的实现 底层实现是动态数组,所以支持随机访问. 内部是动态数组,随着insert ...
- java常量池概念【转】
http://blog.csdn.net/olanlanxiari/article/details/8104505
- webmin纯web界面管理linux系统
关键字: 摘要:从Windows环境的管理转到Linux环境的管理时所面临的挑战之一是,您需要去学习利用新的工具.作为一个管理员,您希望理解操作系统的细节以发挥它的最大功效.但是,当您还处在学习阶段时 ...
- POJ:3273-Monthly Expense
Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 32067 Accepted: 12081 Des ...
- mysql学习第三天练习(日期和时间函数)
-- 日期和时间函数 -- 获取当前日期 select curdate(),current_date() from dual -- 返回服务器当前的日期和时间 select NOW(),SYSDATE ...
- idea录制宏
录制一个热部署的快捷键 1.打开Edit-->Macros-->statr Macro Recording 打开之后idea右下角就会出现一个小圆点 然后就可以开始录制自己想要的快捷键 按 ...
- User_Authentication_Personalization Model
花了一天时间实现了一个 简单的用户登录验证的小模型. 基本实现了现在 用户登录模块的绝大多数功能, 也算是 熟悉了一下系统的逻辑. 在这个小模型中, 实现了以下的基本功能 : Logging in a ...