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坦克大战 ...
随机推荐
- 【洛谷P1314】[NOIP2011]聪明的质监员
聪明的质监员 题目链接:https://www.luogu.org/problemnew/show/P1314 Y(W)随W的值增大而减小 二分W的值,找到最小的W使得Y(W)>S: 比较Y(W ...
- 第42章 电源管理—实现低功耗—零死角玩转STM32-F429系列
第42章 电源管理—实现低功耗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- jeDate日期控件
http://www.jayui.com/jedate/ 这是日期控件官网,可以去里面下载使用 前台 <%@ Page Language="C#" AutoEvent ...
- 成员变量和成员函数前加static的作用?
成员变量和成员函数前加static的作用?答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数.分别用来反映类的状态.比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作 ...
- Data Warehouse 简介
数据仓库定义 数据仓库之父Bill Inmon在1991年出版的“Building the Data Warehouse”一书中所提出的定义被广泛接受:数据仓库(Data Warehouse)是一个面 ...
- cocos2dx 修改亮度、对比度、色调、饱和度
废话少说,直接修改CCSprite使用的片面着色器ccShader_PositionTextureColor_noMVP.frag: /* * cocos2d for iPhone: http://w ...
- harbor 配置 Keepalived 实现HA
环境说明: $ cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) vip : 192 168 93 142 MASTER-har ...
- JQuery实现层级菜单
效果图: HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- Linux 个人服务搭建脱坑实录
环境:VMware.Centos7 64位.jdk1.7.Tomcat 7 说明:本是个人的爬坑经历所总结出来的,记录一下心得.也给有需要的人提供一些帮助.引用了一些大神的笔记,非常感谢,希望大神们不 ...
- vue笔记v-bind
把message的信息绑定给title,运行出来的结果是<span title="you loaded this page on +Mon Nov 21 2016 18:28:38 G ...