Noticias

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

Script MoveToClick

Iniciado por Javierhakerone, Junio 08, 2018, 06:45:45 AM

Tema anterior - Siguiente tema
Saludos
 
Bueno amigos de antemano gracias...
 
mi codigo es el siguiente pero no me funciona bien...
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveToClick : MonoBehaviour {
    public float speed;
    Vector3 target;
// Use this for initialization
void Start () {
        target = transform.position;
}

// Update is called once per frame
void Update () {
   if (Input.GetMouseButtonDown(1))
        {
            target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            target.z = 0f;
        }
        transform.position = Vector3.MoveTowards(transform.position, target, speed* Time.deltaTime);
        Debug.DrawLine(transform.position, target, Color.green);
}
}
 

 
quiero que donde yo haga click la nave valla... es un juego de naves espaciales en 3d la cámara va siguiendo la nave y esta es perspectiva...
 
soy muy nuevo en esto y quisiera aprender...

Tienes que hacer un raycasting, desde la posicion del mouse hacia el terreno o espacio movible, si es un juego de naves imagino deberás usar un collider invisible para definir donde se debe mover la nave, para el raycasting solo usa 
 

//shoot a ray from mouse position to forward
Ray ray = Camera.main.ScreenPointToRay (new Vector3(Input.mousePosition.x , Input.mousePosition.y , -1.0f));
RaycastHit hit;
//casting to the terrain
if (Physics.Raycast(ray, out hit , Mathf.Infinity , groundLayer))
{
//aqui es a donde te quieres mover
Vector3 target = hit.point;
}

 
 

Cita de: James Roman date=1528433813Tienes que hacer un raycasting, desde la posicion del mouse hacia el terreno o espacio movible, si es un juego de naves imagino deberás usar un collider invisible para definir donde se debe mover la nave, para el raycasting solo usa
   
   

//shoot a ray from mouse position to forward
Ray ray = Camera.main.ScreenPointToRay (new Vector3(Input.mousePosition.x , Input.mousePosition.y , -1.0f));
RaycastHit hit;
//casting to the terrain
if (Physics.Raycast(ray, out hit , Mathf.Infinity , groundLayer))
{
//aqui es a donde te quieres mover
Vector3 target = hit.point;
}

   
       
   


Gracias por responder, soy muy (MUY) nuevo en esto se muy poco todo esto lo hago por aprender... con esto quiero decir que noc que es el ray casting jaja ya me voy a Google a resolver eso... 
 
Gracias por el fragmento de código voy a estudiarlo y tratar de implementarlo...


 
 



   
      si es un juego de naves imagino deberás usar un collider invisible para definir donde se debe mover la nave
   

[/quote]
 
Eso no lo sabia, la tenia flotando por el espacio y usaba el 
 

target.z = 0f;

 
 
 
para que la nave no suba ni baje XD

Saludos amigos. 
 
usando el siguiente codigo me llego a funcionar un momento lo que es mover al hacer click pero borre la ecena ya que todo esto lo hago es por aprender no crear ningun juego en si y ahora que quiero volver a hacer uso del codigo no me quiere funcionar nose porque simplemente no hace nada el agent
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class MoveToClick : MonoBehaviour {
   
// Use this for initialization
    NavMeshAgent agent;
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100))
            {
                agent.destination = hit.point;
            }
        }
    }
}

 
Me explican bn que hacer o no se porfa

Cita de: Javierhakerone date=1528594680Me explican bn que hacer o no se porfa
   


