Bruno C. de Paula
Tópicos Especiais I:
Colisão
1º Semestre 2010 > PUCPR > Pós Jogos
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.
05/11/2015
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;
3
05/11/2015
Problema do frame miss
O
que acontece quando a bala é rápida
demais?
4
05/11/2015
Solução com ray casting
5
05/11/2015
Tipos de colisores
 Cada
um tem uma utilidade diferente;
 Component > Physics
6
05/11/2015
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;
7
05/11/2015
Static Collider X Rigidbody
 Static
Collider é para objetos cuja física e
colisão é menos necessária;
 Rigidbody é para objetos com física;
8
05/11/2015
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;
9
Script
Adicionando uma força a um objeto
AddForce – eixo mundo
05/11/2015
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);
}
10
Script
Adicionando uma força a um objeto
AddRelativeForce – eixo local
05/11/2015
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);
}
11
05/11/2015
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.
12
Script
Movimento a partir do teclado
05/11/2015
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);
}
13
05/11/2015
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;
14
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
 Para
que a mensagem enviada seja tratada
pelo objeto colido, este deve possuir uma
função com o mesmo nome da mensagem;
function OnControllerColliderHit(obj :
ControllerColliderHit) {
col.gameObject.SendMessage("Destruir");
}
Script
Modifica propriedades de um objeto diferente
 GameObject.Find
partir de seu nome;
procura um objeto a
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
 Cada
objeto pode ser associado a uma tag
de identificação;
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;
}
}
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 );
}
}
05/11/2015
Para saber mais
 Capítulo
do livro “Unit Game Development
Essentials”:
http://www.packtpub.com/article/unitygame-development-interactions-part1
 Fonte de algumas figuras desta
apresentação!
27
Download

Colisão - Bruno Campagnolo de Paula