Aprendendo a programar jogos em Unity: influenciando mudanças de posicionamento geradas por animações

Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Após concluirmos, no encontro anterior, correções relacionadas ao fluxo de animações atrelado ao componente Animator de Doutor Tratanildo, aprenderemos hoje a realizar modificações na forma com que as animações aplicam mudanças nos valores do atributo Position dinamicamente, por meio da ação de scripts controladores de movimentos.Caso esta seja a primeira vez que você acessa nossa série, sinta-se especialmente convidado a nos acompanhar em uma divertida jornada de aprendizados sobre o universo do desenvolvimento de games.Por meio da elaboração de diferentes projetos práticos, estamos descobrindo formas interessantes de se utilizar a ferramenta Unity como apoio para tirarmos do papel jogos dos mais variados estilos gráficos e de gameplay.A partir do primeiro texto da série, são abordados conceitos importantes do processo de criação de um game, que envolvem desde a instalação e configuração da ferramenta em nossas máquinas até a inserção e configuração de elementos multimídia nas fases de uma aventura e a codificação de regras e comportamentos de um game.No momento, estamos avançando no desenvolvimento do projeto Consultório do Dr. Tratanildo, um jogo ambientado em um consultório médico tridimensional cujos aspectos de gameplay prestam homenagens a clássicos dos anos 1980 e 1990, tais como Dr. Mario (Nintendo) e Pac-Man (Namco).E aí, deu vontade de aprender a criar seus próprios games? Então aperte os cintos e venha conosco para seguirmos juntos em uma emocionante trilha rumo a novos conhecimentos!Ando devagar, porque já tive pressa...Durante a configuração inicial do fluxo de animações que controla os aspectos de execução da caminhada pelo cenário realizada por Doutor Tratanildo, adicionamos o parâmetro Passo_caminhada que, supostamente, serviria para controlarmos o ritmo da caminhada do médico de forma dinâmica.De fato, conforme o valor de Passo_caminhada aumenta dinamicamente (por influência de comandos adicionados ao método Update() do script ControllerMov_Tank), a animação correspondente ao estado caminhandoState é executada mais rapidamente, fazendo com que Tratanildo “aperte o passo” em seu deslocamento dentro do cenário do game:Porém, até o momento, a influência que Passo_caminhada exerce em relação ao processo de deslocamento de Tratanildo pelo consultório restringiu-se apenas ao fator de rapidez de execução de caminhandoState no fluxo de animações, e não na distância da passada que o médico aplica ao andar pelo consultório. Na prática, parece que, por mais que Tratanildo se esforce, ele demora bastante para se deslocar pelo cenário.Vamos corrigir esse comportamento, fazendo com que tenhamos, também, influências dinâmicas sobre a distância de deslocamento que a animação aplica ao GameObject do médico durante sua movimentação. Para tal, vamos abrir nosso projeto para edição: no Unity Hub, clique duas vezes sobre o item referente ao projeto Consultório do Dr. Tratanildo. Na interface inicial do editor, na aba Project, abra a pasta Assets, Scenes e, por fim, clique duas vezes no ícone da cena ConsultorioScene.Na aba Project, abra a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre o ícone do script ControllerMov_Tank para que possamos editar seu conteúdo no Visual Studio.Primeiramente, vamos relembrar como os valores concedidos a Passo_caminhada são alterados via script e, consequentemente, entender melhor seu papel atual no fluxo de animações atrelado ao componente Animator de DoutorCenario.Basicamente, dentro da estrutura de ControllerMov_Tank, as seguintes ações envolvendo Passo_caminhada são realizadas:Internamente, temos à disposição a variável velocidadeCaminhada, de tipo float e valor inicial = 0;Dentro das chaves do método void Update(), é verificado se o jogador está com a tecla “seta para cima” pressionada. A partir da verificação, uma das duas ações a seguir é tomada pelo game:Caso a tecla esteja pressionada, ao valor de velocidadeCaminhada é acrescido o dobro do valor representado por Time.deltaTime, até chegarmos ao valor máximo estipulado de velocidadeCaminhada = 2.0f.Caso a tecla não esteja sendo pressionada no momento, é concedido o valor zero à velocidadeCaminhada.Depois de realizados os cálculos, ao parâmetro Passo_caminhada da animação corrente é concedido o valor de velocidadeCaminhada.Os códigos que permitem a execução das ações descritas foram destacados em vermelho na ilustração a seguir:O resultado prático nós já conhecemos: pressionando-se a tecla “seta para cima”, em cerca de um segundo temos em cena Doutor Tratanildo caminhando pelo cenário “a todo vapor”.Para que o médico possa se movimentar mais rapidamente pelo cenário, poderíamos alterar o valor máximo estipulado de velocidadeCaminhada para um valor maior, como, por exemplo, 6.0f, assim como ilustrado a seguir:Experimente realizar essa modificação, salvando o script e voltando ao editor do Unity para simularmos a execução do jogo (indo

Mai 19, 2025 - 13:30
 0
Aprendendo a programar jogos em Unity: influenciando mudanças de posicionamento geradas por animações
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Após concluirmos, no encontro anterior, correções relacionadas ao fluxo de animações atrelado ao componente Animator de Doutor Tratanildo, aprenderemos hoje a realizar modificações na forma com que as animações aplicam mudanças nos valores do atributo Position dinamicamente, por meio da ação de scripts controladores de movimentos.

Caso esta seja a primeira vez que você acessa nossa série, sinta-se especialmente convidado a nos acompanhar em uma divertida jornada de aprendizados sobre o universo do desenvolvimento de games.

Por meio da elaboração de diferentes projetos práticos, estamos descobrindo formas interessantes de se utilizar a ferramenta Unity como apoio para tirarmos do papel jogos dos mais variados estilos gráficos e de gameplay.

A partir do primeiro texto da série, são abordados conceitos importantes do processo de criação de um game, que envolvem desde a instalação e configuração da ferramenta em nossas máquinas até a inserção e configuração de elementos multimídia nas fases de uma aventura e a codificação de regras e comportamentos de um game.

No momento, estamos avançando no desenvolvimento do projeto Consultório do Dr. Tratanildo, um jogo ambientado em um consultório médico tridimensional cujos aspectos de gameplay prestam homenagens a clássicos dos anos 1980 e 1990, tais como Dr. Mario (Nintendo) e Pac-Man (Namco).


E aí, deu vontade de aprender a criar seus próprios games? Então aperte os cintos e venha conosco para seguirmos juntos em uma emocionante trilha rumo a novos conhecimentos!

Ando devagar, porque já tive pressa...

Durante a configuração inicial do fluxo de animações que controla os aspectos de execução da caminhada pelo cenário realizada por Doutor Tratanildo, adicionamos o parâmetro Passo_caminhada que, supostamente, serviria para controlarmos o ritmo da caminhada do médico de forma dinâmica.

De fato, conforme o valor de Passo_caminhada aumenta dinamicamente (por influência de comandos adicionados ao método Update() do script ControllerMov_Tank), a animação correspondente ao estado caminhandoState é executada mais rapidamente, fazendo com que Tratanildo “aperte o passo” em seu deslocamento dentro do cenário do game:

Porém, até o momento, a influência que Passo_caminhada exerce em relação ao processo de deslocamento de Tratanildo pelo consultório restringiu-se apenas ao fator de rapidez de execução de caminhandoState no fluxo de animações, e não na distância da passada que o médico aplica ao andar pelo consultório. Na prática, parece que, por mais que Tratanildo se esforce, ele demora bastante para se deslocar pelo cenário.

Vamos corrigir esse comportamento, fazendo com que tenhamos, também, influências dinâmicas sobre a distância de deslocamento que a animação aplica ao GameObject do médico durante sua movimentação. Para tal, vamos abrir nosso projeto para edição: no Unity Hub, clique duas vezes sobre o item referente ao projeto Consultório do Dr. Tratanildo. Na interface inicial do editor, na aba Project, abra a pasta Assets, Scenes e, por fim, clique duas vezes no ícone da cena ConsultorioScene.

Na aba Project, abra a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre o ícone do script ControllerMov_Tank para que possamos editar seu conteúdo no Visual Studio.

Primeiramente, vamos relembrar como os valores concedidos a Passo_caminhada são alterados via script e, consequentemente, entender melhor seu papel atual no fluxo de animações atrelado ao componente Animator de DoutorCenario.

Basicamente, dentro da estrutura de ControllerMov_Tank, as seguintes ações envolvendo Passo_caminhada são realizadas:
  • Internamente, temos à disposição a variável velocidadeCaminhada, de tipo float e valor inicial = 0;
  • Dentro das chaves do método void Update(), é verificado se o jogador está com a tecla “seta para cima” pressionada. A partir da verificação, uma das duas ações a seguir é tomada pelo game:
    • Caso a tecla esteja pressionada, ao valor de velocidadeCaminhada é acrescido o dobro do valor representado por Time.deltaTime, até chegarmos ao valor máximo estipulado de velocidadeCaminhada = 2.0f.
    • Caso a tecla não esteja sendo pressionada no momento, é concedido o valor zero à velocidadeCaminhada.
  • Depois de realizados os cálculos, ao parâmetro Passo_caminhada da animação corrente é concedido o valor de velocidadeCaminhada.
Os códigos que permitem a execução das ações descritas foram destacados em vermelho na ilustração a seguir:

O resultado prático nós já conhecemos: pressionando-se a tecla “seta para cima”, em cerca de um segundo temos em cena Doutor Tratanildo caminhando pelo cenário “a todo vapor”.

Para que o médico possa se movimentar mais rapidamente pelo cenário, poderíamos alterar o valor máximo estipulado de velocidadeCaminhada para um valor maior, como, por exemplo, 6.0f, assim como ilustrado a seguir:

Experimente realizar essa modificação, salvando o script e voltando ao editor do Unity para simularmos a execução do jogo (indo à aba Game e pressionando o ícone do botão Play):

De fato, agora o médico chega mais rapidamente às extremidades do cenário, porém, com essa abordagem, perde-se totalmente a naturalidade dos movimentos da animação realizada, parecendo até que Doutor Tratanildo está correndo uma maratona no consultório, mas sem se refletir na movimentação esperada pelo nível de esforço físico despendido.

Sendo assim, interrompa a simulação da execução, pressionando novamente o ícone do botão Play. Volte à janela do Visual Studio e, com o script ControllerMov_Tank em evidência, volte a conceder 2.0f como valor máximo estipulado para velocidadeCaminhada:

Movimentações realizadas por animações

Animações aplicáveis a modelos tridimensionais podem modificar diferentes parâmetros de posicionamento e rotação em objeto, não apenas relacionados aos entes que compõem o modelo (por exemplo, os braços, as pernas e a cabeça de um personagem 3D) mas, também, envolvendo o posicionamento do objeto no espaço em que estão inseridos.

Em nossos projetos baseados em Unity, nós já trabalhamos diversas vezes com posicionamento e rotação de GameObjects por meio de modificações nos valores dos atributos Position e Rotation de seus componentes Transform. Internamente, as animações que aplicam movimentações ao posicionamento de objetos também modificam os valores desses atributos, sendo essas modificações calculadas internamente pelo motor de animações do Unity.

Existem formas de realizarmos intervenções sobre esses valores de movimentação e rotação calculados sem termos que “tomar as rédeas” completamente do processo de movimentação dos personagens, sendo uma delas por intermédio da ação do método OnAnimatorMove(). Implementado via script, esse método é acionado a cada vez que houver movimentações do GameObject realizadas por intermédio da ação de uma animação.

Na janela do Visual Studio, com o script ControllerMov_Tank em evidência, antes da declaração do método void Update(), insira o seguinte trecho de código:

    private void OnAnimatorMove()
    {

    }

Salve o script e minimize o Visual Studio. Volte ao editor do Unity e experimente a simulação da execução do jogo, indo à aba Game e pressionando o ícone do botão Play:

Ao declararmos a função OnAnimatorMove() dentro de nosso script, já informamos ao Unity que realizaremos intervenções na forma com que seu motor de animações está aplicando movimentações ao objeto com o script atrelado a si. Dessa forma, é interrompida a aplicação automática de movimentações ao GameObject por intermédio da animação executada.

Interrompa a simulação da execução e volte ao Visual Studio. Dentro das chaves de OnAnimatorMove(), introduza as seguintes linhas de código:

        transform.position += personagemAnim.deltaPosition;
        transform.rotation = personagemAnim.deltaRotation * transform.rotation;


Mesmo sem a aplicação automática das alterações em relação ao posicionamento e à rotação do objeto, o Unity continua a calcular internamente qual seria o deslocamento aplicável por intermédio da animação. Esses valores calculados são armazenados nas propriedades deltaPosition e deltaRotation de um Animator, respectivamente.

Ao adicionarmos as linhas de código, estamos aplicando aos valores de posição e rotação do objeto as alterações dos valores calculadas pelo motor de animações do Unity. Embora, em nosso caso concreto, a rotação de Doutor Tratanildo seja controlada exclusivamente via script, podemos manter também a linha de código correspondente à aplicação da rotação calculada, sem prejuízo ao que já implementamos anteriormente.

Na prática, é como se ligássemos novamente a aplicação automática das variações de posicionamento e rotação por intermédio da animação, como podemos ver pela simulação de execução exibida a seguir:

Talvez você deva estar se perguntando o porquê de termos criado uma nova estrutura de código para, na prática, mantermos o mesmo comportamento de deslocamento observado inicialmente. A surpreendente resposta a este questionamento está no fato de que, com o código “exposto”, podemos aplicar, agora, um fator de alteração aos valores de movimentação previstos. Esse fator será baseado no valor de velocidadeCaminhada, fazendo com que o acréscimo na “distância de passada” tenha correspondência com a velocidade da animação do doutor caminhando pelo cenário.

Para tal, vamos alterar a seguinte linha de código recém-introduzida no script. Modifique seu conteúdo de:

transform.position += personagemAnim.deltaPosition;

Para:

transform.position += personagemAnim.deltaPosition * velocidadeCaminhada;

Salve o script e feche o Visual Studio. Volte ao editor do Unity e realize nova simulação de execução do jogo. Garanto que você irá se surpreender positivamente!

Interrompa a simulação, clicando novamente sobre o ícone do botão Play. Não se esqueça de salvar a cena (menu File, opção Save) e o projeto (menu File, opção Save Project) antes de fechar o editor.

Próximos passos

As intervenções que aprendemos hoje são especialmente úteis não apenas para o caso concreto de Doutor Tratanildo em seu consultório, mas, também, em diferentes situações em que haja a necessidade de se realizar alterações em aspectos de movimentações e de rotações realizadas por animações sem que precisemos codificar manualmente posições e rotações de objetos para cada quadro da animação, o que seria um pesadelo para o programador, sobretudo para animações longas ou mais complexas.

Nos próximos encontros seguiremos com o processo de implementação das funcionalidades do game, realizando ocasionalmente correções para bugs eventualmente observados durante a construção de nossa aventura.

Nosso próximo encontro será no dia 25 de maio. Até mais! Fique sempre ligado nas novidades do GameBlast!

Revisão: Ives Boitano