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