1 脚本  scene场景中显示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RayCast : MonoBehaviour {

	private List<GameObject> hitGObs;

	// Use this for initialization
	void Start () {
		hitGObs = new List<GameObject>();
		hitGObs.Clear ();	
	}
	
	// Update is called once per frame
	void Update () {

		//如果写为transform.forward则表示线是无限长

		Ray ray=new Ray(transform.position,transform.forward*100);  //定义一个射线对象,包含射线发射的位置transform.position,发射距离transform.forward*100;
		Debug.DrawLine(transform.position,transform.position+transform.forward*100,Color.red);  //这个就是绘制出的射线了,包含发射位置,发射距离和射线的颜色;
		RaycastHit hitInfo;                                 //定义一个RaycastHit变量用来保存被撞物体的信息;

		if (Physics.Raycast (ray, out hitInfo, 100)) {         //如果碰撞到了物体,hitInfo里面就包含该物体的相关信息;
			//hitInfo.point:碰撞点的位置;

			//hitInfo.normal:与碰撞点所在平面垂直的向量;
			//hitInfo.collider.gameobject:可以得到该物体上的所有信息了;
			GameObject hitme = hitInfo.collider.gameObject;

			//print (hitme.gameObject);
			hitme.GetComponent<MeshRenderer> ().material.color = Color.red;
			//put the hitting objects into the array:hitGObs,以便使其颜色能回到以前的状态
			hitGObs.Add(hitme);
		} else {
			foreach (var item in hitGObs) {
				item.GetComponent<MeshRenderer> ().material.color = Color.white;
				//hitGObs.Clear ();
			}  			
		}

	}
}

2,unity其他设置

射线 ray linerender spotlight_Scene  Ray 

3,运行后在Scene中拖动物体可以看到当射线碰到物体时会变成红色。

射线 ray linerender spotlight_ide_02

 

射线 ray linerender spotlight_Game _03

 

射线 ray linerender spotlight_ide_04

 

4,scene 和game场景中都有射线,scene中只看到射线与物体碰到时的圆点。

 

Ray Constructor

 

  // Create a ray from the transform position along the transform's z-axis
        Ray ray = new Ray(transform.position, transform.forward);

 

or  Debug.DrawLine

 Debug.DrawLine(Vector3.zero, new Vector3(1, 0, 0), Color.red);

RayScene.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RayScene : MonoBehaviour {

	public LineRenderer linerenderer;
	private List<GameObject> hitGObs; 
	private GameObject line;

	// Use this for initialization  
	void Start () {  
		
		//linerenderer = GetComponent<LineRenderer>();
		//linerenderer.SetVertexCount(2);
		line = new GameObject();
		line = GameObject.Find ("Line");
		line.GetComponent<LineRenderer> ().enabled = false;

		hitGObs = new List<GameObject>();  
		hitGObs.Clear ();     
	}  

	// Update is called once per frame  
	void Update () {  

		//如果写为transform.forward则表示线是无限长  

		Ray ray=new Ray(transform.position,transform.forward*100);  //定义一个射线对象,包含射线发射的位置transform.position,发射距离transform.forward*100;  
		//drawline in the scene
		Debug.DrawLine(transform.position,transform.position+transform.forward*100,Color.red);  //这个就是绘制出的射线了,包含发射位置,发射距离和射线的颜色;  

		RaycastHit hitInfo;                                 //定义一个RaycastHit变量用来保存被撞物体的信息;  

		if (Physics.Raycast (ray, out hitInfo, 100)) {         //如果碰撞到了物体,hitInfo里面就包含该物体的相关信息;  
			//hitInfo.point:碰撞点的位置;  


			//hitInfo.normal:与碰撞点所在平面垂直的向量;  
			//hitInfo.collider.gameobject:可以得到该物体上的所有信息了; 

			DrawLineInGame (hitInfo.point);

			GameObject hitme = hitInfo.collider.gameObject;  
			//print (hitme.gameObject);  
			hitme.GetComponent<MeshRenderer> ().material.color = Color.green;  
			//put the hitting objects into the array:hitGObs,以便使其颜色能回到以前的状态  
			hitGObs.Add(hitme);  
		} else { 
			line.GetComponent<LineRenderer> ().enabled = false;
			foreach (var item in hitGObs) {  
				item.GetComponent<MeshRenderer> ().material.color = Color.white;  
				//hitGObs.Clear ();  
			}             
		}  

	}  

	void DrawLineInGame (Vector3 point)
	{
		
		line.GetComponent<LineRenderer> ().enabled = true;
		linerenderer.SetPosition(0, point);
		linerenderer.SetPosition(1, point);
		linerenderer.startColor = Color.red;
		linerenderer.endColor = Color.red;

		linerenderer.material = (Material)Resources.Load ("LineColor");
	}

}

note:关于linerender的颜色和形状的设置

颜色需要新建材质动态加载不然一直会是粉色的。

射线 ray linerender spotlight_碰撞检测_05

或者直接修改其材质组件,新建赋上去就好。

射线 ray linerender spotlight_Scene  Ray _06

形状修改参数

射线 ray linerender spotlight_碰撞检测_07

射线 ray linerender spotlight_Game _08

Scene中拖动物体可以看到当射线碰到物体时会变成绿色

射线 ray linerender spotlight_Game _09

可以设置多个camera在game中不同的视觉看不同风景

射线 ray linerender spotlight_ide_10

射线 ray linerender spotlight_Game _11

运行后效果

射线 ray linerender spotlight_Scene  Ray _12

射线 ray linerender spotlight_Unity _13

5, unity中射线碰撞检测总结

Unity中scene场景以及game场景下发出射线

7,用spotlight实现,超级简单。

为了实现的效果好一些,物体的颜色最好不要时白色。然后可以通过调节光的强度.....达到预期的效果。

详细的东西可以参考unity自带的文档。

射线 ray linerender spotlight_碰撞检测_14

实施获取要到的物体的position and rotation 分别给spotlight的position and rotation.

获取物体的transform, 

public GameObject moveObject;

射线 ray linerender spotlight_Game _15

public class gaze : MonoBehaviour {

	public GameObject moveObject;

	// Use this for initialization
	void Start () {
		
			}
	
	// Update is called once per frame
	void Update () {

		this.transform.position = moveObject.transform.position;
		this.transform.rotation = moveObject.transform.rotation;
		
	}
				
}

8,把射线交点用红色小球显示出来。

a)添加一个sphere,材质渲染为红色。

b) 在程序中把射线交点的给小球的position.

headPointer.GetComponent<MeshRenderer> ().enabled = true;

这一行控制实现小球是否显示出来。

c)小球的boxcollider和体积不能太大,否正当凝视时,小球回往眼睛的方向跑,应该是对物体添加了碰撞检测后,相当与物体有初速度,如果频繁移动在这个效应可以忽略,但当球的体积比较大(场景的整个比例都很大,则以m为单位,相当于放大了很多倍,只要稍微一碰则初速度会比较大,则小球不会按我们预期的,会在碰撞的地方以一定的初速度做匀速运动。尽量时瞬间碰撞的初速度小,不然没法实现表示注视点的效果。)

d) 更好的解决这个注视点碰撞后匀速运动的方法是把小球的collider去掉。

射线 ray linerender spotlight_Unity _16