Nesta lição iremos abordar
alguns dos usos mais comuns da classe Animator.
Para uma documentação completa da classe Animator
veja o link da documentação abaixo.
De modo a afetar as transições entre os estados
de um animator controller nos precisamos configurar
os parâmetros do Animator para valores apropriados.
Para fazer isso, precisamos usar algumas
funções da classe Animator.
Aqui nós temos uma cena com o modelo de Ethan.
Ethan tem um animator component
e um script chamado Ethan Script adcionado.
O componente animator esta usando um
controller chamado EthanController.
Se abrirmos EthanController
podemos ver que existem 4 estados.
Idle, Walk, Run e Jump.
Além disso, existem dois parâmetros.
Um flutuador chamado velocidade e um
trigger chamado Jump.
O controlador é configurado para
Ethan fazer uma transição de Idle para Walk
e Run executar com base na velocidade.
Além disso, se o parâmetro Jump for habilitado
quando Ethan estiver correndo Ethan vai entrar
em um estado Jump
Todas as animações do modelo Ethan
são controlados por estes dois parâmetros,
que vamos aprender a controlar
com nosso script de Ethan.
Dentro do Ethan Script primeiro nos temos que criar
uma variável animator chamada anim
para conter o nosso objeto animator.
Nós teremos uma referência a este objeto animator
no método start escrevendo
anim = getComponent <Animator>
Para obter mais detalhes sobre a função getComponent
veja a lição no link abaixo.
O nosso animator controller está configurado
para que o parametro speed diga
que a animação de movimento está reproduzindo.
Podemos usar o input do jogador
para controlar este comportamento.
A primeira coisa que precisamos fazer é
criar uma variável float chamada Move
no método update
Depois, vamos definir a variável Move
para ser igual ao eixo vertical de entrada
escrevendo Input.GetAxis
e entre parênteses nós vamos passar a string Vertical.
O que se segue é que queremos passar
o valor da variável Move ao
atributo Speed do animator controller.
Isto é feito com a função setFloat
da classe Animator.
Estamos usando setFloat ja que Speed
É um parâmetro float.
Se tivesse dado um parâmetro Booleano
se tivéssemos usado SetBool.
Se tivesse sido um parâmetro trigger tinhamos
utilizado SetTrigger e assim
Para cada uma destas funções
várias maneiras que podem ser chamados.
A forma mais comum é primeiro passar
o nome do parâmetro que está ajustando
como uma string.
Em seguida, o próximo elemento é o valor
que você deseja que o parámetro seja.
Neste caso, vamos chamar o
método SetFloat de nossa variável animator, digitando
anim.SetFloat
e, em seguida, em parênteses a string Speed
e nossa variável Move.
Devolta ao Unity podemos executar nossa cena.
Podemos ver que, se pressionar a tecla W
ou a seta para cima, o nosso modelo agora se move.
O parâmetro Speed e a animação de
movimento reproduzido agora é controlado pelo jogador.
Passe um nome string
para o parâmetro que desejamos pode ser ineficiente
já que significa que o animator precisa
avaliar a string de cada vez que é chamado.
A maneira mais rápida para definir os valores dos parâmetros
é utilizar hashIDs.
Cada string que o animator pode usar é
dado em um hashID.
Este é um valor inteiro que é único
para cada string diferente.
Podemos armazenar este valor e, em seguida,
definir os parâmetros usando esta ID em seu lugar.
Para fazer isso, primeiro precisamos
armazenar o valor.
vamos criar uma variável inteira chamada jumphash
para armazenar o Hashid.
Obtemos o valor para a nossa variável de hash
chamando o método estático do animator class
string to hash.
Como esse método é estático, podemos acessá-lo
escrevendo Animator.StringToHash.
Em parênteses passamos a string
que queremos saber o seu valor HashID:
A fim de fazer com que o nosso modelo salte
precisamos definir o parâmetro de Jump
do tipo trigger no animator controller.
No nosso caso, queremos fazer que o modelo salte
quando a barra de espaço é pressionado.
Então começamos escrevendo
if Input.GetKeyDown e, em seguida, entre parênteses
usaremos KeyCode.Space.
Dentro da nossa declaração if nós
estabeleceremos o parâmetro Jump do tipo trigger usando
o método anim.SetTrigger.
Dentro de parênteses e vamos ao
jumpHash passar nossa variável.
Lembre-se que esta variável contém o
hasID do nosso parâmetro Jump.
Note que Jump é um trigger
não temos de também passar esse valor.
Devolta ao Unity podemos executar nossa cena.
Note que quando estamos correndo também podemos
apertar a tecla de espaço para pular
Agora nós utilizamos ambos
parâmetros Speed do tipo float e
Jump do tipo trigger para fazer que nosso modelo
seja mais dinâmico.
Ocasionalmente, quando esta se escrevendo a lógica
por trás da animação nós queremos
encontrar em que estado o controller está.
Digamos por exemplo que nós queremos ser capazes
de ativar o trigger Jump quando o modelo
estiver no estado Run.
O animator tem algumas funções que podemos chamar
para encontrar em que estado o controller
está atualmente.
Nós podemos fazer isso criando
uma variavel animator state info
que chamaremos de StateInfo.
A classe animator state info
armazena o nome, nome hash,
e varias outras peças de informação
de estado.
Nós estabelecemos nossa variavel state info
igual a função anim.GetCurrentAnimatorStateInfo.
Dentro do parêntesis nós vamos passar o indice
do layer que queremos saber mais sobre.
dado que se trata da base layer
nós vamos colocar em 0.
Novamente nós podemos comparar o nome dos
estados de maquina atuais com o string
porque ja que é mais eficiente comparar
hashIDs faremos isso melhor.
Nós começaremos criando um inteiro chamado
runStateHash e configurando a que seja igual a nossa
função Animator.StringToHash.
Nós vamos passar em parentesis
o string base layer .Run
nós temos que incluir a base layer.part
já que podemos ter estados com o mesmo nome
em diferentes layers.
Agora nós podemos modificar nossa declaração if
para tambem unicamente permitir nosso modelo saltar
si stateInfo.nameHash
é igual a nossa variável runStateHash.