tópicos especiais i: colisão
Post on 05-Jan-2016
49 Views
Preview:
DESCRIPTION
TRANSCRIPT
Tópicos Especiais I: Colisão
1º Semestre 2010 > PUCPR > Pós Jogos
Bruno C. de PaulaBruno C. de Paula
ResumoVamos 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;
320/04/23
Problema do frame miss
O que acontece quando a bala é rápida demais?
420/04/23
Solução com ray casting520/04/23
Tipos de colisores
Cada um tem uma utilidade diferente;Component > Physics
620/04/23
Tipos de componentes de colisãoBox: 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;
720/04/23
Static Collider X Rigidbody
Static Collider é para objetos cuja física e colisão é menos necessária;
Rigidbody é para objetos com física;
820/04/23
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;
920/04/23
ScriptAdicionando uma força a um objetoAddForce – eixo mundo
1020/04/23
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
1120/04/23
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.
1220/04/23
ScriptMovimento a partir do teclado
1320/04/23
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;
1420/04/23
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
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;
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;}
ScriptSó 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;
TriggersGatilhosTriggers 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 triggerOnTriggerEnter: 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);}
RaycastColisã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ãoNecessário quando se cria tiros e
projéteis;Função Physics.IgnoreCollision;
Script Criando projétil e ignorando a colisãovar 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!
2720/04/23
top related