06 colisao final

27
Tópicos Especiais I: Colisão 1º Semestre 2010 > PUCPR > Pós Jogos Bruno C. de Paula

Upload: david-henrique

Post on 27-Jun-2015

450 views

Category:

Design


0 download

TRANSCRIPT

Page 1: 06 colisao final

Tópicos Especiais I: Colisão

1º Semestre 2010 > PUCPR > Pós Jogos

Bruno C. de PaulaBruno C. de Paula

Page 2: 06 colisao final

ResumoVamos conhecer as funcionalidades de

colisão que o Unity 3D implementa;Também discutiremos diversos scripts

que lidam com a colisão;Por fim, vamos tratar da técnica de ray

casting;Lembre-se: o tratamento da colisão nem

sempre é necessário. Deixe a responsabilidade para a física quando puder!Exemplo Arkanoid.

Page 3: 06 colisao final

Colisão

Interação física entre objetos do jogo;Rede invisível que está ao redor do

objeto;Podemos trabalhar com a colisão

imediatamente quando ocorre;Pode-se prever a colisão usando a

técnica de Ray Casting;

313/04/23

Page 4: 06 colisao final

Problema do frame miss

O que acontece quando a bala é rápida demais?

413/04/23

Page 5: 06 colisao final

Solução com ray casting513/04/23

Page 6: 06 colisao final

Tipos de colisores

Cada um tem uma utilidade diferente;Component > Physics

613/04/23

Page 7: 06 colisao final

Tipos de componentes de colisãoBox: caixas, objetos, personagens;Sphere: objetos esféricos, personagens;Capsule: personagens do jogador;Mesh: malha do objeto, mais pesado

computacionalmente;Wheel: roda, uso com veículos;Raycast: dispara raio de colisão, uso com

veículos;Composto: união entre diversos colisores;Character Controller: componente de

colisão para personagem do jogador;

713/04/23

Page 8: 06 colisao final

Static Collider X Rigidbody

Static Collider é para objetos cuja física e colisão é menos necessária;

Rigidbody é para objetos com física;

813/04/23

Page 9: 06 colisao final

Rigidbody

Tem massa, resistência do ar, gravidade, elasticidade baseada no material, etc;

É possível movê-lo via scripting, mas deve ser evitado;

Usar evento FixedUpdate, chamado em um tempo fixo;

913/04/23

Page 10: 06 colisao final

ScriptAdicionando uma força a um objetoAddForce – eixo mundo

1013/04/23

