[RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
3 participantes
Página 1 de 1
[RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Eu estou tentando fazer o personagem rolar apenas após a animação de rolagem acabar, mas como o script está agora, o impulso da rolagem acontece toda a vez q eu aperto o botão, não importa se eu estou no meio da animação ou no fim. Como eu faço para resolver isso?(A função está sendo chamada na Update):
- Código:
void HandleRoll()
{
ani.SetBool("isRolling", canRoll);
if (facingRight)
{
direction = 2;
}
if (!facingRight)
{
direction = 1;
}
if (direction == 1 && Input.GetKeyDown(KeyCode.Mouse1) && isGrounded)
{
canRoll = true;
rb.AddForce(Vector2.left * rollImpulse);
}else if(direction == 2 && Input.GetKeyDown(KeyCode.Mouse1) && isGrounded)
{
canRoll = true;
rb.AddForce(Vector2.right * rollImpulse);
}
}
Hamassfall- Avançado
- PONTOS : 1881
REPUTAÇÃO : 7
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Você pode verificar se a animação terminou fazendo o seguinte:
E então no seu if você pode colocar assim:
Sendo o "0" no comando do StateInfo o layer da sua animação.
- Código:
private Animator anim;
private bool animationHasFinished;
void Start(){
anim = GetComponent<Animator>();
}
void Update(){
// Verifica se a animação parou:
animationHasFinished = anim.GetCurrentAnimatorStateInfo(0).IsName("Nome da animação");
}
E então no seu if você pode colocar assim:
- Código:
if (animationHasFinished){
if (direction == 1 && Input.GetKeyDown(KeyCode.Mouse1) && isGrounded)
{
canRoll = true;
rb.AddForce(Vector2.left * rollImpulse);
}else if(direction == 2 && Input.GetKeyDown(KeyCode.Mouse1) && isGrounded)
{
canRoll = true;
rb.AddForce(Vector2.right * rollImpulse);
}
}
Sendo o "0" no comando do StateInfo o layer da sua animação.
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Qual seria a diferença entre entre o GetCurrentAnimatorClipInfo e o GetCurrentAnimatorStateInfo?MayLeone escreveu:Você pode verificar se a animação terminou fazendo o seguinte:
- Código:
private Animator anim;
private bool animationHasFinished;
void Start(){
anim = GetComponent<Animator>();
}
void Update(){
// Verifica se a animação parou:
animationHasFinished = anim.GetCurrentAnimatorStateInfo(0).IsName("Nome da animação");
}
E então no seu if você pode colocar assim:
- Código:
if (animationHasFinished){
if (direction == 1 && Input.GetKeyDown(KeyCode.Mouse1) && isGrounded)
{
canRoll = true;
rb.AddForce(Vector2.left * rollImpulse);
}else if(direction == 2 && Input.GetKeyDown(KeyCode.Mouse1) && isGrounded)
{
canRoll = true;
rb.AddForce(Vector2.right * rollImpulse);
}
}
Sendo o "0" no comando do StateInfo o layer da sua animação.
Hamassfall- Avançado
- PONTOS : 1881
REPUTAÇÃO : 7
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Isso não ta funcionando pq a animação nem chega a rodar por estar dentro dessa condição, a animação só roda quando a bool canRoll é true, e a canRoll nunca fica true por estar dentro da condiçãoHamassfall escreveu:Qual seria a diferença entre entre o GetCurrentAnimatorClipInfo e o GetCurrentAnimatorStateInfo?MayLeone escreveu:Você pode verificar se a animação terminou fazendo o seguinte:
- Código:
private Animator anim;
private bool animationHasFinished;
void Start(){
anim = GetComponent<Animator>();
}
void Update(){
// Verifica se a animação parou:
animationHasFinished = anim.GetCurrentAnimatorStateInfo(0).IsName("Nome da animação");
}
E então no seu if você pode colocar assim:
- Código:
if (animationHasFinished){
if (direction == 1 && Input.GetKeyDown(KeyCode.Mouse1) && isGrounded)
{
canRoll = true;
rb.AddForce(Vector2.left * rollImpulse);
}else if(direction == 2 && Input.GetKeyDown(KeyCode.Mouse1) && isGrounded)
{
canRoll = true;
rb.AddForce(Vector2.right * rollImpulse);
}
}
Sendo o "0" no comando do StateInfo o layer da sua animação.
Hamassfall- Avançado
- PONTOS : 1881
REPUTAÇÃO : 7
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Hmmmm...
Tente simplificar assim:
Tente simplificar assim:
- Código:
var dir = direction == 1 ? Vector2.left : Vector2.right;
if(Input.GetKeyDown(KeyCode.Mouse1) && isGrounded){
canRoll = true;
if(animationHasFinished)
rb.AddForce(dir*rollImpulse);
}
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Hamassfall escreveu:Eu estou tentando fazer o personagem rolar apenas após a animação de rolagem acabar, mas como o script está agora, o impulso da rolagem acontece toda a vez q eu aperto o botão, não importa se eu estou no meio da animação ou no fim. Como eu faço para resolver isso?(A função está sendo chamada na Update):
Foi mal pela intromissão, mas não seria mais viável usar um animation event na animação setando a bool? Por exemplo, no início da animação seta canRoll como falso, e no final da animação como verdadeiro.
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Não é intromissão de forma alguma, realmente outra alternativa seria gerenciar a variável através de events key no animator também.
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
O problema é q fazendo dessa forma toda a vez q eu apertar o botão ele vai dar o impulso, não importando se a animação ainda está ocorrendo, eu preciso de um jeito q o impulso não funcione se a animação estiver ocorrendoartplayer escreveu:Hamassfall escreveu:Eu estou tentando fazer o personagem rolar apenas após a animação de rolagem acabar, mas como o script está agora, o impulso da rolagem acontece toda a vez q eu aperto o botão, não importa se eu estou no meio da animação ou no fim. Como eu faço para resolver isso?(A função está sendo chamada na Update):
Foi mal pela intromissão, mas não seria mais viável usar um animation event na animação setando a bool? Por exemplo, no início da animação seta canRoll como falso, e no final da animação como verdadeiro.
Hamassfall- Avançado
- PONTOS : 1881
REPUTAÇÃO : 7
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
A sugestão que eu dei não funcionou?Hamassfall escreveu:O problema é q fazendo dessa forma toda a vez q eu apertar o botão ele vai dar o impulso, não importando se a animação ainda está ocorrendo, eu preciso de um jeito q o impulso não funcione se a animação estiver ocorrendoartplayer escreveu:Hamassfall escreveu:Eu estou tentando fazer o personagem rolar apenas após a animação de rolagem acabar, mas como o script está agora, o impulso da rolagem acontece toda a vez q eu aperto o botão, não importa se eu estou no meio da animação ou no fim. Como eu faço para resolver isso?(A função está sendo chamada na Update):
Foi mal pela intromissão, mas não seria mais viável usar um animation event na animação setando a bool? Por exemplo, no início da animação seta canRoll como falso, e no final da animação como verdadeiro.
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Não :( , eu continuo conseguindo dar o impulso enquanto a animação ta rolandoMayLeone escreveu:A sugestão que eu dei não funcionou?Hamassfall escreveu:O problema é q fazendo dessa forma toda a vez q eu apertar o botão ele vai dar o impulso, não importando se a animação ainda está ocorrendo, eu preciso de um jeito q o impulso não funcione se a animação estiver ocorrendoartplayer escreveu:Hamassfall escreveu:Eu estou tentando fazer o personagem rolar apenas após a animação de rolagem acabar, mas como o script está agora, o impulso da rolagem acontece toda a vez q eu aperto o botão, não importa se eu estou no meio da animação ou no fim. Como eu faço para resolver isso?(A função está sendo chamada na Update):
Foi mal pela intromissão, mas não seria mais viável usar um animation event na animação setando a bool? Por exemplo, no início da animação seta canRoll como falso, e no final da animação como verdadeiro.
Hamassfall- Avançado
- PONTOS : 1881
REPUTAÇÃO : 7
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Faz assim, coloca no seu script esse método:
Crie a variável canImpulse e inicie ela em true.
Agora na parte que permite dar o impulso coloca assim:
Abra o animator do objeto e logo no primeiro frame da animação, acima da linha do tempo clique com o lado direito do mouse e vá em "Add Event Key", selecione o seu script e o método "AllowImpulse" passando como valor false, ou seja, agora não pode dar impulso porque a animação começou.
Já no último frame da animação crie um novo Event Key com esse método e agora passe o valor true, ou seja, agora pode dar impulso porque a animação acabou.
- Código:
public void AllowImpulse(bool theValue){
canImpulse = theValue;
}
Crie a variável canImpulse e inicie ela em true.
Agora na parte que permite dar o impulso coloca assim:
- Código:
if(canImpulse)
rb.AddForce(dir*rollImpulse)
Abra o animator do objeto e logo no primeiro frame da animação, acima da linha do tempo clique com o lado direito do mouse e vá em "Add Event Key", selecione o seu script e o método "AllowImpulse" passando como valor false, ou seja, agora não pode dar impulso porque a animação começou.
Já no último frame da animação crie um novo Event Key com esse método e agora passe o valor true, ou seja, agora pode dar impulso porque a animação acabou.
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Por algum motivo as minhas funções privadas estão aparecendo na hora de selecionar a função no evento , mas a função publica AllowImpulse não e não adianta mudar ela para private q ela continua não aparecendo.Isso não faz sentido nenhum, certo?MayLeone escreveu:Faz assim, coloca no seu script esse método:
- Código:
public void AllowImpulse(bool theValue){
canImpulse = theValue;
}
Crie a variável canImpulse e inicie ela em true.
Agora na parte que permite dar o impulso coloca assim:
- Código:
if(canImpulse)
rb.AddForce(dir*rollImpulse)
Abra o animator do objeto e logo no primeiro frame da animação, acima da linha do tempo clique com o lado direito do mouse e vá em "Add Event Key", selecione o seu script e o método "AllowImpulse" passando como valor false, ou seja, agora não pode dar impulso porque a animação começou.
Já no último frame da animação crie um novo Event Key com esse método e agora passe o valor true, ou seja, agora pode dar impulso porque a animação acabou.
Hamassfall- Avançado
- PONTOS : 1881
REPUTAÇÃO : 7
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Acabei de perceber q se a função não tiver um parametro ela aparece normalmente, mas quando eu passo um parametro para ela, o inspector aponta q a função não é suportada(Function Not Supported). É realmente possivel passar um parametro para uma função e adiciona-la em um evento?Hamassfall escreveu:Por algum motivo as minhas funções privadas estão aparecendo na hora de selecionar a função no evento , mas a função publica AllowImpulse não e não adianta mudar ela para private q ela continua não aparecendo.Isso não faz sentido nenhum, certo?MayLeone escreveu:Faz assim, coloca no seu script esse método:
- Código:
public void AllowImpulse(bool theValue){
canImpulse = theValue;
}
Crie a variável canImpulse e inicie ela em true.
Agora na parte que permite dar o impulso coloca assim:
- Código:
if(canImpulse)
rb.AddForce(dir*rollImpulse)
Abra o animator do objeto e logo no primeiro frame da animação, acima da linha do tempo clique com o lado direito do mouse e vá em "Add Event Key", selecione o seu script e o método "AllowImpulse" passando como valor false, ou seja, agora não pode dar impulso porque a animação começou.
Já no último frame da animação crie um novo Event Key com esse método e agora passe o valor true, ou seja, agora pode dar impulso porque a animação acabou.
Hamassfall- Avançado
- PONTOS : 1881
REPUTAÇÃO : 7
Respeito as regras :
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Pelo visto Event Key não aceita parâmetro booleano.
Então deixe o método assim:
E crie outro método assim:
Crie um Event Key no primeiro frame da animação chamando o DenyImpulse, e um outro Event Key no último frame chamando o AllowImpulse, creio que agora vai funcionar.
Lembre-se de declarar a variável "canImpulse" dentro da classe, não dentro da função
Então deixe o método assim:
- Código:
public void AllowImpulse (){
canImpulse = true;
}
E crie outro método assim:
- Código:
public void DenyImpulse(){
canImpulse = false;
}
Crie um Event Key no primeiro frame da animação chamando o DenyImpulse, e um outro Event Key no último frame chamando o AllowImpulse, creio que agora vai funcionar.
Lembre-se de declarar a variável "canImpulse" dentro da classe, não dentro da função
Re: [RESOLVIDO] Como fazer uma ação acontecer apenas após a animação terminar?
Está funcionando, muito obrigado!!!MayLeone escreveu:Pelo visto Event Key não aceita parâmetro booleano.
Então deixe o método assim:
- Código:
public void AllowImpulse (){
canImpulse = true;
}
E crie outro método assim:
- Código:
public void DenyImpulse(){
canImpulse = false;
}
Crie um Event Key no primeiro frame da animação chamando o DenyImpulse, e um outro Event Key no último frame chamando o AllowImpulse, creio que agora vai funcionar.
Lembre-se de declarar a variável "canImpulse" dentro da classe, não dentro da função
Hamassfall- Avançado
- PONTOS : 1881
REPUTAÇÃO : 7
Respeito as regras :
Tópicos semelhantes
» Como faço para apos uma animação acabar, executar outra ação C#
» Ação acontecer apos algum tempo
» Quero fazer um sistema de apertar uma tecla e ativar uma ação ou animação, como faço?
» Destruir um Objeto após terminar a Animação
» Como posso Executar uma ação apenas uma vez no Update?
» Ação acontecer apos algum tempo
» Quero fazer um sistema de apertar uma tecla e ativar uma ação ou animação, como faço?
» Destruir um Objeto após terminar a Animação
» Como posso Executar uma ação apenas uma vez no Update?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos