Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Yawin en Enero 07, 2018, 10:59:21 PM

Título: Orden de movimiento estilo RTS
Publicado por: Yawin en Enero 07, 2018, 10:59:21 PM
Hola a todo el mundo,
 
estoy haciendo un prototipo para un RTS y me he encontrado con un problema bastante serio: el click del ratón.
 
En líneas generales, mi problema es que al hacer click sobre el terrain (haciendo uso del Ray) las coordenadas de hit son siempre las mismas (las coordenadas del GameObject "Terrain"). ¿Cómo puedo hacer para que al hacer click vaya a donde he hecho click y no al transform.position del GameObject clickado?
 
Por otro lado, he puesto RigidBody a dos GameObjects y al moverlos con transform.Translate() o bien se chocan y empujan mutuamente o bien (haciendo freeze a los ejes o haciéndolos kinemáticos) hacen como que no son sólidos y se atraviesan. ¿Qué puedo hacer?
Título: Orden de movimiento estilo RTS
Publicado por: GSG3D en Enero 07, 2018, 11:14:48 PM
Estas usando hit.point?
 
Y para el movimiento usa navmeshagent.
Título: Orden de movimiento estilo RTS
Publicado por: Yawin en Enero 08, 2018, 12:12:34 AM
Lo que uso es esto:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Unidad : Actor
{
private Vector3 target;
public float speed = 0.5f;
public override void ActorStart()
{
   pointingAction = new Action(go_to);
}
public override void ActorUpdate()
{
   switch(state)
   {
      case 1:
         transform.LookAt(target);
         if(Vector3.Distance(target, transform.position) > 0.5f)
         {
            transform.Translate(transform.forward * speed * Time.deltaTime, Space.World);
         }
         else
         {
            state = 0;
         }
         break;
   }
}
void go_to()
{
   Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
   RaycastHit hit;
   if(Physics.Raycast(ray, out hit))
   {
      target.x = hit.transform.position.x;
      target.y = 0;
      target.z = hit.transform.position.z;
      state = 1;
   }
}
}

 
Me anoto lo del navmesh. ¡Gracias!
Título: Orden de movimiento estilo RTS
Publicado por: Eskema en Enero 08, 2018, 12:25:25 AM
Sobre el tema fisicas te digo lo mismo que en este post, mover con translate esta mal y si son kinematicos se atraviesan porque no hay fisicas

 
 
Título: Orden de movimiento estilo RTS
Publicado por: Yawin en Enero 08, 2018, 12:31:13 AM
¡Ok! Lo miro ahora.
 
En realidad no me importa no usar físicas. Me basta con que detenga su movimiento al encontrar un elemento sólido.
Título: Orden de movimiento estilo RTS
Publicado por: lightbug en Enero 08, 2018, 05:36:06 AM
No importa que sea, siempre y cuando tengas un collider el hit se va a dar igual (siempre que esté habilitado), lo que te dicen arriba es que no te interesa la info del objeto con el que el ray colisiona, sino la info de la misma colisión. Para utilizar esto necesitas pasarle al Raycast una estructura de tipo RayCastHit (que lo estás haciendo bien) en donde se almacena toda la info (punto de contacto, normal, distancia, etc) y de ahí, a donde vas a mandar a tu personaje (por el metodo que sea, nav mesh es tipico de RTS) corresponde al "point" de dicha estructura.
 
De lo que vi arriba estás seteando el target en:
 

target.x = hit.transform.position.x;

 
cuando a vos te interesa:
 

target.x = hit.point.x;

 
supongo, no lo vi muy bien al código.
 
Saludos
Título: Orden de movimiento estilo RTS
Publicado por: Yawin en Enero 08, 2018, 10:24:49 PM
Cita de: lightbug date=1515386166No importa que sea, siempre y cuando tengas un collider el hit se va a dar igual (siempre que esté habilitado), lo que te dicen arriba es que no te interesa la info del objeto con el que el ray colisiona, sino la info de la misma colisión. Para utilizar esto necesitas pasarle al Raycast una estructura de tipo RayCastHit (que lo estás haciendo bien) en donde se almacena toda la info (punto de contacto, normal, distancia, etc) y de ahí, a donde vas a mandar a tu personaje (por el metodo que sea, nav mesh es tipico de RTS) corresponde al "point" de dicha estructura.
   
   
      De lo que vi arriba estás seteando el target en:
   
   

target.x = hit.transform.position.x;

   
      cuando a vos te interesa:
   
   

target.x = hit.point.x;

   
      supongo, no lo vi muy bien al código.
   
   
      Saludos
   


Sí, he aplicado lo que me dijeron y ha funcionado ^__^
 
¡Gracias!