unity射线

接上一博文:射线 ray linerender spotlight


1,小球表示碰撞交点

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

public class RayCast : MonoBehaviour {  
	
	[HideInInspector]  
	private List<GameObject> hitGObs;   
	private GameObject headPointer;  
	private GameObject findColor;  


	//save the old color and objects
	private Dictionary<string, Color> ObjectsColor;
	//获取场景中的物体
	private GameObject GOB;

	void Start () {    


		headPointer = new GameObject(); 
		headPointer = GameObject.Find ("HeadPointer");
		if (headPointer) {
			headPointer.GetComponent<MeshRenderer> ().enabled = false;
		} else {
			Debug.LogError ("cannot find object of HeadPointer");
		}
			

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


		//保存场景中物体的颜色和名称
		ObjectsColor = new Dictionary<string, Color> ();
		SaveObjectColor ();

		GOB = new GameObject ();
	
	}    

	// 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变量用来保存被撞物体的信息;    

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

			GameObject hitme = hitInfo.collider.gameObject;  
			//hitInfo.point:碰撞点的位置; 
			//hitInfo.normal:与碰撞点所在平面垂直的向量;    
			//hitInfo.collider.gameobject:可以得到该物体上的所有信息了;  
			if (hitme.name != "VideoStream" && hitme.name != "Table" && hitme.name != "HeadPointer") 
			{
				hitme.GetComponent<MeshRenderer> ().material.color = Color.green;    
				//put the hitting objects into the array:hitGObs,以便使其颜色能回到以前的状态    
				hitGObs.Add (hitme); 
			} else {
					ResetOldColor (hitme);
				   }
		} 
		else 
		{   
		  ResetOldColor ();
		}    

	}    

	void DrawLineInGame (Vector3 point)  
	{  

		//render the position of sphere
		headPointer.GetComponent<MeshRenderer> ().enabled = true;
		headPointer.transform.position = point;



	}  


	//save the whole objects and color
	void SaveObjectColor()
	{
		findColor = GameObject.Find ("01_JiZuo");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("02_FangKuaiLuoMu");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("03_HuoDongQianShen");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("04_LuoGan");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("05_LuoDing");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("06_HuKouBan");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("07_LuoDing_1");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("07_LuoDing_2");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("07_LuoDing_3");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("07_LuoDing_4");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("08_LuoMu");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

		findColor = GameObject.Find ("09_HuKouBan");
		ObjectsColor.Add (findColor.name,findColor.GetComponent<MeshRenderer>().material.color);

	}


	//有碰撞时物体颜色的还原
	void ResetOldColor(GameObject hitme)
	{
		foreach (var item in hitGObs) {  
			foreach (var item_color in ObjectsColor) {

				if (item_color.Key == item.name) {
					item.GetComponent<MeshRenderer> ().material.color = ObjectsColor[item_color.Key];
				}
			}
		}
		hitGObs.Clear ();
	}

	void ResetOldColor()
	{
		//这一句将决定小球从物体边界到无穷远处时小球是否会停留在物体边缘感觉不自然
		headPointer.GetComponent<MeshRenderer> ().enabled = false;

		foreach (var item in ObjectsColor) {
			GOB = GameObject.Find (item.Key);
			GOB.GetComponent<MeshRenderer>().material.color = ObjectsColor[item.Key];
		}
	
	}

	void OnDisable()
	{
		Destroy (GOB);

	}
} 

2,linerender表示碰撞交点

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

public class LineRender : MonoBehaviour {  
	

	[Header("LineRendererShow")]
	[Tooltip("渲染戴头盔者的注视区域DEBUG0--2")]
	public LineRenderer linerenderer;  
	private GameObject line;  

	private List<GameObject> hitGObs;   


