Projetos RAD : Unity 3D 
Colisões Parte 2 
Character Controller e Triggers 
Augusto Bülow
Unity 
• Colisões Objetos 
– Collider : formato da colisão 
• Estáticos (static collider) 
– Dinâmicos : componentes adicionais 
• RigidBody : 
– movimento e comportamento físico (realístico) 
• Character Controller : 
– Componnte especial para players 
– Detecção de colisões geral 
– Controle mais direto (física = simulação automática)
Unity 
• Character Controller 
– Personagens em geral controlados por animações e 
ações, sem necessariamente um comportamento 
realístico (total) 
• Utiliza-se Character Controller 
• Maior controle geral (estável em colisões) 
• Transformações baseadas principalmente em script 
– Quando personagem planejado para ter física real: 
• Utiliza-se RigidBody 
• Comportamento imprevisível (realístico) 
• Transformações automáticas baseadas em colisões
Unity 
• Character Controller 
– Adiciona-se por: 
• Component->Physics->Character Controller 
– Sobrepõe o Collider anterior do objeto 
– Pode ser utilizado com RigidBody, mas sua 
utilização é alternativa (à física realística) 
– Character controller: 
• comandos específicos para controle / movimento
Unity 
• Character Controller 
– Altura 
– Raio 
– Slope Limit 
• Limite para subida em 
rampas (graus) 
– Step Offset 
• Altura subida degraus 
– Skin Width 
• Valores maiores para 
evitar colisões 
próximas (grudar = 
stuck)
Unity 
• Acessar o componente Character Controller 
não pode ser diretamente 
• Precisa localizar o componente com: 
var ponteiro = GetComponent(CharacterControler) 
• GetComponent pode ser usado para acessar 
qualquer componente do Objeto 
• Chamar pelo nome, sem espaços, sem aspas
Unity 
• Character Controller : função Move 
• Código básico para movimento: 
var velocidade = 15; 
var forca : Vector3; 
function Update () { 
//CAPTURA INPUT BASICO 
forca.x = Input.GetAxis("Horizontal"); 
forca.y = 0; 
forca.z = Input.GetAxis("Vertical"); 
forca *= velocidade; 
forca *= Time.deltaTime; 
var controller = GetComponent(CharacterController); 
controller.Move(forca); 
}
Unity 
• Não usa gravidade direta 
• Tem Flags auxiliares 
– Setadas com o movimento 
– isGrounded = no chão 
– CollisionFlags = detalhes da colisão 
• None 
• Sides 
• Above 
• Below
Unity 
• Criando gravidade manualmente 
– Basicamente aplicar força y (gravidade) 
var gravidade = 20; 
Function Update() { 
//CAPTURA INPUT BASICO 
forca.x = Input.GetAxis("Horizontal"); 
//forca.y = 0; 
forca.z = Input.GetAxis("Vertical"); 
forca *= velocidade; 
//APLICANDO GRAVIDADE SEMPRE 
forca.y -= gravidade; 
forca *= Time.deltaTime; 
....
Unity 
• Criando pulo básico – força y (por tecla) 
– Basicamente aplicar força y (pulo) 
– Gravidade devolve ela a zero (ao solo) 
– Adicionalmente – só pular se no chão (isGrounded) 
var forca_pulo = 20; 
var no_chao = 0; 
.... (antes do controller.Move) 
if (Input.GetKeyDown("space") && no_chao == 1) { 
forca.y = forca_pulo; 
} 
... (FLAG atualizada após o Move) 
if (controller.isGrounded) { 
no_chao = 1; 
}
Unity 
• Tratando colisões manualmente 
– Colisões disparam mensagens para os objetos 
envolvidos 
– Colisões em geral (Colliders): 
• OnCollisionEnter 
• OnCollisionStay 
• OnCollisionExit 
– Colisões Character Controller : ESPECIAL 
• OnControllerColliderHit 
• Objeto que colidiu também é passado na 
mensagem (ponteiro)
Unity 
• Character Controller : Colisão básica 
• Recebe um ControllerColliderHit 
– Possível acessar propriedades do objeto colidido 
• Mensagem OnControllerColliderHit 
• Exemplo: 
– retornar o nome do objeto colidido em um Guitext 
function OnControllerColliderHit (quem : ControllerColliderHit ) { 
debug = GameObject.Find("Debug1"); 
debug.guiText.text = "Colisao: "; 
debug.guiText.text += quem.gameObject.name; 
}
Unity 
• RigidBody e Colliders normais 
• Recebe um Collider 
– Possível acessar propriedades do objeto colidido 
• Mensagens OnCollisionEnter 
• Observar: 
– Character Controller uso diferenciado 
function OnCollisionEnter (quem : Collider ) { 
debug = GameObject.Find("Debug1"); 
debug.guiText.text = "Colisao: "; 
debug.guiText.text += quem.gameObject.name; 
}
Unity 
• Trigger = Gatilhos 
• Colisões especiais – objetos de marcação 
– Não esperada colisão com reação diretamente 
– Colisão para ativação ou informação 
– Objeto basicamente passável (mas detecta a colisão) 
– Uso: 
• Bônus e itens 
• indicar entrada em parte do cenário, etc 
– Mensagens Específicas 
• OnTriggerEnter 
• OnTriggerStay 
• OnTriggerExit
Unity 
• Trigger : Exemplo Colisão 
function OnTriggerEnter (quem : Collider ) { 
debug = GameObject.Find("Debug1"); 
debug.guiText.text = "Colisao TRIGGER: "; 
debug.guiText.text += quem.gameObject.name; 
//Remove item que colidiu 
Destroy(quem.gameObject); 
}

Aula6 colisao2

  • 1.
    Projetos RAD :Unity 3D Colisões Parte 2 Character Controller e Triggers Augusto Bülow
  • 2.
    Unity • ColisõesObjetos – Collider : formato da colisão • Estáticos (static collider) – Dinâmicos : componentes adicionais • RigidBody : – movimento e comportamento físico (realístico) • Character Controller : – Componnte especial para players – Detecção de colisões geral – Controle mais direto (física = simulação automática)
  • 3.
    Unity • CharacterController – Personagens em geral controlados por animações e ações, sem necessariamente um comportamento realístico (total) • Utiliza-se Character Controller • Maior controle geral (estável em colisões) • Transformações baseadas principalmente em script – Quando personagem planejado para ter física real: • Utiliza-se RigidBody • Comportamento imprevisível (realístico) • Transformações automáticas baseadas em colisões
  • 4.
    Unity • CharacterController – Adiciona-se por: • Component->Physics->Character Controller – Sobrepõe o Collider anterior do objeto – Pode ser utilizado com RigidBody, mas sua utilização é alternativa (à física realística) – Character controller: • comandos específicos para controle / movimento
  • 5.
    Unity • CharacterController – Altura – Raio – Slope Limit • Limite para subida em rampas (graus) – Step Offset • Altura subida degraus – Skin Width • Valores maiores para evitar colisões próximas (grudar = stuck)
  • 6.
    Unity • Acessaro componente Character Controller não pode ser diretamente • Precisa localizar o componente com: var ponteiro = GetComponent(CharacterControler) • GetComponent pode ser usado para acessar qualquer componente do Objeto • Chamar pelo nome, sem espaços, sem aspas
  • 7.
    Unity • CharacterController : função Move • Código básico para movimento: var velocidade = 15; var forca : Vector3; function Update () { //CAPTURA INPUT BASICO forca.x = Input.GetAxis("Horizontal"); forca.y = 0; forca.z = Input.GetAxis("Vertical"); forca *= velocidade; forca *= Time.deltaTime; var controller = GetComponent(CharacterController); controller.Move(forca); }
  • 8.
    Unity • Nãousa gravidade direta • Tem Flags auxiliares – Setadas com o movimento – isGrounded = no chão – CollisionFlags = detalhes da colisão • None • Sides • Above • Below
  • 9.
    Unity • Criandogravidade manualmente – Basicamente aplicar força y (gravidade) var gravidade = 20; Function Update() { //CAPTURA INPUT BASICO forca.x = Input.GetAxis("Horizontal"); //forca.y = 0; forca.z = Input.GetAxis("Vertical"); forca *= velocidade; //APLICANDO GRAVIDADE SEMPRE forca.y -= gravidade; forca *= Time.deltaTime; ....
  • 10.
    Unity • Criandopulo básico – força y (por tecla) – Basicamente aplicar força y (pulo) – Gravidade devolve ela a zero (ao solo) – Adicionalmente – só pular se no chão (isGrounded) var forca_pulo = 20; var no_chao = 0; .... (antes do controller.Move) if (Input.GetKeyDown("space") && no_chao == 1) { forca.y = forca_pulo; } ... (FLAG atualizada após o Move) if (controller.isGrounded) { no_chao = 1; }
  • 11.
    Unity • Tratandocolisões manualmente – Colisões disparam mensagens para os objetos envolvidos – Colisões em geral (Colliders): • OnCollisionEnter • OnCollisionStay • OnCollisionExit – Colisões Character Controller : ESPECIAL • OnControllerColliderHit • Objeto que colidiu também é passado na mensagem (ponteiro)
  • 12.
    Unity • CharacterController : Colisão básica • Recebe um ControllerColliderHit – Possível acessar propriedades do objeto colidido • Mensagem OnControllerColliderHit • Exemplo: – retornar o nome do objeto colidido em um Guitext function OnControllerColliderHit (quem : ControllerColliderHit ) { debug = GameObject.Find("Debug1"); debug.guiText.text = "Colisao: "; debug.guiText.text += quem.gameObject.name; }
  • 13.
    Unity • RigidBodye Colliders normais • Recebe um Collider – Possível acessar propriedades do objeto colidido • Mensagens OnCollisionEnter • Observar: – Character Controller uso diferenciado function OnCollisionEnter (quem : Collider ) { debug = GameObject.Find("Debug1"); debug.guiText.text = "Colisao: "; debug.guiText.text += quem.gameObject.name; }
  • 14.
    Unity • Trigger= Gatilhos • Colisões especiais – objetos de marcação – Não esperada colisão com reação diretamente – Colisão para ativação ou informação – Objeto basicamente passável (mas detecta a colisão) – Uso: • Bônus e itens • indicar entrada em parte do cenário, etc – Mensagens Específicas • OnTriggerEnter • OnTriggerStay • OnTriggerExit
  • 15.
    Unity • Trigger: Exemplo Colisão function OnTriggerEnter (quem : Collider ) { debug = GameObject.Find("Debug1"); debug.guiText.text = "Colisao TRIGGER: "; debug.guiText.text += quem.gameObject.name; //Remove item que colidiu Destroy(quem.gameObject); }