Unity 射线

射线:射线是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-11-09 00:32:58

Unity 射线的相关文章

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

Unity射线

//射线原点 [SerializField] Transform tr; //射线长度    [SerializField] float dis = 5; //射线停留时间 [SerializField] float t=0.1f    // Use this for initialization    void Start () {            }        // Update is called once per frame    void Update () {       

Unity常见面试题大全

1.       [C#语言基础]请简述拆箱和装箱. 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何接口类型的过程. 1.在堆中开辟内存空间. 2.将值类型的数据复制到堆中. 3.返回堆中新分配对象的地址. 拆箱操作: object类型显示转换为值类型或从接口类型到实现该接口值类型的过程. 1.判断给定类型是否是装箱时的类型. 2.返回已装箱实例中属于原值类型字段的地址. 2.        [.NET(C#)] attribute,property,markup,ta

unity中射线碰撞检测总结

这阵子通过看视频,看书对unity中射线碰撞检测,有了一些了解,这里我把它总结一下写下来,希望能帮助到你们,也希望通过各位大神来指正不足之处: 射线碰撞检测,就是由某一物体发射出一道射线,射线碰撞到物体之后,可以得到该物体的相关信息,然后就可以对该物体进行一些操作的过程了.PS:个人见解: 射线的发射分为可见和不可见,可见的情况就是在游戏当中你可以看到射线,而不可见就是游戏运行时,你只可以在Scene试图下观察到它,而这到射线又是存在的: 而其实两者区别不大,关键是看你怎么用它了: 下面先看看不

[Unity菜鸟] 射线

1. 射线用 Physics.Raycast 都可以判断,用 collider.Raycast 只在某些(不明)情况下可以 void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; // if (collider.Raycast(ray, out hit, 100f)) if (Physics.Raycast(ray,out hit ,100f)) { Debug.Dr

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

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 组合: 假设在

unity如何创建射线

void Update () { CheckBarrier(); } void CheckBarrier() { //创建一个射线 关键字Ray //第一个参数放的是发射射线的物体的位置,第二个参数放的是发射射线的方向 Ray ray1 = new Ray(transform.position,transform.forward); //发射射线 RaycastHit HitInfo; //射线默认长度为无穷大,想要设置射线长度加一个参数即可,例如设置射线长度为五(ray,out HitInfo

【Unity笔记】经典的鼠标点击射线检测碰撞

void Update (){ if(Input.GetMouseButton(0)){ //从摄像机发出到点击坐标的射线 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; if(Physics.Raycast(ray,out hitInfo)){ //划出射线,只有在scene视图中才能看到 Debug.DrawLine(ray.origin,hitInfo.point); Game