06 colisao final
TRANSCRIPT
![Page 1: 06 colisao final](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/1.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/2.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/4.jpg)
Problema do frame miss
O que acontece quando a bala é rápida demais?
413/04/23
![Page 5: 06 colisao final](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/5.jpg)
Solução com ray casting513/04/23
![Page 6: 06 colisao final](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/6.jpg)
Tipos de colisores
Cada um tem uma utilidade diferente;Component > Physics
613/04/23
![Page 7: 06 colisao final](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/15.jpg)
ScriptObtém o objeto com o qual colidiu
function OnCollisionEnter(objetoColidido : Collision) { print("Colidiu com: "+
objetoColidido.gameObject.name);}
![Page 16: 06 colisao final](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/16.jpg)
Script Destrói tudo que toca
function OnControllerColliderHit(obj : ControllerColliderHit) {
Destroy(obj.gameObject);}
![Page 17: 06 colisao final](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/25.jpg)
Ignorando a colisãoNecessário quando se cria tiros e
projéteis;Função Physics.IgnoreCollision;
![Page 26: 06 colisao final](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/26.jpg)
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 ); }}
![Page 27: 06 colisao final](https://reader036.vdocuments.site/reader036/viewer/2022062303/558df42e1a28ab96598b46ac/html5/thumbnails/27.jpg)
Para saber mais
Capítulo do livro “Unit Game Development Essentials”:http://www.packtpub.
com/article/unity-game-development-interactions-part1
Fonte de algumas figuras desta apresentação!
2713/04/23