O documento descreve como implementar movimento realista em Unity 3D usando variáveis para controlar velocidade, aceleração e fricção. Ele explica como criar essas variáveis, aplicar aceleração e desaceleração com base na fricção, limitar a velocidade máxima e converter a velocidade em um vetor para levar em conta a rotação do objeto. Também discute como incorporar controles básicos de rotação e como a velocidade pode ser afetada por colisões.
Controle de movimento em Unity com variáveis de velocidade, aceleração e fricção
1. Projetos RAD : Unity 3D
Velocidade, aceleração e fricção
Augusto Bülow
2. Unity
• Código básico de movimento (atual)
– Pressiona tecla = move
• Movimentos avançados
– Velocidade com maior controle
– Aceleração
– Fricção
– Mantém velocidade ( + transformações)
= Criar variáveis para controle destes aspectos
3. Unity
• Variáveis básicas:
var aceleracao = 0.5;
var friccao = 0.2;
var velocidade_maxima = 3.0;
var velocidade_atual = 0.0;
• Utilizar Float (declarar valor com vírgula)
– Habilitar transformações leves / decimais
• Estamos criando física (manualmente)
– RigidBody = esquema automático
– Pode ser incorporado física manual (junto)
4. Unity
function Update () {
//Input - acelera velocidade atual
if (Input.GetKey("w") || Input.GetKey(KeyCode.UpArrow))
{ velocidade_atual += aceleracao * Time.deltaTime;
}
//limita velocidade maxima
if (velocidade_atual > velocidade_maxima) {
velocidade_atual = velocidade_maxima;
}
//Mover sempre com a velocidade
var controller = GetComponent(CharacterController);
controller.Move(Vector3(0, 0, velocidade_atual));
}
5. Unity
• Necessidade de Fricção (manual)
– Fricção = atrito, diminui a velocidade do corpo
• Fricção = leva a inércia
– Restrição a velocidade 0 ( repouso)
– Evitar entrar em velocidade inversa
//friccao manual - leva a repouso
if (velocidade_atual > 0) {
velocidade_atual -= friccao * Time.deltaTime;
//maximo - levar a repouso - evita move contrario if
(velocidade_atual < 0) {
velocidade_atual = 0;
}
}
6. Unity
• Mudança básica de fricção, aceleração
transformamos o movimento do player em um
caminhão de toneladas, ou em um carro de
fórmula 1
• Atenção: aceleração sempre maior que fricção:
– Senão não há movimento
• Testar valores exemplo:
– Aceleração 1.5 e Fricção 0.1
7. Unity
• Inserindo controle básico de rotação pelo
mouse
• transform.Rotate(Vector3);
var rotacao = 0.0;
var forca_rotacao = 2;
...
//Inserindo rotacao basica com mouse
rotacao = Input.GetAxis("Mouse X") * forca_rotacao;
transform.Rotate(Vector3(0, rotacao, 0));
8. Unity
• Necessidade de transformar a forca de
movimento (velocidade) em relação a
orientação atual
• transform.TransformDirection()
• Necessário Vector3
– para transformação
– para resultado
9. Unity
var velocidade_vetor : Vector3;
....
//uso de vetor - transforma em vetor
velocidade_vetor =
transform.TransformDirection(Vector3(0, 0, velocidade_atual));
//Move sempre com a velocidade
var controller = GetComponent(CharacterController);
//controller.Move(Vector3(0, 0, velocidade_atual));
controller.Move(velocidade_vetor);
10. Unity
• Controlando velocidade pode-se, por exemplo,
transformá-la no momento de uma colisão
• Exemplos:
– Colidiu = perde parte da velocidade
– Colidiu = inverte a velocidade
• Fazer testes básicos colisão / velocidade
• Trabalhando a Física manualmente
– física realística = RigidBody