Noticias

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

Pausar el juego sin cambiar el Timescale

Iniciado por power, Mayo 18, 2017, 02:40:58 PM

Tema anterior - Siguiente tema
Hola a todos,
 
Estoy haciendo un juego tipo tower defense, en el cual puedes arrastrar unidades al campo de batalla. Mi idea es que cuando arrastres una unaidad al mapa, el juego se pause, pero no quiero untilizar el Timescale porque sigo usando las fisicas para posicionar la unidad y evitar que puedas ponerla encima de un arbol por ejemplo. Tengo hecho un pause global, y cada objeto tiene una función que pausa sus acciones PERO no se como pausar las coroutinas y los invokes que tiene cada objeto. Por ejemplo, es posible que un enemigo este envenenado, por lo que cada x segundos se le quita vida, y esto lo hago con una coroutina (o con un invoke). No se de que modo puedo pausar un invoke o una coroutina, si alguien lo sabe, ayuda!! Lo único que se me ha ocurrido es guardar una lista de todas las tareas 'asincronas' que están en ejecución, e ir controlando el tiempo que llevan y el que les falta, de modo que cuando se pause el juego, parar todas estas tareas, y cuando se reanude, volver a reanudarlas, pero lo veo un coñazo.
 
Otra opción que me valdría es usar el timescale a 0, pero que haya alguna forma de seguir usando las fisicas para lanzar rayos, etc, aunque esto creo que no es posible.
 
Un saludo.

Tampoco estoy muy puesto, pero para parar las coroutinas  tienes StopCoroutine().
 
Un saludo
 
 

Mayo 19, 2017, 04:24:21 PM #2 Ultima modificación: Mayo 19, 2017, 04:28:40 PM por Harsel
En principio no veo una solución "sencilla", tal como temes, quizás la única opción sea pausar todos los scripts con un método de parada que tengan y luego crear una lista con todas las asincronas y también pararlas a mano.
 
Unity nunca ha permitido demasiada libertad con temas como estos, creo que habia un asset por la assetstore que permitia una mejora de este sistema aunque no recuerdo su nombre.
 
¿Has pensado en poner un timescale muy muy bajo para asi aparentar que se reduce mucho el tiempo en vez de pararlo del todo?
 
Me explico: Esto no es que sea muy "eficiente", pero podrías probar a poner un tiemescale muuy pequeño 0.0001, y luego a los objetos que recien pongas aumentarle por script este tiempo multiplicando Time.deltaTime por 10000, de esa forma se moverían normalmente.

Gracias a todos. He encontrado la solución:
 
https://www.assetstore.unity3d.com/en/#!/content/66499
 
Asset cojonudo y gratuito que permite hacer pause y resume de una rutina entre otras cosas. Con esto y un poco de codigo, puedes hacer un pause 'parcial' bastante apañao.
 
 
 
 

Creo que el error está en el mal uso de las corrutinas, por porque no implementar un sistema de corrutinas para tu juego, no es algo dificil es una tonteria, y podrias hacer un sección de pausa.
 


private IEnumerator UpdateCorrutine(IEnumerator myCorrutine)
{
if(Game.IsPause) yield return null;
if(myCorrutine.MoveNext())
.....
}

 
Busca en internet como funcionan los IEnumerator, luego podrás crear un sistema de corrutinas con pausas integradas, hasta podrias indicarle a las corrutinas si quieres que se pausen o no.

Etiquetas: