2013-05-08 7 views
5

Vedere le immagini di seguito.Verifica se un punto di tocco si trova all'interno del collisore in Unity

enter image description here

enter image description here

Nella prima immagine si può vedere che c'è scatola collider. La seconda immagine è quando si esegue il codice sul dispositivo Android

Qui è il codice che è attaccato a giocare il gioco (il suo un testo 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); 
       } 
      }     
     } 
    } 
} 

voglio vedere se punto di contatto è all'interno del collisore o no. Voglio farlo perché adesso se clicco qualsiasi punto della scena Application.LoadLevel (levelToLoad); è chiamato.

Voglio essere chiamato se clicco solo sul testo PLAY GAME. Qualcuno mi può aiutare con questo pezzo di codice o può darmi un'altra soluzione al mio problema ??


Codice recente dal seguente logica di heisenbug

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);    
     }   
    } 
} 
} 

risposta

5

la posizione del tocco è espressa in spazio dello schermo del sistema (un Vector2) coordinate. È necessario convertire tale posizione nel sistema di coordinate spaziali prima di provare a confrontarlo con altre posizioni 3D degli oggetti nella scena.

Unity3D fornisce la possibilità di farlo. Dal momento che si sta utilizzando un BoundingBox che circonda il testo, è possibile effettuare le seguenti operazioni:

  • Creare una Ray cui origine è nella posizione di punto di contatto e in quale direzione è parallela all'asse in avanti fotocamera (Camera.ScreenPointToRay).
  • Verificare se il raggio interseca il numero BoundingBox del numero GameObject (Physic.RayCast).

il codice può sembrare qualcosa di simile:

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. 
} 

E 'conveniente per aggiungere un livello specifico per il "Play Game" GameObject, al fine di rendere il raggio collisione solo con esso.


EDIT

Codice e spiegazione di cui sopra va bene. Se non si ottiene una collisione corretta forse non hai usato il livello giusto. Al momento non ho un dispositivo touch. Il seguente codice funzionerà con il mouse (senza utilizzare i livelli).

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"); 
      } 

     } 
    } 

} 

È solo un esempio per metterti nella giusta direzione. Cerca di capire cosa non funziona nel tuo caso o pubblica uno SSCCE.

+0

Quello che ho fatto è che, Selezionato Testo 3d e nell'ispettore selezionato livello assegnato ad esso.Il numero del layer era 8. Successivamente ho passato il parametro layerOfYourGameObject come 8 e ho eseguito il codice, ma la collisione non si verificava ancora. Ho allegato il codice nella domanda sopra. –

+0

Per favore correggimi se ho torto su come aggiungere un layer al testo 3D. 1) Seleziona testo 3D. 2) In Inpector è passato a AddLayer e denominato Unity Layer 10 a PlayGameLayer. 3) In ispettore Tag = Senza tag e Layer = PlayGameLayer. 4) Lo script con il codice sopra è allegato a PlayGame 3d Text. È la strada giusta? Se è così allora cosa potrebbe esserci di sbagliato? –

+0

@Jawad Amjad: hai attaccato il riquadro di selezione allo stesso GameObject che ha allegato il componente Testo? – Heisenbug