	void Start () {    

		#if DEBUG //LoadLineRender
		line = new GameObject();  
		line = GameObject.Find ("Line");  
		line.GetComponent<LineRenderer> ().enabled = false;
		#endif //DEBUG0 


		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变量用来保存被撞物体的信息;    

		//show the headpointer via spotlight




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

			DrawLineInGame (hitInfo.point);  

			GameObject hitme = hitInfo.collider.gameObject;  
			//hitInfo.point:碰撞点的位置; 
			//hitInfo.normal:与碰撞点所在平面垂直的向量;    
			//hitInfo.collider.gameobject:可以得到该物体上的所有信息了;  
			if (hitme.name != "VideoStream" && hitme.name != "Table" && hitme.name != "HeadPointer") 
			{
				hitme.GetComponent<MeshRenderer> ().material.color = Color.green;    
				//put the hitting objects into the array:hitGObs,以便使其颜色能回到以前的状态  
				hitGObs.Add (hitme); 
				foreach (var item in hitGObs) {    
					item.GetComponent<MeshRenderer> ().material.color = Color.white; 
					//item.GetComponent<MeshRenderer> ().material.color = formerObjectsColor;  
				}
				hitGObs.Clear ();

			} else {
				foreach (var item in hitGObs) {    
					item.GetComponent<MeshRenderer> ().material.color = Color.white; 
					//item.GetComponent<MeshRenderer> ().material.color = formerObjectsColor;  
				}
				hitGObs.Clear ();
			}
				
		} 
		else 
		{   
			#if DEBUG //LoadLineRender
			line.GetComponent<LineRenderer> ().enabled = false;
			#endif


			ResetOldColor ();
		}    

	}    

	void DrawLineInGame (Vector3 point)  
	{  

		#if DEBUG // LoadLineRender
		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 ("LineRenderColor"); 
		#endif


	}  
	void ResetOldColor()
	{
		//这一句将决定小球从物体边界到无穷远处时小球是否会停留在物体边缘感觉不自然
		//headPointer.GetComponent<MeshRenderer> ().enabled = false;

		foreach (var item in hitGObs) {    
			item.GetComponent<MeshRenderer> ().material.color = Color.white; 
			//item.GetComponent<MeshRenderer> ().material.color = formerObjectsColor;  
		}
		hitGObs.Clear ();
	}

} 


3,Spotlight表示交点

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

public class SpotLightGaze : MonoBehaviour {  

	[HideInInspector]  
	private List<GameObject> hitGObs;   
	private GameObject headPointer;  


	[Header("SpotLightShow")]
	public GameObject cam;
	private GameObject lightSpot;


	void Start () {    

		headPointer = new GameObject(); 
		headPointer = GameObject.Find ("HeadPointer");
		if (headPointer) {
			headPointer.GetComponent<MeshRenderer> ().enabled = false;
		} else {
			Debug.LogError ("cannot find object of HeadPointer");
		}

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

		#if DEBUG   //spot light show head pointer
		lightSpot = new GameObject();
		lightSpot = GameObject.Find("Spotlight");

		if (!lightSpot) {
		Debug.LogError("There is no object of Spotlight");

		}else{
		lightSpot.GetComponent<Light>().enabled = false;
		}
		#endif	//DEBUG_spotlight

	}    

	// 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变量用来保存被撞物体的信息;    

		//show the headpointer via spotlight

		lightSpot.transform.position = cam.transform.position;
		lightSpot.transform.rotation = cam.transform.rotation;
		lightSpot.GetComponent<Light>().enabled = true;


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

			//DrawLineInGame (hitInfo.point);  

			GameObject hitme = hitInfo.collider.gameObject;   
			//hitInfo.point:碰撞点的位置; 
			//hitInfo.normal:与碰撞点所在平面垂直的向量;    
			//hitInfo.collider.gameobject:可以得到该物体上的所有信息了;  
			if (hitme.name != "VideoStream" && hitme.name != "Table" && hitme.name != "HeadPointer") {
				//print (hitme.gameObject);    
				hitme.GetComponent<MeshRenderer> ().material.color = Color.green;    
				//put the hitting objects into the array:hitGObs,以便使其颜色能回到以前的状态    
				hitGObs.Add(hitme); 

			}




		} else {   
			#if DEBUG1 //LoadLineRender
			line.GetComponent<LineRenderer> ().enabled = false;
			#endif

			headPointer.GetComponent<MeshRenderer> ().enabled = false;
			foreach (var item in hitGObs) {    
				item.GetComponent<MeshRenderer> ().material.color = Color.white;    

			}   

		}    

	}    

	void DrawLineInGame (Vector3 point)  
	{  

		//render the position of sphere
		headPointer.GetComponent<MeshRenderer> ().enabled = true;
		headPointer.transform.position = point;


	}  

}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值