查看: 11247|回复: 5
打印 上一主题 下一主题

[教程] unity3d基础教程之组件介绍—物理引擎3-射线

[复制链接]

25

主题

5

听众

358

积分

设计实习生

Rank: 2

纳金币
300
精华
0

最佳新人

跳转到指定楼层
楼主
发表于 2013-3-20 19:37:54 |只看该作者 |倒序浏览
射线是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。




分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏1 支持支持0 反对反对0
回复

使用道具 举报

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2013-3-20 22:36:57 |只看该作者
顶一个,很好的教程,马上就可以理解ray的用法!
回复

使用道具 举报

955

主题

164

听众

7万

积分

版主

Rank: 7Rank: 7Rank: 7

纳金币
59338
精华
28

活跃会员 荣誉管理 突出贡献 优秀版主 论坛元老

板凳
发表于 2013-3-21 01:12:35 |只看该作者
简单而易于理解,谢谢楼主的分享!
回复

使用道具 举报

0

主题

1

听众

25

积分

设计初学者

Rank: 1

纳金币
5
精华
0

活跃会员 灌水之王

地板
发表于 2013-7-5 18:10:29 |只看该作者
继续收藏。。。
回复

使用道具 举报

0

主题

1

听众

89

积分

设计初学者

Rank: 1

纳金币
-11
精华
0

活跃会员 灌水之王

5#
发表于 2013-7-7 17:07:07 |只看该作者
好好学习天天向上
回复

使用道具 举报

0

主题

1

听众

64

积分

设计初学者

Rank: 1

纳金币
7
精华
0

活跃会员 灌水之王

6#
发表于 2014-7-25 15:20:08 |只看该作者
我的不能实现呢为什么。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-11 13:54 , Processed in 0.168714 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部