unity VR凝視gaze


VRヘッドをつけて、物体を見つめていると進捗バーがあり、完成を待つとクールなテクニックができます.
多くのVRのSDKにもこのスキルがあり、その原理は視線で探知し、下にコードを貼ることです
新しいスクリプトの名前はGazeControllerです.
//    
	public  Canvas rectileCanvas;
	//    
	public Text rectileText;
	//                 
	public  Image rectileImage;
	//       
	public GameObject Target;
	//    
	private Vector3 originPos;
	//      
	private Vector3 originScale;
	//   
	private float countDownTime=3;
	//    

	private float currentTime=0;

bool isdone=false;

void Start () {
		//    
		rectileImage.fillAmount = 0;
		//    
		originPos = rectileCanvas.transform.position;
		//    
		originScale=rectileCanvas.transform.localScale;
	}
	
	// Update is called once per frame
	void Update () {
		Ray ray = new Ray (transform.position, transform.forward);
		RaycastHit hit;
		//      
		//LineRenderer a;     
	//	a = GetComponent ();       
		//a.SetPosition (0, transform.position);
		if (Physics.Raycast (ray, out hit, 3)) 
		{	// Vector3 LonDis =	new Vector3 (0.3f,0.1f,0.3f);
			//a.SetPosition (1, hit.point);     
			//             
			//        


			//rectileCanvas.transform.position =hit.point + LonDis;
			//        ,  3d          
			// rectileCanvas.transform.localScale=originScale*hit.distance;
			//rectileText.transform.position = rectileImage.transform.position;
			//                          
			//rectileCanvas.transform.forward=Camera.main.transform.forward;
			//      ;


			if (hit.transform.tag == "GazeUI" || hit.transform.tag == "GazeObj") {
				
				rectileCanvas.gameObject.SetActive (true);
			} else 
			{
				//     ,      
				currentTime = 0;
				rectileCanvas.gameObject.SetActive (false);
			}
			if (hit.transform.gameObject != Target) 
			{	


				if (Target != null) 
				{
					VRGazeItem oldItem = Target.GetComponent ();
					if (oldItem) 
					{
						oldItem.GazeOut ();
					}
				}
				Target = hit.transform.gameObject;
				VRGazeItem newItem = Target.GetComponent ();
				if (newItem) 
				{
					//  
					newItem.GazeIn();
				}


			}
			else //      
			{
				currentTime += Time.deltaTime;
				//         
				if (countDownTime - currentTime > 0 ) 
				{
					rectileImage.fillAmount = currentTime / countDownTime;
					rectileText.text = Mathf.Ceil(rectileImage.fillAmount*100)+"%";
					rectileText.transform.forward = Camera.main.transform.forward;
					//rectileText.transform.localPosition = rectileCanvas.transform.position;
				}
				else//      (3  )
				{	 
					//VRGazeItem             ,
					VRGazeItem gazeFireItem = Target.GetComponent ();
				
					if (gazeFireItem) 
					{
						gazeFireItem.GazeFire (hit);
					}
					rectileCanvas.gameObject.SetActive (false);




				}


			}
		}
		else
			//      
		{
			rectileCanvas.gameObject.SetActive (false);
        
            
		//	rectileCanvas.transform.position = originPos; //    
			rectileCanvas.transform.localScale=originScale;	
		//	rectileCanvas.transform.forward = Camera.main.transform.forward;
			rectileImage.fillAmount = 0;
		}
		
	}
}

GazeItemスクリプトには3つのインタラクションがあり、GazeInメソッドとGazeOut、GazeFireがあります.具体的な実現は異なる需要を見る.
 
 
 
物体と対話する必要がある場合は、次のインタフェースを使用します.
interface IRayInteractor
{

    /// 
    ///         
    /// 
    GameObject TempObj
    {
        get;

    }
    /// 
    ///                  
    /// 
    float NeedStayTime
    {
        get
        ;
        set;
    }
    /// 
    ///      
    /// 
    float StayTime { get; }

    /// 
    ///     
    /// 
    ///        
    void OnRayEnter(GameObject temp);

    /// 
    ///     
    /// 
    void OnRayExit();
    /// 
    ///     
    /// 
    void OnRayStay();
}