射线投射与碰撞层

射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。
用途:在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));
            }
            
        }
        
    }
}

时间: 2024-09-29 08:15:21

射线投射与碰撞层的相关文章

Unity Physics.Raycast 射线投射

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

unity3d5.0 SurvivalShooter(四)碰撞层的创建

1,创建一个3dObject : GameObject ->3D Object ->Quad 2,更改name为:Floor,Layer为Floor,Rotation的y为90,将Scale扩大100倍,如下图: 3,移除组件Mesh Renderer,移除后如上图. 版权声明:本文为博主原创文章,未经博主允许不得转载.

Unity屏幕射线碰撞

Layers层: 从Layers设置看来,最多支持32层.  图层的值开始依次 0^2,1^2, 2^2, 3^3 依次增加. 当摄像机Culling Mask属性 Nothing= –1 Evening = 全部图层之和, 项目开始默认设置了7个图层. 值就是0^2,1^2, 2^2, 3^3 .. 6^2  = 279 如果我们选择Defulat图层,所在第0位置值 0^2 = 1 如果我们选择Defualt,Transparent,图层位置0,1 = 0^2+1^2 = 3 组合: 假设在

2d游戏中的射线与矩形检测碰撞

cc.exports.LineCollideRect(startLine,endLine,rect)--向量与矩形检测碰撞 --获取矩形的四个顶点位置 local p = {cc.p(rect.x,rect.y),cc.p(rect.x + rect.width,rect.y),cc.p(rect.x+rect.width,rect.y + rect.height),cc.p(rect.x,rect.y+rect.height)} local bRight = PointPosInVector(

unity 射线检测

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

Ray射线

射线的机制相当于碰撞; 创建射线: 1 Ray ray=new Ray(); origin : 射线发射的原点; direction: 射线发射的方向; distance: 射线的长度; hitInfo: 如果返回true,hitInfo将包含碰撞器碰撞的更多信息; Layer: gameObject的层; LayerMask: 只选定LayerMask层内的碰撞器,其他层内碰撞器忽略;返回bool类型,当射线与任何碰撞器碰撞时为真,反之为假; 射线碰撞的应用: 使用Physics类方法Rayc

射线,克隆,画线

1,射线 (1)Ray射线 A ray is an infinite line starting at origin and going in some direction. Ray是具有开始点和方向的无穷线. 构造: Ray ray = new Ray(transform.position, transform.forward); transform.position为起点, transform.forward为方向.(2)Raycast射线投射C# => public static bool

Unity物理投射(Physics.XXXCast...)相关小问题整理

1.投射目标是否需要附加刚体,是否可忽略触发器? 默认既支持触发器,也支持刚体.投射的最后一个参数queryTriggerInteraction可以设置,是否包含触发器事件. 2.非射线投射,是否有接触点信息? 投射物刚好相交则会返回接触点信息(hits.point)法线信息等,如果是包含则没有,返回(0,0,0). 即使设置了投射方向,投射距离也是如此.安全的做法还是用射线投射 3.NonAlloc系列方法注意事项 你建立的缓存数组可以重复用,但需要每次使用时手动清除之前的状态,这个方法并不会

Unity3D脚本学习——运行时类

AssetBundle 类,继承自Object.AssetBundles让你通过WWW类流式加载额外的资源并在运行时实例化它们.AssetBundles通过BuildPipeline.BuildAssetBundle创建. 参见:WWW.assetBundle ,Loading Resources at Runtime ,BuildPipeline.BuildPlayer function Start () { var www = new WWW ("http://myserver/myBund