Hola, mirá para mi si estas aprendiendo lo mejor es:
 


  •    Descomponer todo lo que hagas en partes, sobre todo si está con cosas nuevas (ej el raycast que mencionaste anteriormente) e ir introduciendo de a poco (simplemente para no tener N cosas que pueden fallar y centrarte en una sola). Por ej sabés que para que un agent se mueva tenés que tener un navmeshAgent, tener una navMesh, darle a ese agent(en el componente) un destino, y una velocidad distinta de cero (muy por arriba) -->  entonces esa parte ya la tenés liquidada, el rayCast es otra parte totalmente distinta, practicá solo esto, si el Agent no se mueve es o porque fallás en el raycast, o porque la condición de movimiento del agent (lo de arriba) está fallando.


  •    imprimí todo, (el Debug.Log suele ser muy efectivo) para sacarte dudas, tiene un valor el hit.Point? Camera.main... está devolviendo un valor, imprimilo, Physics,Raycast te está dando true o false, imprimilo, osea más que nada a modo didáctico a la larga vas a saber que cosa está fallando y que no, pero aveces cuando todo se comporta medio extraño no está mal mandar un Debug.Log("pasó por la linea 54") por ej


En este caso es imposible ver en que estás fallando ya que como decís tenés una escena nueva, se puede deber a que el raycast  no se da, a que el objeto a colisionar está en X layer, (quizás no permitida) , puede ser que Camera.main sea otra que la que estás usando, etc etc etc
 
Fijate que podés (y es recomendable) hacer un catcheo del componente de la cámara para no hacer un find cuadro a cuadro (que es horriblemente malo para el desempeño)
 

Camera cam;
void Start()
{
cam = Camera.main;
}
void Update()
{
//usas "cam" en vez de "Camera.main"
}

 
 
 
No se si conocés estos trucos pero los usas te sacás las dudas de si colisiona o nó:
 

// dibuja un ray, pasas punto y dirección
Debug.DrawRay(puntoInicial , direccion * longitud , color);
// dibuja una línea, pasas punto inicial y final
Debug.DrawLine(puntoInicial , puntoFinal , color);

 
en este caso es una papita, o es uno o el otro, pero en general usar estos gizmos/debugs te van a dar info muy valiosa
 
 
 
Saludos

Hola @lightbug gracias por responder...
 
El problema ya lo resolvi, no se que fallaba exactamente pero revisando aqui y alla y probando el codigo, mapa y ecena lo que me di cuenta me fallaba era la nave (la verdad no me explico como aun) osea el asset descargado... yo tenia el NavMesh el agent y el codigo bien, todo funciona con el objeto que le pusiera simulando la nave... pero la nave en si me daba error en la consola...
 
El como lo resolvi, ps... Modificando el archivo .fbx (ese donde modificas la malla del objeto noc como se le diga) de dicha nave... y guardando con otro nombre ya importando nuevamente ya no me daba error... la verdad no entendi eso..
 
Cita de: lightbug date=1528600099Hola, mirá para mi si estas aprendiendo lo mejor es:
   
   


  •          Descomponer todo lo que hagas en partes, sobre todo si está con cosas nuevas (ej el raycast que mencionaste anteriormente) e ir introduciendo de a poco (simplemente para no tener N cosas que pueden fallar y centrarte en una sola). Por ej sabés que para que un agent se mueva tenés que tener un navmeshAgent, tener una navMesh, darle a ese agent(en el componente) un destino, y una velocidad distinta de cero (muy por arriba) -->  entonces esa parte ya la tenés liquidada, el rayCast es otra parte totalmente distinta, practicá solo esto, si el Agent no se mueve es o porque fallás en el raycast, o porque la condición de movimiento del agent (lo de arriba) está fallando.
          

  •       

  •          imprimí todo, (el Debug.Log suele ser muy efectivo) para sacarte dudas, tiene un valor el hit.Point? Camera.main... está devolviendo un valor, imprimilo, Physics,Raycast te está dando true o false, imprimilo, osea más que nada a modo didáctico a la larga vas a saber que cosa está fallando y que no, pero aveces cuando todo se comporta medio extraño no está mal mandar un Debug.Log("pasó por la linea 54") por ej
          

  •    


Si, eso hago, ps coloco algo pruebo y modifico hasta que funcione, cuando lo hace lo guardo como PreFabs y lo borro de la ecena para que no interfiera XD no se que tan bueno sea eso, ya despues voy colocando y juntando todo y probando
 
