2013-05-08 21 views
5

Proszę zobaczyć poniższe obrazy.Sprawdzanie, czy punkt dotykowy znajduje się w zderzaczu pudełkowym w Unity

enter image description here

enter image description here

W pierwszym obrazku widać, że istnieje pole zderzacz. Drugi obraz jest podczas uruchamiania kodu na urządzenia z systemem Android

Oto kod, który jest dołączony do gry gra (jej tekst 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); 
       } 
      }     
     } 
    } 
} 

Chcę zobaczyć, czy punkt dotykowy jest wewnątrz zderzacz lub nie. Chcę to zrobić, ponieważ teraz kliknę gdziekolwiek na scenie Application.LoadLevel (levelToLoad); jest nazywany.

Chcę, aby zadzwonił, gdy kliknę tylko tekst ZAGRAJ. Czy ktoś może mi pomóc z tym kodem lub może dać mi inne rozwiązanie mojego problemu?


Nowy kod postępując logicznego heisenbug w

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

Odpowiedz

5

pozycji dotykowego jest wyrażona w powierzchni ekranu systemu (A Vector2) współrzędnych. Konieczne jest przekonwertowanie tej pozycji w układzie współrzędnych przestrzeni światowej przed próbą porównania jej z innymi lokalizacjami 3D obiektów w scenie.

zapewnia to narzędzie. Ponieważ używasz BoundingBox otaczający tekst, można wykonać następujące czynności:

  • Tworzenie Ray których pochodzenie jest w położeniu punktu dotyku i który kierunek jest równoległy do ​​osi przedniej kamery (Camera.ScreenPointToRay).
  • Sprawdź, czy ten promień przecina się z BoundingBox Twojego(Physic.RayCast).

kod może wyglądać mniej więcej tak:

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

Jest to wygodne, aby dodać określoną warstwę do „Gra” GameObject, w celu uczynienia ray kolizji tylko z nim.


EDIT

oznaczeniu i wyjaśnienie powyżej jest w porządku. Jeśli nie uzyskasz prawidłowej kolizji, być może nie użyłeś właściwej warstwy. W tej chwili nie mam urządzenia dotykowego. Poniższy kod będzie działał z myszą (bez użycia warstw).

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

     } 
    } 

} 

To tylko przykład, aby skierować Cię w dobrym kierunku. Spróbuj dowiedzieć się, co dzieje się nie tak w twoim przypadku lub opublikuj SSCCE.

+0

To, co zrobiłem, to, że Wybrany tekst 3d i w inspektorze wybrano do niego przypisaną warstwę.Numer warstwy wynosił 8. Następnie przekazałem parametr layerOfYourGameObject jako 8 i uruchomiłem kod, ale nadal nie występuje kolizja. Dołączyłem kod w powyższym pytaniu. –

+0

Proszę mnie poprawić, jeśli nie mam racji, dodając warstwę do tekstu 3D. 1) Wybierz tekst 3d. 2) W Inpector poszedł do AddLayer i nazwał Unity Layer 10 do PlayGameLayer. 3) W inspektorze Tag = Untagged and Layer = PlayGameLayer. 4) Skrypt z powyższym kodem jest dołączony do PlayGame 3d Text. Czy to właściwa droga? Jeśli tak, to co może być nie tak? –

+0

@Jawad Amjad: czy podłączyłeś obwiednię do tego samego GameObject, który ma dołączony komponent Text? – Heisenbug