Jump to content
Sign in to follow this  
Yohannan_Perez

Mover ficha por tablero

Recommended Posts

Hola, estoy con un juego de tablero donde x numeros del dado, la ficha avanza ese numero sobre las casillas del juego con un Vector3.MoveTowards, hasta aquí todo correcto y sencillo. El problema me llega cuando la ficha del jugador tiene que pasar por las esquinas y toma el camino mas recto cruzando todo y queda poco estético.

Para solucionarlo he intentado que la ficha haga el MoveTowards de casilla en casilla  con: Do while (posicion1 != posición destino), foreach (casilla in totalCasillas), dentro del Update, dentro de corutinas,...   Pero siempre me ocurre lo mismo: los frames se refrescan antes de que la ficha apenas se haya movido un poco y no llega a su destino final, a no ser que ponga un Time.DeltaTime * 500F dentro del MoveTowards que no tiene sentido.

Si alguien pudiese darme una idea de como solucionarlo se lo agradecería mucho.

Gracias.

 

 

 

Share this post


Link to post
Share on other sites
3 hours ago, Yohannan_Perez said:

Pero siempre me ocurre lo mismo: los frames se refrescan antes de que la ficha apenas se haya movido un poco

No entiendo a que te referís con esto, la ficha se moverá valiendose de tres variables que vos elegís/fijás: distancia tiempo o velocidad, si querés que se muevan "parejas" seteá la velocidad fija, la distancia obviamente va a ser fija para cada caso (de pos1 a pos 2) y el resto es esperar a que se mueva en un tiempo t cualquiera (si querés personalizarlo más es más o menos lo mismo, el principio). No se como es que estás usando un while en Update pero solo tené cuidado, depende del argumento que tengas dentro por supuesto, si este depende del paso de frames se quiebra el programa -> Ctrl + Alt + Delete.

Usar move towards está perfecto, el argumento de la velocidad de movetowards (creo que el tercero (?) ) será un delta de posición, podría ser algo como Velocidad * Time.deltaTime, claro que dependiendo de tus dimensiones 500 puede ser un número inmenso para una velocidad. Podrías simplemente usar un bool (ya que la ficha tiene dos estados) y decir algo así:

if(moviendose)
{
	// No me acuerdo si MoveTowards era así
	fichaActual.transform.position = Vector2.MoveTowards ( fichaActual.transform.position , objetivo , velocidad * Time.deltaTIme );
	
	if( fichaActual.transform.position == objetivo ){
		if( !SeTerminaronTodosLosMovimientos() ){
			objetivo = nuevoObjetivo;
		}else{
			moviendose = false;
		}
	}
		

}else{
	** sigue el juego **
}

 

 

Share this post


Link to post
Share on other sites

Matrices y pathfinding, A*, o usa Navigation Mesh.

Con esas 3 técnicas te solucionas todos los problemas del mundo con juegos basados en tableros o movimiento por casillas/turnos.

Share this post


Link to post
Share on other sites
On ‎10‎/‎13‎/‎2018 at 11:01 AM, pioj said:

Matrices y pathfinding, A*, o usa Navigation Mesh.

Con esas 3 técnicas te solucionas todos los problemas del mundo con juegos basados en tableros o movimiento por casillas/turnos.

Esta muy bien esa solución, pero la veo muy "gore" para mi proyecto que es muy simple, así que le di al coco y encontré un sistema que de momento me esta funcionando:

He añadido varias corutinas que se llaman unas a otras desde el numero 6 al numero 1. Y un casting de if que las llama según el numero que haya salido del dado, se ajustan las velocidades del Time.Deltatime del MoveTowards en el script del jugador,  con el tiempo WaitForSeconds que espera la corutina a que haya llegado la ficha de casilla a casilla del tablero.

En el script del jugador:

void Update()
{
if (player.transform.position != GameObject.Find(GameManager.shareInstance.baldosasNomJ1).transform.position)
        {
            this.transform.position = Vector3.MoveTowards(this.transform.position, GameManager.shareInstance.nuevaPosicion, Time.deltaTime * velocidadFicha);
        }
}

En el GameManager:

 private IEnumerator SacarUno()
    {     
            numeroDeBaldosaJ1 = numeroDeBaldosaJ1 + 1;
            baldosasNomJ1 = "Baldosa" + numeroDeBaldosaJ1.ToString();
            nuevaPosicion = GameObject.Find(baldosasNomJ1).transform.position;
            yield return new WaitForSeconds(segundosEsperarALaFicha);
            StopCoroutine("SacarUno");
    }

 private IEnumerator SacarDos()
    {
            numeroDeBaldosaJ1 = numeroDeBaldosaJ1 + 1;
            baldosasNomJ1 = "Baldosa" + numeroDeBaldosaJ1.ToString();
            nuevaPosicion = GameObject.Find(baldosasNomJ1).transform.position;
            yield return new WaitForSeconds(segundosEsperarALaFicha); 
            StartCoroutine("SacarUno");
            StopCoroutine("SacarDos");
     }

private IEnumerator SacarTres()
    {      
            numeroDeBaldosaJ1 = numeroDeBaldosaJ1 + 1;
            baldosasNomJ1 = "Baldosa" + numeroDeBaldosaJ1.ToString();
            nuevaPosicion = GameObject.Find(baldosasNomJ1).transform.position;
            yield return new WaitForSeconds(segundosEsperarALaFicha);
            StartCoroutine("SacarDos");
            StopCoroutine("SacarTres");
   }

...

El codigo es mas extenso, pero creo que os podreis hacer una idea.

De momento me funciona sin problemas para cuatro jugadores y se puede ajustar la velocidad. Si los mas entendidos le veis algun problema ya me contais.

Gracias por contestar.

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...