21
Projetos RAD : Unity 3D Colisões Parte 1 Augusto Bülow

Aula5 colisao1

Embed Size (px)

Citation preview

Projetos RAD : Unity 3DColisões Parte 1

Augusto Bülow

Unity

• Colisões = essencial em games– Comportamento de acordo com a cena

• Colisão chão, paredes

– Comportamento com outros objetos• Colisão com outros objetos

– Identificar área atual– Tiros, bônus, etc.

Unity

• Objetos com colisão: – Componente Collider– Adicionado por default

• Diferentes tipos de Collider– Mais adequado a forma– Maior / menor performance

• Adicionável por:– Component->Physics

Unity

• Collider: Box– Colisão básica, boa

performance– Aceita dimensões

diferentes em X,Y,Z– Utilização geral:

• Paredes, caixas, objetos, personagens, etc.

Unity

• Collider: Sphere– Colisão básica, maior

performance– Dimensão única: Raio– Utilização geral:

• Objetos esféricos, personagens, etc.

Unity

• Collider: Capsule– Cilindro com meia

esfera em cada ponta– Maior processamento– Duas Dimensões:

• Altura e Raio

– Configuração adicional: orientação

– Utilização geral:• Personagens e objetos

Unity

• Collider: Mesh– Reproduz a malha real do

objeto– Ultra processamento– Restrições

• Meshs com 255 faces máximo

• Mesh collider não colide com outro mesh collider*

– Uso quando necessário– Geral outros colliders são

mais adequados

Unity

• Collider: Wheel– Roda: especial para

veículos com física– Parâmetros para

funcionamento como motor (físico)

– Distancia básica por raio

– Uso exclusivo: veículos com física

Unity

• Collider: Raycast– Raio simples para

determinar altura– Uso específico para

alguns veículos / objs – Dispara um raio do

centro para baixo– Checa colisões:

• altura solo basicamente

Unity

• Colisões em geral usando primitivas – Box, Sphere, Capsule

• Colisão Mesh : – apenas em situações específicas

• Wheel / Raycast– Veículos com funcionamento físico

Unity• Possível criar Collider composto

– Criar objetos com hierarquia– Criar Collider com primitivas para cada parte (child)

• Funciona como Collider único (ligados por hierarquia)• Simulação de Mesh e objetos complexos

Unity

• Collider = forma para colisão• Todos objetos que se deseja perceber a colisão precisam

ter um Collider atachado• Objetos apenas com collider = Static Collider

– Estáticos, não se espera grandes movimentos– Não se detectam grandes colisões em geral

• Componentes adicionais para colisões mais completas– Simulação física = RigidBody– Personagens = Character Controlle

Unity• RigidBody – ativa física para um objeto

– Controle do objeto passa a ser gerido pela engine física – Reage automaticamente com outros objetos– Possui massa específica (peso)– Possui fricção, elasticidade (Physics Material) – Funcionamento autônomo – baseado em colisões– Possível mover por propriedades transform:

• Quebra do realismo físico (possível)

– Movimento com forças físicas • Comandos específicos

Unity

• RigidBody Test:– Criar cena com pilar

básico (StaticCollider) e cubos com componente RigidBox (físicos)

• Adicionando RigidBody– Component->Physics->

• RigidBody

Unity

• Player (Físico) códigos específicos• Interações com física:

function FixedUpdate()

• Funções força para RigidBody– AddForce(x,y,z)

• Adiciona forças ao corpo, baseadas nas coordenadas mundiais

– AddRelativeForce(x,y,z)• Adiciona forças ao corpo, baseadas nas coordenadas

atuais do objeto (suas rotações)

Unity

• Código básico teste AddForcevar velocidade = 15;

var forca : Vector3;

function FixedUpdate () {

//CAPTURA INPUT BASICO

forca.x = Input.GetAxis("Horizontal");

forca.y = 0;

forca.z = Input.GetAxis("Vertical");

//Multiplicamos vetor pela velocidade desejada

forca *= velocidade;

rigidbody.AddForce(forca);

}

Unity

• AddForce = sem muita precisão (direta)• Comportamento físico realístico faz rotar com

colisões automaticamente• Uso para forças realísticas sobre objetos

físicos: – jogar um objeto em alguma direção

• Resultado: depende das colisões encontradas• AddForce:

– forças em relação aos eixos mundiais

Unity

• AddRelativeForce(x,y,z)– Forças adicionadas em relação aos ângulos atuais

do objeto (sua orientação)– Funcionamento semelhante (física realística)– Resultado completamente diferente

• Teste: substituir código://rigidbody.AddForce(forca);

rigidbody.AddRelativeForce(forca);

Unity

• MovePosition(x,y,z)– Move objeto físico para nova posição (tenta mover)– Posição mundial:

= utilizar posição atual + movimento desejado

- Neste caso utilizar deltaTime para movimento compatível / escalado pelo tempo

- Multiplicar movimento por Time.deltaTime

- AddForce = não se usa deltaTime - Já incorporado pela engine física

Unity

• Exemplo MovePosition

function FixedUpdate () {

forca.x = Input.GetAxis("Horizontal");

forca.y = 0;

forca.z = Input.GetAxis("Vertical");

forca *= velocidade;

forca *= Time.deltaTime;

forca += rigidbody.position;

rigidbody.MovePosition(forca);

}

Unity

• Transformar vetor de forças em relação a uma orientação / ângulo

• Função específica da classe Transformtransform.TransformDirection(x,y,z)

• Converte vetor de forças X,Y,Z para equivalente em relação a orientação do objeto

• Adicionar ao código a linha:

forca = transform.TransformDirection(forca);