Noticias

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

Acercar objeto al hacerle click

Iniciado por Antonio Casas Rojas, Mayo 29, 2018, 06:59:03 PM

Tema anterior - Siguiente tema
Mayo 29, 2018, 06:59:03 PM Ultima modificación: Mayo 30, 2018, 02:58:43 PM por pioj
Muy buenas. Llevo poco tiempo aprendiendo programación y estoy probando un script que consiste en que al hacer click sobre un objeto concreto, atraerlo hacia mí (hacia una posición más cercana de mi cámara siguiendo el raycast), pero no lo consigo. He preparado la escena con el objeto "picable" y mi personaje es un FirstPersonCharacter y le he añadido el script siguiente a mi cámara pero no se en qué fallo.
 

public class acercarObjeto : MonoBehaviour {
    public float distanciaAcercarObjeto = 6f;
    public GameObject picable;
 
    void Start () {
        
    }
   
    void Update () {
 
        if (Input.GetMouseButtonDown(0))
        {
               acercarObjeto();
            }
        }
 
    private void acercarObjeto()
    {
        Ray ray = Camera.main.ViewportPointToRay(Vector3.one * 0.5f);
        RaycastHit hitInfo;
        if (Physics.Raycast(ray, out hitInfo, distanciaAcercarObjeto))
        {
 
            if (hitInfo.transform.CompareTag("picable")) {
                picable.transform.position = ray.direction;
            }
            }
        }
    }

 
 
 
Gracias y saludos.
 
 

Cita de: Antonio Casas Rojas date=1527613143pero no se en qué fallo.
   


que significa fallar? siempre es útil saber para quien te responda cual es el resultado que estás teniendo, en este caso es sencillo pero si fuera complicado no estaría mal conocer que estás obteniendo de resultado y de aquí encarar el problema.
 
Cita de: Antonio Casas Rojas date=1527613143picable.transform.position = ray.direction;
   


falló acá casi seguro, la dirección de algo corresponde a una combinación lineal de vectores ortonormales, siempre que tengas direcciones involucradas esperá que el resultado sea de modulo 1 y centrado en <0,0,0> (la dir siempre termina normalizada). Vos estás diciendo que una posicion sea una dirección, dependiendo de donde estés es posible que el objeto desaparezca de la vista de la cámara o no cuando hacés click sobre él (ya que se va a por ej <0,1,0> ), si lo que querés es que aparezca de golpe en frente de la cámara podés hacer algo como:
 

picable.transform.position = ray.origin + ray.direction * (distancia);   //distancia un valor tuyo
 

 
Unas cosas
 
- nunca es recomendable llamar a Camera.main cuadro a cuadro eso equivale a hacer un Find (no se que tanto se optimizó esto a lo largo de los años pero siempre fue malo, igual que los GameObject.Find) , antes catchea las cosas que vas a reutilizar, en este caso el transform de la camara.
 
- fijate que si estás en un FPS para origen podés usar directamente el transform.position de la cámara (sin hacer el viewport...)
 

Vector3 rayOrigin = camara.transform.position;
Vector3 rayDir = camara.transform.forward;
float castDistance = 10; //ej 10
Physics.RayCast(rayOrigin, rayDir , castDistance ,... )

 
 
 
saludos

Mayo 29, 2018, 11:24:20 PM #2 Ultima modificación: Mayo 29, 2018, 11:25:09 PM por Antonio Casas Rojas
Cita de: lightbug date=1527622624que significa fallar? siempre es útil saber para quien te responda cual es el resultado que estás teniendo, en este caso es sencillo pero si fuera complicado no estaría mal conocer que estás obteniendo de resultado y de aquí encarar el problema.
   
   
      falló acá casi seguro, la dirección de algo corresponde a una combinación lineal de vectores ortonormales, siempre que tengas direcciones involucradas esperá que el resultado sea de modulo 1 y centrado en <0,0,0> (la dir siempre termina normalizada). Vos estás diciendo que una posicion sea una dirección, dependiendo de donde estés es posible que el objeto desaparezca de la vista de la cámara o no cuando hacés click sobre él (ya que se va a por ej <0,1,0> ), si lo que querés es que aparezca de golpe en frente de la cámara podés hacer algo como:
   
   

picable.transform.position = ray.origin + ray.direction * (distancia);   //distancia un valor tuyo
 

   
      Unas cosas
   
   
      - nunca es recomendable llamar a Camera.main cuadro a cuadro eso equivale a hacer un Find (no se que tanto se optimizó esto a lo largo de los años pero siempre fue malo, igual que los GameObject.Find) , antes catchea las cosas que vas a reutilizar, en este caso el transform de la camara.
   
   
      - fijate que si estás en un FPS para origen podés usar directamente el transform.position de la cámara (sin hacer el viewport...)
   
   

Vector3 rayOrigin = camara.transform.position;
Vector3 rayDir = camara.transform.forward;
float castDistance = 10; //ej 10
Physics.RayCast(rayOrigin, rayDir , castDistance ,... )

   
       
   
   
      saludos
   


Buenas. Gracias por responder. Como objetivo no quería que se me colocara de golpe en frente de la cámara el objeto (aunque es un avance). Quiero que al hacer click en el objeto, se acerque con un cierta velocidad a este mismo punto (justo en frente y en el centro de la cámara). Gracias y saludos.

tendrias que "guardar" el Vector3 de la posicion del "hit"... y luego simplemente "Lerpear" la posicion de la camara hacia ese punto...
 

cam.position = Vector3.Lerp(cam.position,  hit.position, 0.1f);

 
 

Etiquetas: