射线在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的使用的更多相关文章

  1. Unity——射线系统

    Unity射线系统 Demo展示 UI+Physical射线测试: FPS自定义射线测试: UGUI射线工具 实现功能,鼠标点击UI,返回鼠标点击的UI对象: 需要使用到鼠标点击事件-PointerE ...

  2. Unity——射线检测(鼠标点击开关门效果)

    Unity射线检测--实现简单的开关门效果 简要:通过鼠标点击来发射一条射线,来获得射线所碰到的物体名称,再通过改变门的Rotation值来实现开关门的效果. 一.代码实现 1.1 简易的场景搭建 注 ...

  3. Unity Layout碰撞检测

    第一次看到LayerMask根本不知道是什么东东,后来问问度娘,看了几篇文章,终于看明白一点点,在网上看到各路大神的解释,终于明白了,LayerMask实际上是一个位码操作,在Unity3d中Laye ...

  4. Unity射线检测的用法总结

    RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...

  5. Unity学习-碰撞检测(七)

    Unity脚本说明 Unity支持语言: C#(主流),JavaScript,Boo 创建脚本: [Assets-Create-C# Script] 学习案例 布置场景: 添加一个Plane,3个Cu ...

  6. unity射线检测

    unity中射线检测时非常实用也经常实用的一种手段.下面讲解一下射线检测问题. 1)Ray 根据射线端点和射线的方向定义一条射线 Ray ray= new Ray(transform.position ...

  7. Unity射线

    //射线原点 [SerializField] Transform tr; //射线长度    [SerializField] float dis = 5; //射线停留时间 [SerializFiel ...

  8. Unity项目 - 坦克大战3D TankBattle

    目录 游戏原型 项目演示 绘图资源 代码实现 技术探讨 参考来源 游戏原型 游戏玩法:在有界的战场上,玩家将驾驶坦克,代表绿色阵营,与你的队友一起击溃红蓝阵营的敌人,在这场三方大战中夺得胜利! 操作指 ...

  9. Unity - LayerMask简析

    本文简述了LayerMask的定义,后通过项目实战充分解析 LayerMask中的GetMask.LayerToName.NameToLayer 等函数的使用方法及其注意事项. 项目地址:3D坦克大战 ...

随机推荐

  1. elsevier期刊要求翻译

    百度文库 http://wenku.baidu.com/view/e20a27e84afe04a1b071de4e.html 官网文档 http://www.elsevier.com/journals ...

  2. xml中${}的使用含义(美元符号大括号,以Spring、ibatis、mybatis为例)

    项目中,经常会在xml中看到这样的写法: <properties resource="properties/database.properties"/> <dat ...

  3. css 伪类选择器制作登录框表单

    使用伪类选择器 制作鼠标悬停时文本框出现橙色虚线边框 制作鼠标激活时出现背景颜色淡橙色 使用css制作文本框圆角矩形效果,制作文本框背景图片,及背景不重复效果 <!DOCTYPE html> ...

  4. JS基础——JavaScript原型和原型链及实际应用

    构造函数 function Stu(name,age){ this.name=name; this.age=age; } instanceof 查看引用类型对象是属于哪个构造函数的方法,通过__pro ...

  5. BZOJ1965: [Ahoi2005]SHUFFLE 洗牌(exgcd 找规律)

    Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 989  Solved: 660[Submit][Status][Discuss] Description ...

  6. 浅谈MySQL字符集

      Preface       MySQL use character set & collation to organize the different charater.It provid ...

  7. 汇编:输出寄存器AX中的内容(子程序)

    ;输出寄存器AX中的内容(子程序) DATAS segment DATAS ends CODES segment START: mov AX,DATAS mov DS,AX ;正式代码开始 mov A ...

  8. HTML+CSS : 笔记整理(2 常规流,BFC,固定定位,z-index)

    BFC和常规流的关系是什么:常规流遵循BFC,IFC规则. 定位规则总体来说三种: 常规流,浮动,绝对定位(CSS3里面新加了一种flex) 其中常规流包括BFC,IFC等规则,块级元素一个一排地从上 ...

  9. 【CSS】多行溢出显示省略号

    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3;//超出三行隐藏 overflow: hidden; ...

  10. [Codeforces958A2]Death Stars (medium)(字符串+hash)

    Description 题目链接 Solution 这里用类似hash的方法将判断2个矩阵是否相同的时间降为O(m),总时间复杂度为O(m3) Code #include <cstdio> ...