1 / 27

Tópicos Especiais I: Colisão

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 ;

bevan
Download Presentation

Tópicos Especiais I: Colisão

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Bruno C. de Paula Tópicos Especiais I: Colisão 1º Semestre 2010 > PUCPR > Pós Jogos

  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;

  4. Problema do frame miss • O que acontece quando a bala é rápida demais?

  5. Solução com ray casting

  6. Tipos de colisores • Cada um tem uma utilidade diferente; • Component > Physics

  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;

  8. Static Collider X Rigidbody • Static Collider é para objetos cuja física e colisão é menos necessária; • Rigidbody é para objetos com física;

  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;

  10. 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); }

  11. 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); }

  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.

  13. 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); }

  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;

  15. ScriptObté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 • 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"); }

  18. 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; }

  19. 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; } }

  20. 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;

  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. 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); }

  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. 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"); } }

  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-interactions-part1 • Fonte de algumas figuras desta apresentação!

More Related