Cursos / Jogos Digitais / Desenvolvimento com Motores de Jogos I / Aula
A movimentação das personagens é parte crucial de qualquer jogo. Rabin [3] diz que "um jogo é uma experiência interativa, de modo que uma das tarefas mais importantes é a de reunir os inputs (entradas de dados) do jogador e reagir de acordo com eles." Como já conversamos na apresentação, esses inputs podem vir de fontes diversas, desde as mais clássicas, como mouse, teclado e gamepad, até as mais diferentes formas de interação, como câmeras, áudio, voz e até mesmo ondas cerebrais.
Em comum entre todas essas formas de interação, no entanto, nós temos um aspecto muito importante. O input deve sempre ser preciso e instantâneo. Sabemos que ser instantâneo é fisicamente impossível para jogos eletrônicos, uma vez que há, no mínimo, o tempo de transmitir o sinal e o processar. Isso, no entanto, não é desculpa para fazermos jogos com entradas terríveis, que frustram o usuário rapidamente. Podemos (e vemos isso em jogos desde os primórdios dos jogos) trabalhar com um processamento rápido desses inputs de modo a reduzir ao máximo o lag ou delay que temos desde o botão ser apertado até algo acontecer no jogo, buscando tornar isso visivelmente instantâneo, ou seja, rápido o bastante para o nosso cérebro não perceber o problema.
Já na questão de precisão, precisamos sempre garantir que nenhuma entrada do usuário será perdida. Se o botão B é o responsável por pular e o usuário apertou o botão B, o personagem deverá pular (se as restrições do jogo permitirem ele pular no momento, claro). Caso o personagem esteja parado, pronto para pular, e isso não aconteça assim que o usuário apertar o botão, isso irá causar uma frustração no jogador e será um fator importante na quebra de imersão do usuário, podendo ser um motivo para que ele perca o interesse no jogo.
O ideal para se resolver esses dois problemas é trabalhar com uma boa taxa de atualização. Um conceito muito comum que vemos em jogos diversos e que gera muita discussão é a questão do FPS, sigla de Frames Per Second, ou Quadros por Segundo. Essa medida nos dá quantas vezes a tela está sendo atualizada a cada segundo para garantir que o usuário tenha a sensação de fluidez na imagem. Existem algumas taxas de atualização conhecidas, como o cinema, que trabalha com 24 quadros por segundo, ou os videogames que operam a 30 quadros por segundo. Monitores de 60hz utilizam uma taxa de atualização de 60 FPS. Hoje em dia, já temos os maravilhosos, lindos e perfeitos caríssimos monitores de 144hz, capazes de atualizar a tela 144 vezes a cada segundo, permitindo uma performance de 144 FPS para os jogos. Já a Realidade Virtual, por exemplo, trabalha com 90 FPS.
"E o que eu ganho com ter mais FPS/taxa de atualização?", você pode se perguntar. Você ganha em fluidez, eu te digo. "Ah, mas o olho humano só enxerga 30 fps!", você pode responder. "CONSOLE PEASANT! PC MASTER RACE!!" (link: https://pt.wikipedia.org/wiki/PC_Master_Race), direi! :P
A verdade é que quanto mais frames por segundo tivermos, mais fluida a imagem irá parecer. O olho humano não é uma máquina digital para ter uma "taxa de atualização". E isso tudo influenciará diretamente no seu Input também. Lembra que falamos que quanto menos o seu input demorar a aparecer, melhor o jogador se sentirá? Pois é! A fluidez com que o seu jogo está rodando e o momento correto da captura desse input é uma maneira importante de garantir que o usuário receberá uma resposta quase instantânea.
O ideal quando estamos trabalhando com Inputs é manter a taxa de atualização de seus comandos igual à taxa de atualização de quadros do seu jogo, pois assim poderemos garantir que cada comando dado influenciará um quadro causando uma reação quase que imediata. Se você está trabalhando com uma taxa de 30 quadros por segundo, visando sistemas com processamentos inferiores, você deverá mostrar o seu dispositivo de entrada 30 vezes por segundo também. Mais precisamente, a primeira coisa que você deverá fazer ao começar um novo quadro será receber o valor do Input para poder processá-lo adequadamente ao longo daquele quadro.
Para evitar qualquer discrepância e também lag desnecessário ao aumentar o processamento do seu jogo, é importante também que o input recebido no começo de um frame seja considerado valido por todo aquele frame, evitando qualquer alteração ou mudança por parte do usuário e também evitando ter que buscar novamente por um valor toda vez que for necessário tomar decisões baseadas no Input.
Perceba que tudo isso que estamos falando é muito importante quando se está desenvolvendo um jogo inteiro "no braço", criando cada uma de suas partes e seu loop principal inteiro. No entanto, esse conceito também é válido para motores de jogos e consequentemente para o Unity, uma vez que o Unity disponibiliza em seus scripts uma função exclusiva para que possamos adicionar etapas ao loop principal que ele mesmo é responsável por gerenciar. E aí usamos esse conhecimento adquirido para incluir em nosso loop um comando de receber os inputs! Como fazer isso?! Vejamos adiante!
Versão 5.3 - Todos os Direitos reservados