270 likes | 403 Views
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 ;
E N D
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.
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;
Problema do frame miss • O que acontece quando a bala é rápida demais?
Tipos de colisores • Cada um tem uma utilidade diferente; • Component > Physics
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;
Static Collider X Rigidbody • Static Collider é para objetos cuja física e colisão é menos necessária; • Rigidbody é para objetos com física;
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;
ScriptAdicionando uma força a um objetoAddForce – eixo mundo 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); }
ScriptAdicionando uma força a um objetoAddRelativeForce – eixo local 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); }
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.
ScriptMovimento a partir do teclado 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); }
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;
ScriptObté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"); }
ScriptModifica 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; }
ScriptSó 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; } }
TriggersGatilhos 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.
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); }
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);
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"); } }
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 ); } }
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!