Implemente uma animação de caminhada para um personagem de sprite de 4 vias
Ambiente de verificação
- Windows
-
- Janelas 11
- Unity Editor
-
- 25.3.2020F1
- Pacotes do sistema de entrada
-
- 1.2.0
Pré-requisitos para esta dica
As configurações a seguir são pré-configuradas como um pré-requisito para a explicação dessas dicas.
Site de referência
Elaboração de gráficos de caminhada
Em primeiro lugar, a animação de caminhada é alcançada alternando constantemente entre várias imagens para fazer parecer que você está andando. Portanto, é necessário preparar quantas imagens forem necessárias para mostrar a direção do movimento e da caminhada.
Para conseguir a animação de caminhada mais simples, é comum preparar a imagem a seguir. Esse padrão também é usado em muitos RPGs.
Em primeiro lugar, ele é dividido em quatro linhas acima e abaixo, mas mostra a direção que você enfrentará quando caminhar. De cima, é "para baixo, esquerda, direita, para cima".
E para a esquerda e a direita, será um movimento de caminhada nessa direção. O fluxo geral é "meio, esquerda, meio, direita, meio...".
O tamanho de uma célula do caractere preparado desta vez é 32x32px. Uma vez que é preparado para quadrados 3x4, o tamanho real do arquivo de imagem é 96x128px. A propósito, não há limite para o tamanho de um caractere, então 32x48px ou 64x64px também é possível.
* A imagem preparada desta vez é Iwamaru-kun, que fiz há muito tempo. Você pode usá-lo como uma verificação de comportamento.
Criar um projeto e preparar imagens
No exemplo que criaremos desta vez, assumiremos que você pode colocar um caractere e movê-lo com as teclas do cursor no teclado.
O primeiro passo é criar um novo projeto 2D. Adicione a imagem do personagem que você preparou para o seu projeto.
Selecione a imagem que você acabou de adicionar e defina as seguintes configurações no inspetor:
do nome do itemComentários do valor | ||
---|---|---|
Tipo de textura | Sprite | |
Modo Sprite | plural | |
Número de pixels por unidade | 32 | Afeta o tamanho quando colocado em exibição |
Tipo de malha | Retângulo Completo | |
Modo de filtro | ponto | Se necessário |
compressão | sem | Se necessário |
Após a configuração, clique no botão "Aplicar" na parte inferior.
Em seguida, divida a imagem para que você possa alternar entre elas no Unity. Há um botão "Sprite Editor" no inspetor, então clique nele.
Quando a caixa de diálogo Sprite Editor aparecer, clique no menu suspenso "Fatia", defina o "Tipo" como "Grade por tamanho de célula", Insira um tamanho de pixel de 32 (dependendo do tamanho do seu personagem) e clique no botão Fatia.
Em seguida, a imagem será dividida pelo tamanho especificado. Se estiver confuso, pressione a tecla Ctrl para ver uma linha divisória.
Após a divisão, clique no botão "Aplicar" para fechá-lo.
Se você clicar no botão direito do círculo do arquivo de imagem no projeto para expandi-lo, poderá ver que a imagem está dividida.
Criando dados de animação
Solte a imagem criada na seção anterior no modo de exibição.
Em seguida, em vez de adicionar a imagem, uma caixa de diálogo de salvamento será exibida. Isso salvará as configurações de animação, portanto, por enquanto, salve-o como "< nome da imagem >Animation.anim".
Isso criará dois arquivos no projeto, com a imagem dividida na exibição e a imagem posterior na exibição.
Aliás, se você rodar o jogo nesse estado, acho que o personagem vai animar por conta própria. Este é um estado em que 12 imagens são alternadas e exibidas a qualquer momento.
Se o jogo estiver em execução, encerre-o e selecione a guia Animações. Caso contrário, selecione "Window -> Animation -> Animation" no menu.
Você selecionou o objeto criado na hierarquia (neste caso, Iwamaru_0).
Já existe uma animação gerada automaticamente, mas eu não preciso dela, então vou excluí-la mais tarde. Há um drop-down chamado "IwamaruAnimation" que eu nomeei desta vez, então clique nele e selecione "Criar novo clipe".
Em seguida, a caixa de diálogo Salvar aparecerá. Como vamos criar uma animação do movimento down, vamos deixá-lo como "Iwamaru Down".
Selecione "Iwamaru_0" na hierarquia e altere a animação para "IwamaruDown".
Desta vez, vamos repetir a animação em "esquerda, meio, direita, meio", então vamos definir o número de amostras para 4. Em seguida, a linha do tempo à direita será dividida em 4 partes.
Solte a Iwamaru_0, a imagem no canto superior esquerdo do projeto, em 0,0 na linha do tempo da animação.
Em seguida, solte o "Iwamaru_1" na imagem do meio acima para 0,1 e 0,3.
Finalmente, solte o "Iwamaru_2" na imagem superior direita para 0,2.
Quando terminar, clique no botão de reprodução. Você pode ver que o personagem na vista está andando e animando. (Esta imagem de exemplo é um pouco difícil de entender, mas...)
Siga as mesmas etapas para criar animações à esquerda, à direita e superiores.
Imagem deconfiguração do | nome do arquivo de animação |
---|---|
IwamaruDown | Iwamaru_0, Iwamaru_1, Iwamaru_2 Iwamaru_1 |
IwamaruEsquerda | Iwamaru_3, Iwamaru_4, Iwamaru_5 Iwamaru_4 |
IwamaruDireito | Iwamaru_6, Iwamaru_7, Iwamaru_8 Iwamaru_7 |
IwamaruUp | Iwamaru_9, Iwamaru_10, Iwamaru_11 Iwamaru_10 |
O resultado final deve ser semelhante ao da imagem abaixo.
Certifique-se de que cada direção anima corretamente.
Configurações de transição de animação
Em seguida, clique duas vezes em "Iwamaru_0.controller" do projeto para abri-lo.
Em seguida, a guia Animador será aberta e você verá uma tela como a mostrada na figura. Isso porque a animação que você acabou de criar é ". controlador".
Clique com o botão direito do mouse em um espaço vazio e selecione Criar estado -> Da nova árvore de amigos.
Uma nova "Blend Tree" será criada, clique com o botão direito do mouse sobre ela e selecione "Set Layer as Default State".
A Entrada examinará a Blend Tree. Isso significa que, quando a animação se mover, a Blend Tree será a primeira coisa a se mover.
Vamos configurar animações no Blend Tree, então excluiremos todas as animações existentes.
Há uma guia "Parâmetros" à esquerda, então selecione-a e adicione "Float" no botão +.
Como existem dois parâmetros, eles são chamados de "X" e "Y", respectivamente.
Clique duas vezes na Blend Tree.
Selecione a Blend Tree que aparece.
No Inspetor, altere o tipo de mesclagem para 2D Simple Dictional.
Defina os parâmetros como "x" e "y".
No botão + em Movimento, selecione Adicionar Campo de Movimento 4 vezes.
O valor inicial pode ser diferente, mas deve se parecer com a figura.
Para os quatro itens de movimento que adicionamos, definiremos os .anims superior, inferior, esquerdo e direito no projeto.
Em seguida, especifique qual direção cada animação deve mover.
Direção | X | Y |
---|---|---|
debaixo | 0 | -1 |
Início | 0 | 1 |
Esquerda | -1 | 0 |
Direita | 1 | 0 |
Isso conclui a configuração da animação.
Finalmente, você pode excluir o arquivo de animação gerado automaticamente porque não precisa dele.
Controle de movimento
O movimento é feito pressionando uma tecla no teclado, para que você possa criar um script para controlá-lo. Desta vez, o roteiro será anexado ao personagem, então vamos deixá-lo como "CharacterMove".
O script tem a seguinte aparência:
using UnityEngine;
using UnityEngine.InputSystem;
public class CharacterMove : MonoBehaviour
{
// あらかじめ Animator コンポーネントを持っておくようにする
private Animator _animator;
// 最初のフレーム更新の前に開始が呼び出されます
void Start()
{
// オブジェクトに紐付いている Animator を取得する
_animator = GetComponent<Animator>();
// 最初の向き (下) を設定する
_animator.SetFloat("X", 0);
_animator.SetFloat("Y", -1);
}
<summary>一定時間ごとに呼ばれるメソッドです。</summary>
void FixedUpdate()
{
// キーボードの入力方向を取得
var move = GetMove();
if (move != Vector2.zero)
{
// 入力されている場合はアニメーターに方向を設定
_animator.SetFloat("X", move.x);
_animator.SetFloat("Y", move.y);
// 入力した方向に移動
transform.Translate(move * 0.2f);
}
}
<summary>キーボード入力による移動方向を取得します。</summary>
<returns>キーボード入力による移動方向。</returns>
private Vector2 GetMove()
{
Vector2 move = Vector2.zero;
if (Keyboard.current.upArrowKey.isPressed)
{
move += new Vector2(0, 1);
}
if (Keyboard.current.downArrowKey.isPressed)
{
move += new Vector2(0, -1);
}
if (Keyboard.current.leftArrowKey.isPressed)
{
move += new Vector2(-1, 0);
}
if (Keyboard.current.rightArrowKey.isPressed)
{
move += new Vector2(1, 0);
}
// 入力した値がある場合は正規化して返す
return move == Vector2.zero ? move : move.normalized;
}
}
A seguir, uma explicação de cada parte.
// あらかじめ Animator コンポーネントを持っておくようにする
private Animator _animator;
// 最初のフレーム更新の前に開始が呼び出されます
void Start()
{
// オブジェクトに紐付いている Animator を取得する
_animator = GetComponent<Animator>();
// 最初の向き (下) を設定する
_animator.SetFloat("X", 0);
_animator.SetFloat("Y", -1);
}
Start
Primeiro, obtenha o Animator
componente no método. Update
Isso será usado no , então tenha com antecedência.
Animator.SetFloat
O método pode definir um valor para o nome do parâmetro especificado.
Nas configurações de animação, definimos qual animação usar de acordo com os valores X e Y.
Se você definir a direção dos parâmetros X e Y, a animação será executada nessa direção.
No estado inicial, queremos ficar virados para baixo, então especificamos (X: 0, Y: -1).
A propósito, observe que os nomes de parâmetros diferenciam maiúsculas de minúsculas.
<summary>一定時間ごとに呼ばれるメソッドです。</summary>
void FixedUpdate()
{
// キーボードの入力方向を取得
var move = GetMove();
if (move != Vector2.zero)
{
// 入力されている場合はアニメーターに方向を設定
_animator.SetFloat("X", move.x);
_animator.SetFloat("Y", move.y);
// 入力した方向に移動
transform.Translate(move * 0.2f);
}
}
FixedUpdate
No método, verificamos periodicamente o status de entrada do teclado e o processamos quando há entrada.
GetMove
O método é projetado para retornar direções como as entradas do teclado.
O conteúdo de processamento é baseado no que está descrito em Dicas de entrada do teclado, então vou omiti-lo.
Quando houver entrada de teclado, Animator.SetFloat
defina a direção para o método. Isso permite a animação na direção em que você se moveu.
transform.Translate
Depois disso, estamos movendo o objeto com o método.
Depois de criar o script, anexe-o ao objeto de caractere.
execução
Isso completa todo o processo. Tente executar o jogo e pressionar as teclas do cursor no teclado para movê-lo. Se o personagem se mover na direção que você pressionou, e a animação de caminhada se mover enquanto o gráfico muda de direção para a direção que você está enfrentando, você está pronto.