射线Ray

射线是一个点向另外一个点发生的一条线,一旦与其他模型发生碰撞,他将停止发射。注意这条件是逻辑上的,界面上看不到。

一般使用射线判断是否发射至某个游戏对象上或者获得鼠标点击的游戏对象等。

用Camera.main.ScreenPointToRay向屏幕发射一条射线。

1     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
2     RaycastHit hit;
3    if(Physics.Raycast(ray,out hit)//如果命中
4     {
5      //hit.collider.gameObject可以获得命中的游戏对象
6     }

Raycast和RaycastAll的区别

Raycast:一旦与其他模型发生碰撞,他将停止发射。

RaycastAll:投射一条光线并返回所有碰撞

我们来做个小案例演示下。这个两个的区别。我分别模拟鼠标左键和右键单击并发射射线,

1:Raycast碰撞的物体。设置为蓝色

1:RaycastAll碰撞的所有物体。设置为红色

unity3d-射线(Ray)-冯金伟博客园

从上图可以看出来。当右键单击。射线穿过了两个cube,都变成了红色。 可以在scene中可以看到效果,而左键单击变成了蓝色。

 1 void Update()
 2     {
 3 
 4         if (Input.GetMouseButtonDown(0)) //单击鼠标左键
 5         {
 6             //案例一:演示Raycast,
 7             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
 8             RaycastHit hit;
 9             if (Physics.Raycast(ray, out hit)) //如果命中,则改变为蓝颜色
10             {
11                 hit.transform.renderer.material.color = Color.blue;
12                 //hit.collider.gameObject.transform.renderer.material.color = Color.red;
13             }
14 
15 
16         }
17 
18         if (Input.GetMouseButtonDown(1))//单击鼠标右键
19         {
20             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
21             //案例二:演示RaycastAll
22             RaycastHit[] hi = Physics.RaycastAll(ray);
23             if (hi.Length > 0)
24             {
25                 for (int i = 0; i < hi.Length; i++) //改变所有命中对象的为红颜色
26                 {
27                     hi[i].collider.transform.renderer.material.color = Color.red;
28                 }
29             }
30         }
31     }

此时你是不是想看到那个射线的轨迹?我们可以通过GL画出来,但这里可以通过Debug.DrawLine()方法调试出来

注:这个轨迹只能在Scene视图中看到,

 我们改动下上面的代码。在://案例一:演示Raycast,中改动如下:

if (Physics.Raycast(ray, out hit)) //如果命中,则改变为蓝颜色
             {
                 hit.transform.renderer.material.color = Color.blue;
                 
Debug.DrawLine(ray.origin, hit.point); //画轨迹
             }

unity3d-射线(Ray)-冯金伟博客园

在Scene视图中可以看出,当命中游戏对象后。看到了轨迹。

天空盒子(Skyboxes)

游戏场景中有没有发现天空是晴朗的艳阳天,看着心情都舒服很多。这是unity自带的包,操作如下:

1:导包

unity3d-射线(Ray)-冯金伟博客园

2:导入完成后可以在资源文件夹中看到

unity3d-射线(Ray)-冯金伟博客园

3:设置场景中的天空的渲染方式

unity3d-射线(Ray)-冯金伟博客园

两种方式都可以设置:直接拖拽或者打开窗口选择。

unity3d-射线(Ray)-冯金伟博客园