2016-06-27 10 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));

ボタンオブジェクトの矩形変換は、中間の中心として固定されているとき、それは正常に動作によって作成された世界のポイントが含まれているかどうかを確認するためにカメラビューポートの中心を使用してみました。しかし、それはいくつかの他の設定をしている場合、またはボタンが(世界のスペースキャンバスで)少し傾いている場合は動作しません。そして私はrect変換の仕組みと世界空間での正確な位置を見つける方法にあまり慣れていません。

誰もが解決策を知っていますか?あるいはこれを行うための他の方法がありますか?

すべての種類のヘルプは高く評価されています。

+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; 

    } 
} 
関連する問題