2. 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.
3. 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
4. Problema do frame miss
O que acontece quando a bala é rápida
demais?
412/09/13
6. Tipos de colisores
Cada um tem uma utilidade diferente;
Component > Physics
612/09/13
7. 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
8. 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
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ç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);
}
11. 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);
}
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 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);
}
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 objeto com o qual colidiu
function OnCollisionEnter(objetoColidido : Collision) {
print("Colidiu com: "+
objetoColidido.gameObject.name);
}
16. Script
Destrói tudo que toca
function OnControllerColliderHit(obj :
ControllerColliderHit) {
Destroy(obj.gameObject);
}
17. 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;
18. 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;
}
19. 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;
20. 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;
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 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 );
}
}
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
Fonte da figura: Unity Game Development Essentials http://www.packtpub.com/article/unity-game-development-interactions-part1 12/09/13
Fonte da figura: Unity Game Development Essentials http://www.packtpub.com/article/unity-game-development-interactions-part1 12/09/13