2013-12-14 9 views
10

Sto tentando di eliminare l'oggetto su cui è stato fatto clic. Sto facendo un gioco 2D usando il nuovo Unity3D 4.3. Ecco il codice che sto utilizzandoRaycasting per trovare il mouseclick su Oggetto in unità 2d giochi

void Update() { 

    if (Input.GetMouseButtonDown(0)) 
    { 
     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
     RaycastHit hit; 
     if(Physics.Raycast(ray,out hit)) 
     { 
      isHit = false; 
      Destroy(GameObject.Find(hit.collider.gameObject.name)); 

     } 
    } 

} 

Il controllo non sta entrando nel ciclo interno se. (isHit non viene impostato come falso).

+1

L'oggetto ha un collisore? Ha un collisore e un corpo rigido? –

+0

Sì, contiene un collisore e un corpo rigido –

+3

Ho usato Physics2D e funziona !! Questo è il codice modificato Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); Vector2 orgin = new Vector2 (ray.origin.x, ray.origin.y); RaycastHit2D hit = Physics2D.Linecast (orgin, -Vector2.up, 1 << LayerMask.NameToLayer ("Supports")); Destroy (hit.collider.gameObject); Ma ora il quando anche quando clicco su altri luoghi l'oggetto viene eliminato .. Credo che il problema è con la direzione raycast essendo -Vector2.up .. che direzione devo cast a ?? –

risposta

1

Devi attaccare un collettore di rete (qualsiasi collisore) con il tuo oggetto prima di entrare nel Se interno. Quindi,

Destroy(hit.collider.gameObject); 

semplicemente fare il lavoro.

Potrebbe esserci un altro lavoro da queste parti.

void Update() { 

    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
    RaycastHit hit; 

    if(Physics.Raycast(ray,out hit)) 
    { 
     if(Input.GetMouseButtonDown(0)) 
     { 
      isHit = false; 
      Destroy(hit.collider.gameObject); 
     } 
    } 
} 
19

Non è possibile utilizzare le funzioni di fisica 3D sui nuovi oggetti 2D. Utilizzare invece il 2D functions. Esempio:

RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero); 

if(hit.collider != null) 
{ 
    Debug.Log ("Target Position: " + hit.collider.gameObject.transform.position); 
} 
6

Questa domanda è un po 'vecchio, ma mi stava cercando aa modo per ottenere una GameObject con un clic del mouse in unità 2D, e la risposta da Esa quasi mi ha aiutato, ma non potevo permettermi per farlo funzionare, quindi con un po 'di ricerca ho visto che Camera.main.ScreenToWorldPoint stava restituendo il centro dell'area dello schermo della fotocamera e funzionava correttamente. era necessario inserire la differenza nella posizione Z dalla fotocamera e dal GameObject più vicino. La mia videocamera era impostata per impostazione predefinita in -10 e il mio GameObject era in 0, quindi tutto ciò che dovevo fare è impostare il mio Input.mousePosition.z su 10. Quindi, se hai problemi a lavorare con il codice di Esa (come me :() il codice qui sotto può aiutare:

RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10)), Vector2.zero); 

if(hit.collider != null) 
{ 
    Debug.Log ("Target Position: " + hit.collider.gameObject.transform.position); 
} 
1

Prima allegare qualsiasi tipo di collider 2D al vostro GameObject, poi scegliere una di queste soluzioni;

1 ° caso - Se ci sono più di 1 GameObject sulla parte superiore di ogni l'altro, e si cerca di capire si fa clic su GameObject specifico:

void Update() 
{ 
    if (Input.GetMouseButtonDown (0)) { 
     Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); 
     RaycastHit2D[] hits = Physics2D.GetRayIntersectionAll (ray, Mathf.Infinity); 
     foreach (var hit in hits) { 
      if (hit.collider.name == name) { 
       MyFunction(); 
      } 
     } 
    } 
} 

2 ° caso - I f c'è solo 1 GameObject, e si tenta di capire se si fa clic:

void Update() 
{ 
    if (Input.GetMouseButtonDown (0)) { 
     Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); 
     RaycastHit2D hit = Physics2D.GetRayIntersection (ray, Mathf.Infinity); 
     if (hit.collider != null && hit.collider.name == name) { 
      MyFunction(); 
     } 
    } 
} 
Problemi correlati