纳金网

标题: unity3d基础教程之组件介绍—物理引擎3-射线 [打印本页]

作者: paopao    时间: 2013-3-20 19:37
标题: unity3d基础教程之组件介绍—物理引擎3-射线
射线是3D世界中一个点向一个方向发射无终点的线。在unity3D中我们发射的射线一旦与其他的碰撞器发生碰撞,射线将停止发射。在游戏制作过程中我们可以通过判断射线是否发生了碰撞,并且可以判断射线和谁发生了碰撞。应用范围非常广泛,如射击类游戏中用它来判断是否射中目标。
我们要想在游戏中发射一条射线,必须要有两个元素,一个起始点,一个方向。
Ray.origin:射线起点
Ray.direction:射线的方向
   创建一条射线的方法Ray (origin : Vector3, direction : Vector3)
Origin是射线的起点,direction是射线的方向。
下面通过一个例子看下怎么创建一条射线
首先在场景中创建一个CUBE,创建一个c#文件,并输入如下代码:
using UnityEngine;
using System.Collections;

public class newLine : MonoBehaviour {

       // Use this for initialization
       void Start () {
      
       }
      
       // Update is called once per frame
       void Update ()
       {
//定义一条射线,起点为Vector3.zero终点为物体坐标
              Ray ray=new Ray(Vector3.zero,transform.position);
       //定义一个光线投射碰撞
              RaycastHit hit;
       //发射射线长度为100
              Physics.Raycast(ray,out hit,100);
       //在Scene中生成这条射线,起点为射线的起点,终点为射线与物体的碰撞点
              Debug.DrawLine(ray.origin,hit.point);   
       }
}
将脚本添加到物体上,运行游戏,在Scene视图中显示出这条射线。
如图:

(注:Debug.DrawLine()方法只在Scene视图中才可以看到,如果想在Game视图看待射线可以用LineRenderer())
  下面我们通过一个实例来看一下怎么判断射线与游戏物体之间的碰撞,并如何获得碰撞后的信息。
   首先在场景中创建一个地面,然后制作一个Prefab里面包含一个Cube。然后在场景中添加一盏灯光。
   场景制作完成,我们想完成的功能是当我们用鼠标点击地面是,在我们点击地面的位置生成Prefab的实例,就想种豆子一样。创建一个新的c#脚本。命名为Cline,
并编写代码如下:
using UnityEngine;
using System.Collections;

public class Cline : MonoBehaviour {
       public Transform explosion;

       // Use this for initialization
       void Start () {
      
       }
      
       // Update is called once per frame
       void Update ()
       {
       //获取鼠标点击事件
              if(Input.GetMouseButtonDown(0))
        {
           //定义一条射线
                     Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
                     RaycastHit hit;
           //如果射线发生碰撞
                     if(Physics.Raycast (ray, out hit, 100))
                     {
               //实例化物体
                             Transform theClonedExplosion;
                //hit.point为碰撞点的坐标
                             theClonedExplosion =Instantiate(explosion, hit.point, transform.rotation)as Transform;
                     }
      
        }
       }
}
运行游戏得到如下结果:
如图:

   
   在上面的代码中我们使用
Camera.main.ScreenPointToRay(Input.mousePosition);方法创建了一条由摄像机向鼠标当前位置发射的射线,然后使用Physics.Raycast ()判断这条射线是否与碰撞体发生了碰撞,如果碰撞就返回***e否则返回false。





作者: 王者再临    时间: 2013-3-20 22:36
顶一个,很好的教程,马上就可以理解ray的用法!

作者: 艾西格亚    时间: 2013-3-21 01:12
简单而易于理解,谢谢楼主的分享!

作者: Xn10710203    时间: 2013-7-5 18:10
继续收藏。。。
作者: nanwumi    时间: 2013-7-7 17:07
好好学习天天向上
作者: unity大白菜    时间: 2014-7-25 15:20
我的不能实现呢为什么。。。




欢迎光临 纳金网 (http://wwww.narkii.com/club/) Powered by Discuz! X2.5