Sistema de câmera - SnakeCam
2 participantes
Página 1 de 1
Sistema de câmera - SnakeCam
Estava aqui fazendo alguns sistemas de câmeras e me deparei com a seguinte situação, usando a câmera em terceira pessoa, quando eu movia o personagem perto demais de alguma parede, ela a atravessava.
Eu sei que normalmente o que se faz nesse caso é utilizar um raycast entre a câmera e o objeto que se quer manter em foco, ou usar uma sphere collider na câmera pra detectar a colisão e movê-la no sentido oposto. Mas eu resolvi simplificar e pensar em uma maneira de conseguir o mesmo resultado, porém, sem aquele movimento brusco de quando a câmera é jogada pra frente por conta de um objeto em seu caminho.
O resultado, é o que chamo de SnakeCam, porque esse nome? veja só como fica o caminho da câmera quando se ativa o DrawGizmos hehe :D
De forma resumida, eu vou mantendo uma lista das ultimas posições do objeto que quero manter em foco, e a câmera vai seguindo o caminho formado. Dessa forma, ela sempre vai ficar numa distância segura das paredes.
Pra usar, basta jogar o script na câmera e preencher o campo "Objeto Foco" com o seu personagem.
#Dica: Se for utilizar esse script num personagem que possui um RigidBody, ative a opção interpolação no RigidBody pra remover qualquer tremida da câmera;
#Dica: o campo altura ajusta apenas a altura do caminho que a câmera vai seguir, esse valor é relativo a origem do player, caso queira mudar a altura do foco, crie um objeto vazio dentro do seu personagem e jogue esse objeto no campo "objeto Foco";
Eu sei que normalmente o que se faz nesse caso é utilizar um raycast entre a câmera e o objeto que se quer manter em foco, ou usar uma sphere collider na câmera pra detectar a colisão e movê-la no sentido oposto. Mas eu resolvi simplificar e pensar em uma maneira de conseguir o mesmo resultado, porém, sem aquele movimento brusco de quando a câmera é jogada pra frente por conta de um objeto em seu caminho.
O resultado, é o que chamo de SnakeCam, porque esse nome? veja só como fica o caminho da câmera quando se ativa o DrawGizmos hehe :D
De forma resumida, eu vou mantendo uma lista das ultimas posições do objeto que quero manter em foco, e a câmera vai seguindo o caminho formado. Dessa forma, ela sempre vai ficar numa distância segura das paredes.
Pra usar, basta jogar o script na câmera e preencher o campo "Objeto Foco" com o seu personagem.
#Dica: Se for utilizar esse script num personagem que possui um RigidBody, ative a opção interpolação no RigidBody pra remover qualquer tremida da câmera;
#Dica: o campo altura ajusta apenas a altura do caminho que a câmera vai seguir, esse valor é relativo a origem do player, caso queira mudar a altura do foco, crie um objeto vazio dentro do seu personagem e jogue esse objeto no campo "objeto Foco";
- Código:
using UnityEngine;
public class RSSnakeCam : MonoBehaviour
{
public int numeroSegmentos = 21;
public float distanciaEntreSegmentos = 0.3f, suavizacao = 0.05f;
public Transform objetoFoco;
public float alturaCamera;
private float distancia;
private Vector3[] posicoes;
private Vector3 offset;
private Vector3 vel;
private void Start()
{
offset.y = alturaCamera;
posicoes = new Vector3[numeroSegmentos];
distancia = Vector3.Distance(transform.position, objetoFoco.position)/numeroSegmentos;
for (int i = 0; i < numeroSegmentos; i++){
posicoes[i] = objetoFoco.position+offset;
posicoes[i] += new Vector3(0, 0, -distanciaEntreSegmentos*i);
}
transform.position = posicoes[posicoes.Length - 1];
}
private void LateUpdate()
{
distancia = Vector3.Distance(posicoes[0], objetoFoco.position+offset);
if (distancia > distanciaEntreSegmentos)
{
posicoes[0] = objetoFoco.position + offset;
for (int i = posicoes.Length - 1; i > 0; i--)
{
posicoes[i] = posicoes[i - 1];
}
}
transform.position = Vector3.SmoothDamp(transform.position, posicoes[posicoes.Length-1], ref vel, .25f);
transform.LookAt(objetoFoco);
}
//private void OnDrawGizmos()
//{
// if (posicoes != null && posicoes.Length > 0)
// {
// Gizmos.color = Color.blue;
// for (int i = 0; i < posicoes.Length; i++)
// {
// Gizmos.DrawSphere(posicoes[i], 0.05f);
// }
// }
//}
}
Fagner- Moderador
- PONTOS : 4254
REPUTAÇÃO : 665
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: Sistema de câmera - SnakeCam
Interessante, gostei da sua ideia de melhorar essas coisas, voce esta a quanto tempo na programaçao?
Cristhofer Marques- Iniciante
- PONTOS : 1298
REPUTAÇÃO : 0
Idade : 21
Respeito as regras :
Tópicos semelhantes
» sistema de câmera + movimentação do player
» Ajuda com sistema de tiro de jogo com camera Top-Down
» [TUTORIAL] Sistema de câmera em primeira pessoa SIMPLES
» Ajuda com sistema de flecha com mira pareada com a câmera
» Sistema De Camera De Primeira Pessoa de um Veiculo Para Android
» Ajuda com sistema de tiro de jogo com camera Top-Down
» [TUTORIAL] Sistema de câmera em primeira pessoa SIMPLES
» Ajuda com sistema de flecha com mira pareada com a câmera
» Sistema De Camera De Primeira Pessoa de um Veiculo Para Android
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos