Ponto V!

Home Unity Programando Gameplay - Parte #2
Bruno Xavier
Programando Gameplay - Parte #2Imprimir
Escrito por Bruno Xavier

Olá! Falamos anteriormente sobre 'Ray Casts' e sua utilidade em forjar jogabilidade ao trabalhar em Unity. Como ray casts são naturalmente ligados ao sistema físico em um motor de jogos como Unity, hoje vamos falar sobre as peculiaridades desse sistema em particular:


 

physx

PhysX

A grande complexidade da física e seus cálculos matemáticos em motores de jogos são, hoje em dia, automatizados por bibliotecas de software pré-programadas para resolver os diversos problemas de simulação física.

Em nosso caso, a biblioteca que nos convém é chamada de 'PhysX', disponibilizada e largamente suportada pela produtora de sistemas gráficos NVIDIA.

Isso significa que, infelizmente você não aprenderá aqui nenhum fundamento matemático sobre física em si, pois a biblioteca existe para privar-nos desta necessidade; Mas devo lembrar que há uma ótima sessão matemática aqui no PontoV com ótimos artigos do Professor e Desenvolvedor Sr. Vinícius Godoy de Mendonça.

Nos dias de hoje com sistemas tão elaborados como PhysX, presentes em todos os Consoles, PCs e qualquer outro dispositivo com um microchip de aceleração gráfica 3D fica difícil sequer pensar em construir um sistema do zero que não seja por motivação apenas educacional, então focaremos aqui muito mais em “comos” do que “porquês”, sempre seguindo a filosofia da Unity em facilitar e democratizar o desenvolvimento de jogos.

Vale também notar que, por mais realista que o resultado possa parecer, nenhum sistema de simulação física é realmente preciso se comparado a complexidade da física no mundo real.

Não que pesquisadores sejam incapazes, apenas é a natureza dos sistemas computadorizados... Existem  limites para a precisão de frações numéricas e a quantidade de valores que podem ser calculados a cada frame e esses limites são simplesmente muito curtos para uma representação em larga escala desses cálculos com 100% de fidelidade. Por mais absurdo que pareça, ainda hoje é comum fisicistas trabalharem com cálculos físicos de larga escala á mão porquê computadores geram resultados imprecisos, reduzindo-os a meros blocos de notas eletrônicos.

PhysX em Unity

A biblioteca é integrada com a plataforma Unity eliminando sua outrora necessidade de entender a fundo e implementar em seu código fonte a SDK distribuída pela NVIDIA.

Essa arquitetura garante ainda mais facilidades para o desenvolvedor Unity, mas pode causar frustração àqueles que gostariam de implementar modificações significantes em seu projeto (adicionar APEX por exemplo) o que geralmente leva a necessidade de desembolsar uma gorda quantia para ter acesso ao código fonte da plataforma Unity.

O Básico

Todas as cenas em Unity ou seja, todo ambiente 3D, automaticamente contém uma interface com a biblioteca PhysX. Isso torna impossível desabilitar o motor físico para cenas que não o utilizam e uma certa parcela de processamento de um frame sempre será reservada para este fim.