var vel = 10;function FixedUpdate () { var f : Vector3; // X vai de -1 a 1 f.x = Input.GetAxis("Horizontal"); f.y = 0; f.z = 0; // Aplica uma velocidade f = f * vel; // Força é aplicada no eixo X rigidbody.AddForce(f); }

Page 11: 06 colisao final

ScriptAdicionando uma força a um objetoAddRelativeForce – eixo local

1113/04/23

var vel = 10;function FixedUpdate () { var f : Vector3; // X vai de -1 a 1 f.x = Input.GetAxis("Horizontal"); f.y = 0; f.z = 0; // Aplica uma velocidade f = f * vel; // Força é aplicada no eixo X rigidbody.AddRelativeForce(f); }

Page 12: 06 colisao final

Character Controller

Não é fisicamente realista (isto pode ser bom!)

Height: altura;Radius: raio;Slope Limit: limite de subida em rampas;Skin Width: quanto sobe em degraus;Min Move Distance: controla jitter;Center: posição;O FPS Walker já aplica o Character

Controller.

1213/04/23

Page 13: 06 colisao final

ScriptMovimento a partir do teclado

1313/04/23

var vel = 10;function Update () { var f : Vector3; f.x = Input.GetAxis("Horizontal"); f.y = 0; f.z = Input.GetAxis("Vertical"); f = f * vel; f = f * Time.deltaTime; // GetComponent acessa um componente do objeto var controller = GetComponent(CharacterController); controller.Move(f); }

Page 14: 06 colisao final

Eventos de Colisão

OnCollisionEnter: chama quando inicia uma colisão;

OnCollisionStay: chamado uma vez por frame enquanto está se chocando no corpo;

OnCollisionExit: chamado quando a colisão é finalizada;

OnControllerColliderHit: colisão com character controller;

1413/04/23

Page 15: 06 colisao final

ScriptObtém o objeto com o qual colidiu

function OnCollisionEnter(objetoColidido : Collision) { print("Colidiu com: "+

objetoColidido.gameObject.name);}

Page 16: 06 colisao final

Script Destrói tudo que toca

function OnControllerColliderHit(obj : ControllerColliderHit) {

Destroy(obj.gameObject);}

Page 17: 06 colisao final

Script Enviar uma mensagem

function OnControllerColliderHit(obj : ControllerColliderHit) {

col.gameObject.SendMessage("Destruir");}

Para que a mensagem enviada seja tratada pelo objeto colido, este deve possuir uma função com o mesmo nome da mensagem;

Page 18: 06 colisao final

Script

Modifica propriedades de um objeto diferente GameObject.Find procura um objeto a

partir de seu nome;

function OnControllerColliderHit(obj : ControllerColliderHit) {

// Encontra o GameObject com o nome indicado txt = GameObject.Find("txt"); // Escreve o nome na tela txt.guiText.text += obj.gameObject.name;}

Page 19: 06 colisao final

ScriptSó modifica objeto marcado por tag

function OnControllerColliderHit(obj : ControllerColliderHit) {

if(obj.gameObject.tag=="bloco") { // Encontra o GameObject com o nome indicado

txt = GameObject.Find("txt"); // Escreve o nome do obj na tela

txt.guiText.text=obj.gameObject.name;

}}

Cada objeto pode ser associado a uma tag de identificação;

Page 20: 06 colisao final

TriggersGatilhosTriggers são ignorados pelo engine de

física;Úteis para o disparo de eventos:

Cutscenes;Abertura de portas;Passagem de mensagem em

tutoriais;Itens de energia;

Triggers agem como interruptores;

Page 21: 06 colisao final

Eventos de triggerOnTriggerEnter: chamado

imediatamente quando o colisor entra no trigger;

OnTriggerStay: mensagem mandada ao trigger e aos seus colisores enquanto estiver colidindo;

OnTriggerExit: chamado quando o colisor sai do trigger.

Page 22: 06 colisao final

ScriptTransporta um objeto à frente após passar pelo Trigger

function OnTriggerEnter(col : Collider) { //Move o objeto no eixo z (andar para frente) col.transform.Translate(0, 0, 10);}

Page 23: 06 colisao final

RaycastColisão preditiva;Útil em:

Projéteis rápidos;Disparo de colisão e triggers quando o

personagem deve estar olhando para o trigger;

Função Physics.Raycast(posição, direção, distância);

Page 24: 06 colisao final

ScriptVerifica se há objeto à frente

function Update () { var hit : RaycastHit; // Olha 10 metros à frente if (Physics.Raycast (transform.position, transform.forward, hit,10)) { print ("Tem alguma coisa na minha frente"); // Desenha uma linha para representar o raio Debug.DrawLine (transform.position, hit.point); } else { print("Sem nada no caminho"); }}

Page 25: 06 colisao final

Ignorando a colisãoNecessário quando se cria tiros e

projéteis;Função Physics.IgnoreCollision;

Page 26: 06 colisao final

Script Criando projétil e ignorando a colisãovar projectile : Rigidbody;var speed = 20;function Update(){ if( Input.GetButtonDown( "Fire1" ) ) { var instantiatedProjectile : Rigidbody = Instantiate( projectile, transform.position,

transform.rotation ); instantiatedProjectile.velocity = transform.TransformDirection( Vector3( 0, 0, speed ) ); Physics.IgnoreCollision( instantiatedProjectile. collider, transform.root.collider ); }}