Tópicos Especiais I:
Colisão
1º Semestre 2010 > PUCPR > Pós Jogos
Bruno C. de Paula
Resumo
 Vamos 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.
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;
312/09/13
Problema do frame miss
 O que acontece quando a bala é rápida
demais?
412/09/13
Solução com ray casting
512/09/13
Tipos de colisores
 Cada um tem uma utilidade diferente;
 Component > Physics
612/09/13
Tipos de componentes de colisão
 Box: 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;
712/09/13
Static Collider X Rigidbody
 Static Collider é para objetos cuja física e
colisão é menos necessária;
 Rigidbody é para objetos com física;
812/09/13
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;
912/09/13
Script
Adicionando uma força a um objeto
AddForce – eixo mundo
1012/09/13
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);
}
Script
Adicionando uma força a um objeto
AddRelativeForce – eixo local
1112/09/13
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);
}
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.
1212/09/13
Script
Movimento a partir do teclado
1312/09/13
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);
}
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;
1412/09/13
Script
Obtém o objeto com o qual colidiu
function OnCollisionEnter(objetoColidido : Collision) {
print("Colidiu com: "+
objetoColidido.gameObject.name);
}
Script
Destrói tudo que toca
function OnControllerColliderHit(obj :
ControllerColliderHit) {
Destroy(obj.gameObject);
}
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;
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;
}
Script
Só 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;
Triggers
Gatilhos
 Triggers 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;
Eventos de trigger
 OnTriggerEnter: 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.
Script
Transporta 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);
}
Raycast
 Colisã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);
Script
Verifica 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");
}
Ignorando a colisão
 Necessário quando se cria tiros e
projéteis;
 Função Physics.IgnoreCollision;
Script
Criando projétil e ignorando a colisão
var 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 );
}
}
Para saber mais
 Capítulo do livro “Unit Game Development
Essentials”:
http://www.packtpub.
com/article/unity-game-development-interactio
 Fonte de algumas figuras desta
apresentação!
2712/09/13

06 colisao final

  • 1.
    Tópicos Especiais I: Colisão 1ºSemestre 2010 > PUCPR > Pós Jogos Bruno C. de Paula
  • 2.
    Resumo  Vamos conheceras 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.
  • 3.
    Colisão  Interação físicaentre 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; 312/09/13
  • 4.
    Problema do framemiss  O que acontece quando a bala é rápida demais? 412/09/13
  • 5.
    Solução com raycasting 512/09/13
  • 6.
    Tipos de colisores Cada um tem uma utilidade diferente;  Component > Physics 612/09/13
  • 7.
    Tipos de componentesde colisão  Box: 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; 712/09/13
  • 8.
    Static Collider XRigidbody  Static Collider é para objetos cuja física e colisão é menos necessária;  Rigidbody é para objetos com física; 812/09/13
  • 9.
    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; 912/09/13
  • 10.
    Script Adicionando uma forçaa um objeto AddForce – eixo mundo 1012/09/13 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); }
  • 11.
    Script Adicionando uma forçaa um objeto AddRelativeForce – eixo local 1112/09/13 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); }
  • 12.
    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. 1212/09/13
  • 13.
    Script Movimento a partirdo teclado 1312/09/13 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); }
  • 14.
    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; 1412/09/13
  • 15.
    Script Obtém o objetocom o qual colidiu function OnCollisionEnter(objetoColidido : Collision) { print("Colidiu com: "+ objetoColidido.gameObject.name); }
  • 16.
    Script Destrói tudo quetoca function OnControllerColliderHit(obj : ControllerColliderHit) { Destroy(obj.gameObject); }
  • 17.
    Script Enviar uma mensagem functionOnControllerColliderHit(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;
  • 18.
    Script Modifica propriedades deum 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; }
  • 19.
    Script Só modifica objetomarcado 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;
  • 20.
    Triggers Gatilhos  Triggers sãoignorados 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;
  • 21.
    Eventos de trigger OnTriggerEnter: 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.
  • 22.
    Script Transporta 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); }
  • 23.
    Raycast  Colisã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);
  • 24.
    Script Verifica 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"); }
  • 25.
    Ignorando a colisão Necessário quando se cria tiros e projéteis;  Função Physics.IgnoreCollision;
  • 26.
    Script Criando projétil eignorando a colisão var 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 ); } }
  • 27.
    Para saber mais Capítulo do livro “Unit Game Development Essentials”: http://www.packtpub. com/article/unity-game-development-interactio  Fonte de algumas figuras desta apresentação! 2712/09/13

Notas do Editor

  • #4 Fonte da figura: Unity Game Development Essentials http://www.packtpub.com/article/unity-game-development-interactions-part1 12/09/13
  • #5 Fonte da figura: Unity Game Development Essentials http://www.packtpub.com/article/unity-game-development-interactions-part1 12/09/13