Em PhysX a base de uma simulação é sustentada por camadas de colisores onde o desenvolvedor personaliza a interação entre essas camadas através de uma bitmask( http://en.wikipedia.org/wiki/Mask_(computing) ), configurada em Unity acessando “Edit->Project Settings->Physics”.

Neste mesmo painel é possível configurar o “ambiente físico” que o motor irá utilizar como referência para seus cálculos. Geralmente essas constantes precisam ser ajustadas somente quando não estás a trabalhar com “Unity units” na escala de seus objetos (equivalente a 1 unidade para cada centímetro no mundo real). Eu particularmente aconselho a trabalhar com 1 unidade para cada metro real pois facilita a produção de Assets em softwares como Maya e Studio Max.

Rigid Bodies

Como quase toda propriedade em Unity é tratada como componente de um objeto, para um determinado Game-Object ser tratado como um corpo físico e ter sua transformação vetorial afetada pela simulação física é necessário que este objeto contenha um componente “RigidBody”.

Note que em cada corpo rígido pode-se determinar variáveis que afetam o comportamento físico do objeto; Por exemplo: Um objeto com 'Mass' maior que um projétil sofrerá pouca aceleração resultante de um impacto enquanto que um objeto com menor massa será atirado para longe.

Um corpo rígido com nenhum 'Drag' ao cair por gravidade atingirá o solo mais rápido que outro com uma alta resistência ao ar. Os cálculos envolvendo essas simulações são gerados automaticamente pela PhysX, utilizando como referência os valores das constantes e variáveis que você fornece.

Kinematic Rigid Bodies

Simplificando: Kinemáticos são corpos físicos que por um motivo ou outro não podem possuir transformação vetorial mas ainda assim afetam o comportamento de outros corpos físicos. Em desenvolvimento de jogos existem poucas ocasiões onde este componente é necessário, em maioria dos casos é usado para simular plataformas de movimentação controlada (elevadores, etc) que interagem com “Character Controllers” e outros corpos físicos de transformação livre.

Colliders

Colisores são a representação volumétrica de um objeto no motor físico.

Quando se pretende que um objeto além de ser afetado por gravidade também reaja a impacto com outros corpos físicos, um componente colisor é necessário.

Caso não exista um componente RigidBody no objeto o colisor mantém um comportamento muito semelhante a um Kinemático, contanto que sua posição no espaço físico seja fixa.

Triggers

“Gatilhos” são uma forma de enviar mensagens entre objetos através de eventos gerados por colisões físicas. Um colisor marcado como gatilho não será afetado por transformações vetoriais controladas pelo motor físico e também não reagirá a nenhuma forma de interação com corpos físicos que não seja disparar um evento. Gatilhos são ativados somente ao obter contato com um objeto que possua um componente RigidBody. O evento disparado invocará “OnTriggerEnter”, “OnTriggerStay” e “OnTriggerExit” em cada “MonoBehaviour” presente no objeto contendo o gatilho. Muito útil para criar sequencias de ações que não tem um agendamento de tempo definido para acontecer em uma cena.

Physic Materials

° Materiais físicos podem ser atribuídos como 'flags' a cada colisor, determinando como o objeto conserva energia gerada por impacto ou atrito com outros colisores. Muito útil para simular superfícies de diversos materiais como concreto, vidro, madeira, borracha, gelo e etc.

Outros

Existem vários outros componentes com efeitos variados que em conjunto com colisores e/ou corpos físicos podem garantir uma simulação de bom nível, tais como “Configurable Joint” e “Character Controller”. Vale a pena examinar a documentação sempre que possível.

Física e Gameplay

Um bom exemplo de física em gameplay: Personagem empurrando caixas.

Digamos que em seu projeto você precisa que seu personagem empurre caixas, mas por qualquer motivo não pode ligar um RigidBody ao personagem; Como mover o corpo físico da caixa? Unity quase sempre disponibiliza uma API fácil e intuitiva, neste caso não é diferente:

public class PushBodies : MonoBehaviour 
{ 
    public float Push = 3.0f; 

    void OnControllerColliderHit(ControllerColliderHit hit) 
    { 
        Rigidbody body = hit.collider.attachedRigidbody; 

        if (!body||body.isKinematic) 
            return; 

        if (hit.moveDirection.y < -0.3f) 
            return; 

        Vector3 pushDir = new Vector3(hit.moveDirection.x,0,hit.moveDirection.z); 
        body.velocity = pushDir * Push; 
    } 
} 

Este simples script adiciona a um Character Controller a capacidade de gerar aceleração em qualquer objeto em cena que contenha os componentes RigidBody e Collider.

body’” é referência ao componente RigidBody adicionado ao objeto (caixa) que queremos empurrar; Caso o componente exista, o script aplica ao RigidBody uma força física relativa á direção de deslocamento do Character Controller.

Simples, não?! Com toda a matemática envolvida já automatizada pela PhysX, é como um passeio no parque

Simular física nunca foi tão simples, no entanto cuidado com excessos. Muitos corpos físicos interagindo ao mesmo tempo podem drenar muito processamento de um frame e arruinar o desempenho do seu jogo, boa sorte!


Comentários (4)
Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter