A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Tópicos Especiais I: Colisão 1º Semestre 2010 > PUCPR > Pós Jogos Bruno C. de Paula."— Transcrição da apresentação:

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

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; 3 2/11/2013

4 Problema do frame miss O que acontece quando a bala é rápida demais? 4 2/11/2013

5 Solução com ray casting 5 2/11/2013

6 Tipos de colisores Cada um tem uma utilidade diferente; Component > Physics 6 2/11/2013

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; 7 2/11/2013

8 Static Collider X Rigidbody Static Collider é para objetos cuja física e colisão é menos necessária; Rigidbody é para objetos com física; 8 2/11/2013

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; 9 2/11/2013

10 Script Adicionando uma força a um objeto AddForce – eixo mundo 10 2/11/2013 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 Script Adicionando uma força a um objeto AddRelativeForce – eixo local 11 2/11/2013 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. 12 2/11/2013

13 Script Movimento a partir do teclado 13 2/11/2013 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; 14 2/11/2013

15 Script Obté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 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;

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

19 Script Só 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;

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

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

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

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: game-development-interactions-part1 game-development-interactions-part1 Fonte de algumas figuras desta apresentação! 27 2/11/2013


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

Apresentações semelhantes


Anúncios Google