Unity3D之物理射线,物理射线检测
分类:美高梅游戏官网网站

Unity3D之物理射线,unity3d射线

射线:从一个点往一个方向,发射一根无限长的射线,这根射线会与场景中带有 Collider 组件的物体发生碰撞。

射线的使用:

 1 public class Test
 2 {
 3     private void Start()
 4     {
 5         if (Input.GetMouseButtonDown(0))
 6         {
 7             //从主摄像机发射一条射线至鼠标点击的位置。
 8             Ray ray1 = Camera.main.ScreenPointToRay(Input.mousePosition);
 9             //从自己的位置,向世界坐标轴的 forward 方向发射一条射线。
10             Ray ray2 = new Ray(this.transform.position, Vector3.forward);
11             //声明一个 RaycastHit 类型的变量,存储射线的碰撞信息。
12             RaycastHit hitInfo;
13             //检查射线是否碰撞到物体
14             if (Physics.Raycast(ray1,out hitInfo))
15             {
16                 //执行代码
17             }
18         }
19     }
20 }

根据上面的代码:

hitInfo.point:表示碰撞点的坐标。

Physics.Raycast():使用这个方法检测射线时,因为该方法重载很多,一定要弄清楚自己使用的是哪个重载方法,填对参数,不然很容易出错。

 

因为射线是看不见的,我们可以通过画线的方式来模拟射线,方便我们调试,方法如下:

Debug.DrawRay(Vector3 pos,Vector3 dir,Color c):画线。

pos:起点坐标。

dir:方向。

c:颜色。

射线: 从一个点往一个方向,发射一根无限长的射线,这根射线会与场景中带有 Collider 组件的物体发生碰撞...

何为物理射线?

从一个点往一个方向,发射一根无限长的射线,这根射线与场景中的其余的游戏物体的碰撞体组件相碰撞,射线即结束。由于射线可以与物理组件 Collider 相交互,所以“射线”也称之为“物理射线”。

射线的创建和显示

Ray射线类和RaycastHit射线投射碰撞信息类是两个最常用的射线工具类。

创建一条射线Ray需要指明射线的起点(origin)和射线的方向(direction)。这两个参数也是Ray的成员变量。注意,射线的方向在设置时如果未单位化,Unity 3D会自动进行单位归一化处理。
射线Ray的构造函数为 :
public Ray(Vector3 origin, Vector3 direction);

RaycastHit类用于存储发射射线后产生的碰撞信息。常用的成员变量如下:
collider与射线发生碰撞的碰撞器
**distance **从射线起点到射线与碰撞器的交点的距离
normal 射线射入平面的法向量
point 射线与碰撞器交点的坐标(Vector3对象)

Ray中的参数:
origin : 在世界坐标中射线的起始点
direction: 射线的方向
distance: 射线的长度
hit: 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。
layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞

Ray Camera.main.ScreenPointToRay(Vector3 pos) 返回一条射线Ray从摄像机到屏幕指定一个点

Ray Camera.main.ViewportPointToRay(Vector3 pos) 返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点

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)
当光线投射与任何碰撞器交叉时为真,否则为假。(注意:如果从一个球型体的内部到外部用光线投射,返回为假。)

RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)

   投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。
void Update () 
    {
        if(Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出到点击坐标的射线
            RaycastHit hitInfo;
            if(Physics.Raycast(ray,out hitInfo))
            {
                Debug.DrawLine(ray.origin,hitInfo.point);
//划出射线,只有在scene视图中才能看到
                GameObject gameObj = hitInfo.collider.gameObject;
                Debug.Log("click object name is " + gameObj.name);
                if(gameObj.tag == "boot")
//当射线碰撞目标为boot类型的物品 ,执行拾取操作
                {
                    Debug.Log("pick up!");
                }
            }

通过摄像机创建射线

Camera.main代表 tag 设为“MainCamera”的摄像机的 Camera 组件的引用。
m_Camera.ScreenPointToRay(Vector3)
摄像机组件(对象)下的一个方法。屏幕点转化为射线,这个方法会返回一个 Ray 类型的射线。这个屏幕点通常写鼠标的点击位置,这样的话,就代表从摄像机的位置开始,往鼠标点击点这个方向,发射一根射线。

本文由美高梅网址发布于美高梅游戏官网网站,转载请注明出处:Unity3D之物理射线,物理射线检测

上一篇:异常的库模式实现美高梅游戏官网网站 下一篇:重构手法之简化函数调用,重构手法之处理概括
猜你喜欢
热门排行
精彩图文