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