Bruno C de Paula Tpicos Especiais I Coliso
Bruno C. de Paula Tópicos Especiais I: Colisão 1º Semestre 2010 > PUCPR > Pós Jogos
Resumo q Vamos conhecer as funcionalidades de colisão que o Unity 3 D implementa; q Também discutiremos diversos scripts que lidam com a colisão; q Por fim, vamos tratar da técnica de ray casting; q Lembre-se: o tratamento da colisão nem sempre é necessário. Deixe a responsabilidade para a física quando puder! ØExemplo Arkanoid.
21/10/2021 Colisão q Interação física entre objetos do jogo; q Rede invisível que está ao redor do objeto; q Podemos trabalhar com a colisão imediatamente quando ocorre; q Pode-se prever a colisão usando a técnica de Ray Casting; 3
21/10/2021 Problema do frame miss q. O que acontece quando a bala é rápida demais? 4
21/10/2021 Solução com ray casting 5
21/10/2021 Tipos de colisores q Cada um tem uma utilidade diferente; q Component > Physics 6
21/10/2021 Tipos de componentes de colisão q Box: caixas, objetos, personagens; q Sphere: objetos esféricos, personagens; q Capsule: personagens do jogador; q Mesh: malha do objeto, mais pesado computacionalmente; q Wheel: roda, uso com veículos; q Raycast: dispara raio de colisão, uso com veículos; q Composto: união entre diversos colisores; q Character Controller: componente de colisão para personagem do jogador; 7
21/10/2021 Static Collider X Rigidbody q Static Collider é para objetos cuja física e colisão é menos necessária; q Rigidbody é para objetos com física; 8
21/10/2021 Rigidbody q Tem massa, resistência do ar, gravidade, elasticidade baseada no material, etc; q É possível movê-lo via scripting, mas deve ser evitado; q Usar evento Fixed. Update, chamado em um tempo fixo; 9
Script Adicionando uma força a um objeto Add. Force – eixo mundo 21/10/2021 var vel = 10; function Fixed. Update () { var f : Vector 3; // X vai de -1 a 1 f. x = Input. Get. Axis("Horizontal"); f. y = 0; f. z = 0; // Aplica uma velocidade f = f * vel; // Força é aplicada no eixo X rigidbody. Add. Force(f); } 10
Script Adicionando uma força a um objeto Add. Relative. Force – eixo local 21/10/2021 var vel = 10; function Fixed. Update () { var f : Vector 3; // X vai de -1 a 1 f. x = Input. Get. Axis("Horizontal"); f. y = 0; f. z = 0; // Aplica uma velocidade f = f * vel; // Força é aplicada no eixo X rigidbody. Add. Relative. Force(f); } 11
21/10/2021 Character Controller q Não é fisicamente realista (isto pode ser bom!) q Height: altura; q Radius: raio; q Slope Limit: limite de subida em rampas; q Skin Width: quanto sobe em degraus; q Min Move Distance: controla jitter; q Center: posição; q O FPS Walker já aplica o Character Controller. 12
Script Movimento a partir do teclado 21/10/2021 var vel = 10; function Update () { var f : Vector 3; f. x = Input. Get. Axis("Horizontal"); f. y = 0; f. z = Input. Get. Axis("Vertical"); f = f * vel; f = f * Time. delta. Time; // Get. Component acessa um componente do objeto var controller = Get. Component(Character. Controller); controller. Move(f); } 13
21/10/2021 Eventos de Colisão q On. Collision. Enter: chama quando inicia uma colisão; q On. Collision. Stay: chamado uma vez por frame enquanto está se chocando no corpo; q On. Collision. Exit: chamado quando a colisão é finalizada; q On. Controller. Collider. Hit: colisão com character controller; 14
Script Obtém o objeto com o qual colidiu function On. Collision. Enter(objeto. Colidido : Collision) print("Colidiu com: "+ objeto. Colidido. game. Object. name); } {
Script Destrói tudo que toca function On. Controller. Collider. Hit(obj : Controller. Collider. Hit) { Destroy(obj. game. Object); }
Script Enviar uma mensagem q Para que a mensagem enviada seja tratada pelo objeto colido, este deve possuir uma função com o mesmo nome da mensagem; function On. Controller. Collider. Hit(obj : Controller. Collider. Hit) { col. game. Object. Send. Message("Destruir"); }
Script Modifica propriedades de um objeto diferente q Game. Object. Find partir de seu nome; procura um objeto a function On. Controller. Collider. Hit(obj : Controller. Collider. Hit) { // Encontra o Game. Object com o nome indicado txt = Game. Object. Find("txt"); // Escreve o nome na tela txt. gui. Text. text += obj. game. Object. name; }
Script Só modifica objeto marcado por tag q Cada objeto pode ser associado a uma tag de identificação; function On. Controller. Collider. Hit(obj : Controller. Collider. Hit) { if(obj. game. Object. tag=="bloco") { // Encontra o Game. Object com o nome indicado txt = Game. Object. Find("txt"); // Escreve o nome do obj na tela txt. gui. Text. text=obj. game. Object. name; } }
Triggers Gatilhos q Triggers são ignorados pelo engine de física; q Úteis para o disparo de eventos: ØCutscenes; ØAbertura de portas; ØPassagem de mensagem em tutoriais; ØItens de energia; q Triggers agem como interruptores;
Eventos de trigger q On. Trigger. Enter: chamado imediatamente quando o colisor entra no trigger; q On. Trigger. Stay: mensagem mandada ao trigger e aos seus colisores enquanto estiver colidindo; q On. Trigger. Exit: chamado quando o colisor sai do trigger.
Script Transporta um objeto à frente após passar pelo Trigger function On. Trigger. Enter(col : Collider) { //Move o objeto no eixo z (andar para frente) col. transform. Translate(0, 0, 10); }
Raycast q Colisão preditiva; q Útil em: ØProjéteis rápidos; ØDisparo de colisão e triggers quando o personagem deve estar olhando para o trigger; q Função Physics. Raycast(posição, direção, distância);
Script Verifica se há objeto à frente function Update () { var hit : Raycast. Hit; // 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. Draw. Line (transform. position, hit. point); } else { print("Sem nada no caminho"); } }
Ignorando a colisão q Necessário quando se cria tiros e projéteis; q Função Physics. Ignore. Collision;
Script Criando projétil e ignorando a colisão var projectile : Rigidbody; var speed = 20; function Update() { if( Input. Get. Button. Down( "Fire 1" ) ) { var instantiated. Projectile : Rigidbody = Instantiate( projectile, transform. position, transform. rotation ); instantiated. Projectile. velocity = transform. Transform. Direction( Vector 3( 0, 0, speed ) ); Physics. Ignore. Collision( instantiated. Projectile. collider, transform. root. collider ); } }
21/10/2021 Para saber mais q Capítulo do livro “Unit Game Development Essentials”: Øhttp: //www. packtpub. com/article/unitygame-development-interactions-part 1 Ø Fonte de algumas figuras desta apresentação! 27
- Slides: 27