He creado una TextAnimation de 4 segundos en la que el texto aparece poco a poco y luego desaparece. El texto es llamado desde el script, según el número de Coins conseguidas aparece un texto u otro. Mi problema es que el loop de la animación se repite, por lo que si coges "X" Coins y luego tardas en coger más Coins el primer mensaje aparece y desaparece en continuamente. Si le quito el loop entonces solo aparece el primer mensaje y desaparece y el resto no se cargan. ¿Hay alguna manera de decir, desde el código, que para cada "X" Coins recogidas la animación se active solo una vez? Me explico: coges "2" Coins y aparece la animación del texto con el primer texto, se para y no se repite más y luego cuando cojas "8" Coins aparezca el segundo mensaje con la misma animación.
No sé si me he explicado bien o mal. O si hay una forma más fácil de hacer esto. He probrado varias cosas, pero ninguna me funciona. Si me he explicado mal intentaré volver a explicarme utilizando otras palabras. Dejo el código del GameController aquí:
https://pastebin.com/SpHz1dJi (https://pastebin.com/SpHz1dJi)
Muchas gracias, un saludo.
Una cosa es asignar la variable del texto y otra llamar la animación, lo que debes hacer es quitar el loop y llamar la animación cuando se cumpla la condición, después de asignar la variable 'argumento'.
Cita de: juanma_teso date=1491910090Una cosa es asignar la variable del texto y otra llamar la animación, lo que debes hacer es quitar el loop y llamar la animación cuando se cumpla la condición, después de asignar la variable 'argumento'.
Perdona Juanma, es que estoy aprendiendo Unity y C# y no sé muy bien cómo hacer eso. Si lo viera escrito en código y dónde debe ir cada cosa lo pillaría mejor. He desactivado el Loop, pero no sé cómo hacer lo que me dices con exactitud.
Muchas gracias por contestar.
Estás usando Animation o Animator¿? Si subes una captura de los componentes del GameObject HUDHistoria sería útil.
Ahí van un par de imágenes (espero haberte entendido bien acerca de qué es lo que querías). El TextAnimation ya tiene el Loop quitado.
Gracias.
(//<fileStore.core_Attachment>/monthly_2017_04/HUDHistoria.png.5b52f764c027a7b88a8bc7d551aab802.png)
(//<fileStore.core_Attachment>/monthly_2017_04/HudHistoriaText.png.654ca4903d0b5cceecb437eeddaf6bb0.png)
Vale, pues lo que tienes que hacer es iniciar la animación, puedes usar la función Play ("TextAnimation") o asignar un valor para que la animación se reproduzca solo, te dejo el manual para que veas por encima.
https://docs.unity3d.com/es/current/Manual/AnimatorWindow.html (https://docs.unity3d.com/es/current/Manual/AnimatorWindow.html)
Para usar la función Play tienes que acceder al componente Animator de Text.
Gracias, pero es que quiero poder controlar su tiempo desde el script con un Wrap Mode Once. Lo que pasa es que no sé cómo hacerlo ni dónde colocarlo.
Cita de: Fulamari date=1491918024Gracias, pero es que quiero poder controlar su tiempo desde el script con un Wrap Mode Once. Lo que pasa es que no sé cómo hacerlo ni dónde colocarlo.
Puedes asignar el tiempo de inicio usando Animator.Play(). Para asignar el tiempo de la animación siempre se debe usar un float entre 0 y 1.
Un código de ejemplo:
public Animator anim;
void Start(){
anim.Play("TextAnimation", 0.0f); //Se iniciaria en el primer frame de la animacion. (0.0f es el inicio, 1.0f es el final)
}
Me aparece el siguiente error con lo que me has dicho:
Animator does not have an Animator Controller UnityEngine.Animator:Play(String, Int32)GameManager:Start() (at Assets/Scripts/GameManager.cs:38)
Cita de: Fulamari date=1491938074Me aparece el siguiente error con lo que me has dicho:
Animator does not have an Animator Controller UnityEngine.Animator:Play(String, Int32)GameManager:Start() (at Assets/Scripts/GameManager.cs:38)
Eso seguro es porque tu string de nombre no coincide con "TextAnimation".
y no te quedaria mas comodo usarlo todo desde codigo, con un subrutina si lo deseas o con una funcion, de forma lineal o con una simple senoidal, y se lo aplicas al color del text. Por ejemplo, cuando se da la condicion que desees activas la subrutina o la funcion. La ventaja de encarar las cosas asi es que podes imponer el modo", no estoy seguro si podes reproducir una animacion de modo loop o no cambiandola, no recuerdo si el modo es propio del clip o es modificable en animator.
Tu propuesta suena interesante, pero no sabría cómo hacerlo :O.
Cita de: Fulamari date=1491986240Tu propuesta suena interesante, pero no sabría cómo hacerlo :O.
La desvetaja es que con animacion podes controlar cada aspecto de las curvas, usando una senoidal o de forma lineal tenes algo de control, pero seguro para lo que buscas no es un gran problema, para cambiar un float (por ej el aplha de un color) podes hacer algo asi, Ojo lo hice al boleo seguro hay errores, ej lineal:
float Alpha = ;
float tiempoSubida = 0.5f // medio segundo
bool animation = false; //flag para animar
bool deRegreso = false;
bool loop = false;
bool AnimarAlpha() //si devuelve true termino una vuelta
{
if(!deRegreso){
Alpha += Time.deltaTime / tiempoSubida;
if(Alpha >= 1){
Alpha = 1;
deRegreso = true;
}
} else{
Alpha -= Time.deltaTime / tiempoSubida;
if(Alpha <= ){
Alpha = ;
TuColorDeInteres.a = Alpha;
deRegreso = false;
return true; //terminó
}
}
TuColorDeInteres.a = Alpha;
return false;
}
void Update()
{
if(animation)
{
if(!loop){
if(AnimarAlpha())
animation = false; //Cuando se da la condicion de salida vuelve a la normalidad
}else{
AnimarAlpha();
if(condicion de salida del loop...) //Sin esto una vez activado no sale mas
animation = false;
}
return;
}
if(tucondicionDeInicio...)
{
animation = true;
}
}
Entonces podes hacer que aparezca/desaparezca o alreves, o podes cambiar el flag "animation" para decirle que anime siempre (loop) o como está que realiza la animacion cuando "tucondicion" se de, y finaliza cuando realiza solo un ciclo.