Lo del Debug si ps me aplicare con eso, ya veo que dibuja lo que tenga que hacer el codigo sirve de mucha ayuda gracias...



Bueno aparte de todo, tienes idea de como crear un minimapa? lo que se me viene a la mente es una Camera que marque todo el mapa y que se muestre por un canvas pero ya de hay noc como aplicarlo XS

Cita de: Javierhakerone date=1528608447Si, eso hago, ps coloco algo pruebo y modifico hasta que funcione, cuando lo hace lo guardo como PreFabs y lo borro de la ecena para que no interfiera XD no se que tan bueno sea eso, ya despues voy colocando y juntando todo y probando
   


AH ok . Lo del prefab depende, en general el prefab es algo que instancias muy seguido o que al modificar uno modificás varios (que por supuesto te vienen útiles), ej si estuvieras en un shooter un misil podría ser un prefab, la lógica es seguir hacia adelante o ***guir a tal target, y cuando colisiona con algo explotar y dañar al objetivo... la explosión podría contener un efecto de partículas (podrían ser varios anidados), sonidos etc y podría ser a su vez otro prefab, y así. No se bien para que es que los usas en particular pero más o menos para esto se usan y son muy útiles.
 
Cita de: Javierhakerone date=1528608447Bueno aparte de todo, tienes idea de como crear un minimapa? lo que se me viene a la mente es una Camera que marque todo el mapa y que se muestre por un canvas pero ya de hay noc como aplicarlo XS
   


Supongo que así como decís, vas a tener que usar lo que se llama un renderTarget, es decir una cámara renderiza pero a una textura (en vez de al target final, la pantalla)fijate que podés crear un render target, no recuerdo bien el nombre pero podés, le tenés que especificar a la cámara (la del minimap) que renderice sobre este renderTarget, luego crearte en la UI una rawImage, (el minimap, lo ponnés donde quieras) e indicarle este renderTarget como imagen y listo.
 
Otra sería usando un minimap ya creado, (sin una cámara extra) y vos mover el minimap mediante código, el minimap y el movimiento se deben corresponder con el mapa real (de más está decirlo jajaj)
 
saludos

Cita de: lightbug date=1528617625AH ok . Lo del prefab depende, en general el prefab es algo que instancias muy seguido o que al modificar uno modificás varios (que por supuesto te vienen útiles), ej si estuvieras en un shooter un misil podría ser un prefab, la lógica es seguir hacia adelante o ***guir a tal target, y cuando colisiona con algo explotar y dañar al objetivo... la explosión podría contener un efecto de partículas (podrían ser varios anidados), sonidos etc y podría ser a su vez otro prefab, y así. No se bien para que es que los usas en particular pero más o menos para esto se usan y son muy útiles.
   


Vi el curso y me explicaron lo del Prefab pasa que creo cierto objeto y cuando algo me da algun error o necesito guardarlo por algun motivo lo mando a los Prefab  para cuando lo valla a volver a colocar no tener que estar configurando todo de nuevo agregando Script  y demas componentes...
 
 
 
Cita de: lightbug date=1528617625Supongo que así como decís, vas a tener que usar lo que se llama un renderTarget, es decir una cámara renderiza pero a una textura (en vez de al target final, la pantalla)fijate que podés crear un render target, no recuerdo bien el nombre pero podés, le tenés que especificar a la cámara (la del minimap) que renderice sobre este renderTarget, luego crearte en la UI una rawImage, (el minimap, lo ponnés donde quieras) e indicarle este renderTarget como imagen y listo.
   
   
      Otra sería usando un minimap ya creado, (sin una cámara extra) y vos mover el minimap mediante código, el minimap y el movimiento se deben corresponder con el mapa real (de más está decirlo jajaj)
   


bueno ya me toca Googlear sobre esto jaja ya que ni idea de como hacerlo como te mencione antes jajaja te aviso cualquier cosa si estas dispuesto a ayudarme ya pase algun capture con lo que he echo esta semana que tengo en Unity

Etiquetas: