Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

[Ayuda] RaycastHit2D

Iniciado por Null, Diciembre 02, 2016, 12:28:34 PM

Tema anterior - Siguiente tema
Hola.

Tengo este script:
 

using UnityEngine;
public class PlaceObj : MonoBehaviour {
  [SerializeField]
  private GameObject _obj;
 
  private void FixedUpdate() {
    RaycastHit2D hit2D = Physics2D(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));
   
    if (Input.GetMouseButtonDown()) {
      Instantiate(_obj, hit2D.transform.position, Quaternion.identity);
    }
    Debug.DrawLine(transform.position, hit2D.transform.position, Color.magenta);
  }
}

 
y lo que buscaba era dibujar un ray desde la posición de la cámara, hasta el punto exacto del ratón.

Pero el problema es que el ray no se mueve para nada cuando muevo el ratón, y todo el rato me instancia el _obj en la misma posición al hacer clic.


Qué no estoy entendiendo?

Hola, hit2D tiene un "point" que equivale a la posición donde se produce la interseccion. Proba ponerlo asi a ver que pasa:
 

RaycastHit2D hit2D = Physics2D(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));
if(hit2D)
{
Debug.DrawLine(transform.position, hit2D.point, Color.magenta);
if (Input.GetMouseButtonDown()) {
      Instantiate(_obj, hit2D.point, Quaternion.identity);
}
}
   

 
 

Cita de: lightbug date=1480703253Hola, hit2D tiene un "point" que equivale a la posición donde se produce la interseccion. Proba ponerlo asi a ver que pasa:
   
   

RaycastHit2D hit2D = Physics2D(transform.position, Camera.main.ScreenToWorldPoint(Input.mousePosition));
if(hit2D)
{
Debug.DrawLine(transform.position, hit2D.point, Color.magenta);
if (Input.GetMouseButtonDown()) {
      Instantiate(_obj, hit2D.point, Quaternion.identity);
}
}
   

   
       
   


Hola!

Probé antes con eso, y hace su función correctamente de instanciar justo en donde hago clic, pero no es lo que busco... exactamente :(

Perdón si quizás no me expliqué muy bien al principio.


Resulta que tengo cuatro sprites que hacen de "casillas", y lo que busco es que al hacer clic izquierdo sobre una casilla cualquiera, me instancie el objeto JUSTO en la misma posición de esa casilla.

Por eso tenía puesto hit2D.transform.position en:
 

Instantiate(_obj, hit2D.transform.position, Quaternion.identity);

 
Y con eso escrito, obtengo este comportamiento:

 
Eso está bien, es así como lo quiero.

El problema como ves, es que tengo que mover la cámara cada vez que quiero "pintar" en otra casilla diferente,

ya que haciendo clic en cualquier otra casilla sin mover antes la cámara, me instancia el objeto en el mismo lugar una y otra vez, ya que el ray no se mueve con la posición del ratón como yo me esperaba.

Tal como se ve aquí:

 
Yo y mis inventos locos.

No se me ocurre qué puedo hacer para solucionarlo, aparte de mover la cámara conmigo cada vez que hago clic, pero precisamente eso es lo que evito. 

El problema esta el raycasthit2D, antes ni lo vi a eso jaj, estas pasandode la camara (origen de esta no del rayo) hasta el raro mismo ..., fijate como lo esta dibujando. Lo correcto seria, sobre todo cuando trabajas con rayos desde la camara usar el ray origin y el ray direction asi:
 

void Update() {
Ray ray = GetComponent<Camera>().ScreenPointToRay( Input.mousePosition );
     Debug.DrawRay(ray.origin, ray.direction * Mathf.infinity, Color.magenta);
    RaycastHit2D hit2D = Physics2D(ray.origin, ray.direction , Mathf.infinity);
     if(hit2D)
     {
        if (Input.GetMouseButtonDown()) {
        Instantiate(_obj, hit2D.point, Quaternion.identity);
        }
    }
   
}

 
Despues donde lo instancias va en vos hacer el metodo, aca el hit2D.point es el punto exacto donde colisiona el ray osea en cualquier lado, tenes que aplicar alguna matematica que te haga una clase de snapToGrid. Podes tener un Vector2 que lleve en todo momento el registro de en que posicion de la grilla esta el cursor, por ejemplo si el hit2D.point es (2.4 , 5.8 , xxxx ) --> para la grilla (por ejemplo) esta en (2 , 5) , entonces cuando instancias el objeto le pasas este ultimo valor (en Vector3)

Etiquetas: