2016-06-27 94 views
1

我正在Unity3D中爲VR項目實施注視算法。到目前爲止,我在這裏發現的是使用Physics.Raycast並將BoxCollider2D組件添加到每個按鈕對象以檢測用戶是否正在查看它。我想避免使用Raycast,因爲它非常昂貴,並且可能會產生性能問題,因爲我有非常複雜的UI結構來處理。Unity3D中用於UI項目的Raycast替代方案

我嘗試使用光標鎖定,但不幸的是它不適用於移動平臺。

我還用攝影機視口的中心,以檢查是否按鈕對象的rect包含

Camera.main.ViewportToWorldPoint(new Vector3(0.5f,0.5f,Camera.main.nearClipPlane));

當按鈕對象的矩形變換爲錨中等中心它正常工作,創造世界點嘗試。但是當它有一些其他設置或按鈕稍微傾斜時(在世界空間畫布中),它不起作用。我不太瞭解直接變換如何工作,以及如何找到它在世界空間中的確切位置。

有誰知道解決方案?或者有沒有其他方法可以做到這一點?

各種幫助是高度讚賞。

+1

我不知道你在做魔環或沒有,但不管怎樣這是念好https://developer.oculus.com/blog/unitys-ui-system -in-vr/ –

+0

我已經從Unity中檢查示例項目,並且它在事件系統的BaseRaycaster類上實現。 –

回答

0

我想出了問題,它是z軸上的不同值導致問題。下面的解決方案,而無需使用Physics.Raycast正常工作:

void Update() 
{ 
    pos = Camera.main.ViewportToWorldPoint(new Vector3(0.5f,0.5f,Vector3.Distance(transform.position,Camera.main.transform.position))); 
    _rect = new Rect(pos.x-size,pos.y-size,size,size); 

    _rect2 = new Rect(transform.position.x-rt.rect.width/2,transform.position.y-rt.rect.height/2,rt.rect.width,rt.rect.height); 

    Hit = _rect2.Overlaps(_rect); 

    if(Hit) 
    { 
     if (!isEntered) 
     { 
      _button.OnPointerEnter(new PointerEventData(EventSystem.current)); 
     } 
     isEntered = true; 

     timeElapsed += Time.deltaTime; 
     if(timeElapsed >= 3) // autoclick after 3 sec. 
     { 
      timeElapsed = 0; 
      _button.onClick.Invoke(); 
      isEntered = false; 
     } 
    } 
    else 
    { 
     timeElapsed = 0; 
     if (isEntered) 
     { 
      _button.OnPointerExit(new PointerEventData(EventSystem.current)); 
     } 
     isEntered = false; 

    } 
}