2013-05-08 16 views
5

以下の画像を参照してください。あなたは箱コライダーがあることがわかります最初の画像でタッチポイントがユニティのボックスコライダーの内側にあるかどうかを確認する

enter image description here

enter image description here

。私はAndroidデバイスここ

上のコードを実行するとき 第二の画像は、私はタッチポイントが内側にあるかどうかを確認したいゲームをプレイするために添付されているコード(その3Dテキスト)

using UnityEngine; 
using System.Collections; 

public class PlayButton : MonoBehaviour { 

    public string levelToLoad; 
    public AudioClip soundhover ; 
    public AudioClip beep; 
    public bool QuitButton; 
    public Transform mButton; 
    BoxCollider boxCollider; 

    void Start() { 
     boxCollider = mButton.collider as BoxCollider; 
    } 

    void Update() { 

     foreach (Touch touch in Input.touches) { 

      if (touch.phase == TouchPhase.Began) { 

       if (boxCollider.bounds.Contains (touch.position)) { 
        Application.LoadLevel (levelToLoad); 
       } 
      }     
     } 
    } 
} 

されていますコライダーかどうか。私はこれをやりたいのですが、現場でどこをクリックすればいいのですか? Application.LoadLevel(levelToLoad);が呼び出されます。

PLAY GAMEテキストのみをクリックすると呼び出されます。誰でもこのコードを手助けすることができますか、私の問題に私に別の解決策を与えることができますか?タッチの位置は、システム(Vector2)を座標スクリーン空間で表現され

void Update() { 

foreach(Touch touch in Input.touches) { 

    if(touch.phase == TouchPhase.Began) { 

     Ray ray = camera.ScreenPointToRay(new Vector3(touch.position.x, touch.position.y, 0)); 
     RaycastHit hit; 

     if (Physics.Raycast(ray, out hit, Mathf.Infinity, 10)) { 
      Application.LoadLevel(levelToLoad);    
     }   
    } 
} 
} 

答えて

5

特異なバグのロジックに従って、


最近コード。シーン内のオブジェクトの他の3D位置と比較する前に、ワールド空間座標系でその位置を変換する必要があります。

Unity3Dは、そうするための機能を提供します。あなたがテキストを囲むBoundingBoxを使用しているので、次の操作を実行できます。

  • は、タッチポイントの位置にあり、原点Rayを作成し、どの方向はカメラ前方軸(Camera.ScreenPointToRay)に平行です。
  • その光線が(Physic.RayCast)のBoundingBoxと交差していないか確認してください。

コードは、そのようなものに見えることがあります。

Ray ray = camera.ScreenPointToRay(new Vector3(touch.position.x, touch.position.y, 0)); 
RaycastHit hit; 
if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerOfYourGameObject)) 
{ 
    //enter here if the object has been hit. The first hit object belongin to the layer "layerOfYourGameObject" is returned. 
} 

それはそれと衝突線を作るために、あなたの「プレイゲーム」GameObjectに特定の層を追加すると便利です。


EDIT

コードと上記の説明は結構です。適切な衝突がない場合は、適切なレイヤーを使用していない可能性があります。私は現時点ではタッチデバイスがありません。次のコードはマウスで動作します(レイヤーは使用しません)。

using UnityEngine; 
using System.Collections; 

public class TestRay : MonoBehaviour { 

    void Update() { 

     if (Input.GetMouseButton(0)) 
     { 
      Vector3 pos = Input.mousePosition; 
      Debug.Log("Mouse pressed " + pos); 

      Ray ray = Camera.mainCamera.ScreenPointToRay(pos); 
      if(Physics.Raycast(ray)) 
      { 
       Debug.Log("Something hit"); 
      } 

     } 
    } 

} 

これはあなたを正しい方向に向けるための単なる例です。あなたのケースで何がうまくいかないのかを把握したり、SSCCEを投稿してみてください。

+0

私がしたことは、選択された3dテキストであり、インスペクタでそれに割り当てられたレイヤーが選択されたことです。レイヤー番号は8でした。それから、パラメータlayerOfYourGameObjectを8として渡してコードを実行しましたが、まだ衝突は発生していません。上記の質問にコードを添付しました。 –

+0

3Dテキストにレイヤーを追加する方法が間違っている場合は、私に修正してください。 1)[3Dテキスト]を選択します。 2)InpectorでAddLayerに行き、Unity Layer 10をPlayGameLayerに指定しました。 3)インスペクタのTag = UntaggedとLayer = PlayGameLayer。 4)上記のコードのスクリプトは、PlayGame 3d Textに添付されています。 それは正しい方法ですか?もしそうなら、何が間違っているのでしょうか? –

+0

@Jawad Amjad:Textコンポーネントを添付した同じGameObjectにバウンディングボックスを添付しましたか? – Heisenbug