Usando Unity3D Animator com animação Sprite Frame-by-Frame

Padrão

Olá pessoal 😀

Primeiro deixe-me apresentá-los a esta seção! Em DevLog” vamos tentar manter uma DevLog” de nossos projetos. Isso pode incluir posts técnicos, como este, e talvez discutir ideias, técnicas etc.

Hoje eu quero falar sobre o uso do Animator do Unity (parte do Mecanim) para animações Sprite frame-by-frame, um problema que encontramos enquanto trabalhava nele e como é fácil de resolver.

Se você estiver usando Unity3D para um jogo 2D e usando o sistema de animação, continue lendo 🙂

Como você deve saber, Unity3D é, obviamente, um motor de jogo (engine) 3D, e as suas funções 2D, introduzidas na versão 4.3, são construídas em cima das 3D. Isso tem algumas vantagens e desvantagens, e o processo de animação não é exceção.

Desde a introdução do Mecanim, Unity ganhou um grande conjunto de ferramentas de animação em 3D por bones, permitindo misturar camadas de animações e muito mais. O fluxo de trabalho básico é: você cria uma animação para um asset, Unity criará automaticamente um Animator Controller para ele e cada Animation será uma máquina de estado, então você criar transições entre esses estados com as condições desejadas (float, bool, trigger e int). Há também um recurso de Blend Tree, onde o Unity permite misturar várias animações com base em um float.

Isso funciona bem para animações 3D por bones, mas para 2D frame-by-frame, se você não prestar atenção, você pode acabar com algo parecido com isto:

Animator feito errado!

Animator feito errado!

Por favor, não olhe muito para essa teia ou você poderá ficar louco!

Como você pode ver, na minha primeira abordagem ingênua, eu simplesmente criei um State para cada Animation e depois conseguiu de alguma forma criar as transições necessárias, muitas vezes faltando algumas transições ou criando desnecessárias.

Então, como tornar isso administrável? A resposta é simples: usando Sub-State Machines e Blend Trees!
Para animações frame-by-frame em 2D? Sim!

No começo eu pensei que esses recursos não iriam funcionar bem para animações frame-by-frame, mas eu estava obviamente errado.

Em primeiro lugar, Sub-State Machines. O nome pode dar a impressão errada, mas eles simplesmente são pastas, para ajudá-lo a organizar e separar State Machines em grupos e subgrupos. Aqui está o meu grupo Jump:

Jump Animator Sub-State

Jump Animator Sub-State

É realmente fácil de usar. Apenas clique com o botão direito do mouse, crie um Sub-State Machine, renomeie-o, clique duas vezes nele para entrar e agora crie os estados para esse grupo. Quando você precisa fazer a transição de um estado dentro deste grupo a um estado fora dele, basta ligar a transição para o estado (Up), então o Unity vai lhe dar um drop-down para escolher para onde essa transição vai. Se você tem outros sub-estados, o Unity vai separá-los em sub-menus, como você pode ver:

Sub-State Transition to Up layer

Transição de Sub-State para layer acima

Apenas usando Sub-State Machines pode ajudar muito, mas eles só vão separar seus estados em grupos. Mas há uma opção que pode realmente reduzir estados, que é a Blend Tree:

Jump Aim Blend Tree

Jump Aim Blend Tree

A Blend Tree automatically transitions between states for you based on a float parameter. You insert the “Motions” (Animations) and their Threshold, or at what value of the parameter this Animation will be active. By having more than one parameter, you can adjust the threshold values and Unity will automatically “blend” these motions. In Bone animations, the weights will be smoothly altered, but in this case, the chosen animation will change driven by the parameter:

Uma Blend Tree muda automaticamente entre estados para você com base em um parâmetro float. Você insere as “Motions” (Animations) e seu Threshold, ou em que valor do parâmetro esta animação estará ativa. Tendo mais de uma animação, você pode ajustar os valores de Threshold e o Unity irá automaticamente misturar” estes movimentos. Em animações por bones, os pesos serão alterados sem problemas, mas neste caso, a animação escolhida irá alterar de acordo com o parâmetro:

Blend Tree Parameters

Parâmetros do Blend Tree

Blend Trees podem liberar um monte de espaço em seu Animator, além de serem menos propensos a erros. Na janela do Animator eles aparecerão como um simples State, como você pode ver na imagem Jump Animator (tanto Jump Aim e Jump Shoot são Blend Trees com dois estados cada).

Aqui eu estou usando Blend Trees para fazer a transição entre as animações “Diagonal” e Upward”, através de um valor de ângulo, mas Blend Trees podem ir muito mais longe e podem até mesmo ser conduzidos por dois parâmetros (ver campo Blend Type).

Aqui é a versão quase final do monstro que era o Animator:

A more manageable Animator!

Um Animator mas acessível!

Ainda não é perfeito, mas é muito mais fácil ver o que está acontecendo: D

Se você teve problemas semelhantes, ou o que compartilhar alguma dica, por favor, comente!

Até a próxima vez: D

The following two tabs change content below.

Chaoseiro

Programmer at Mister Studios

Latest posts by Chaoseiro (see all)

Deixe uma resposta