Jump to content
UnitySpain
Yawin

Orden de movimiento estilo RTS

Recommended Posts

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?

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

¡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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
hace 16 horas, lightbug said:

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

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

¡Gracias!

Share this post


Link to post
Share on other sites

×
×
  • Create New...