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?
Estas usando hit.point?
Y para el movimiento usa navmeshagent.
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!
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
¡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.
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
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!