Independente do jogo que você está construindo, vai precisar que o player de alguma forma não sai do cenário, porém, em muitos casos é necessário que até mesmo a câmera não sai de uma determinada posição, seja para limitar o campo de visão dando deixando o jogo mais imersivo ou por limitações técnicas.
Vamos ver nesse artigo alguns scripts e videoaulas que vão te ajudar a limitar a posição da câmera dentro da Unity 3D.
Limitando o campo de visão da Câmera
Assista as nossas videoaulas abaixo, nelas criamos tanto um personagem para se mover pelo cenário, quanto o script para que a câmera não mostre mais do que o necessário.
Criando o cenário e movimentação do player
Nessa aula vamos criar nosso cenário com ajuda de cubos, plano e um cilindro que será o nosso player. Para dar mais dinamismo ao projeto, damos vida ao player incluindo um script que permite com que ele faça movimentações pelo cenário.
Criando o script que limita a posição da câmera
Uma vez que o script e o cenário está montado e funcionando, precisamos finalmente criar o script de movimentação da câmera, na qual a gente precisa especificar as posições mínimas e máximas para os Eixos X e Z, assim, fazendo com que a câmera pare de acompanhar o player em determinados pontos da tela.
Como o Mathf.Clamp funciona
A funcionalidade do Método Mathf.Clamp é bem simples, ela recebe os seguintes parâmetros:
- Value - Posição ou número atual a ser validade;
- Min - Qual a posição ou o menor número possível;
- Max - Qual a posição ou maior número possível.
Sempre que o método receber um valor que extrapole o valor mínimo permitido, então ela vai ignora-lo e vai retornar o valor mínimo especificado. O mesmo acontece para o valor máximo quando extrapolado.
Script limitação de câmera com Unity 3D
Abaixo estão os dois scripts criados durante as aulas, porém apenas inseri-los no seu projeto não vai resolver o problema, é necessário que você assista as duas videoaulas para entender como configura-los.
PlayerController.cs
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float velocidade = 10.0f;
void Update()
{
Vector3 pos = new Vector3(
Input.GetAxis("Horizontal"),
0,
Input.GetAxis("Vertical")
);
transform.Translate(pos * velocidade * Time.deltaTime);
}
}
CameraController.cs
using UnityEngine;
public class CameraController : MonoBehaviour
{
//Velocidade de movimentação, quanto maior, mais rápido
public float velocidade = 5.0f;
[Space(10)]
//Distância adicional do player
public Vector3 offset = Vector3.up;
//Player em cena
public Transform player;
[Space(15)]
//Posição min e max em X da câmera
public float[] xClamp = new float[2];
//Posição min e max em z da câmera
public float[] zClamp = new float[2];
//Roda a cada quadro
void Update()
{
//Cria uma nova variável e adiciona a posição do player a ela
Vector3 playerPos = player.position;
//Obtém a posição em X
float posX = Mathf.Clamp(playerPos.x, xClamp[0], xClamp[1]);
//Obtém a posição em z
float posZ = Mathf.Clamp(playerPos.z, zClamp[0], zClamp[1]);
//Movimenta a câmera suavimente até a posição do player
transform.position = Vector3.Lerp(
transform.position, //Posição autual
new Vector3(posX, 0, posZ) + offset, //Nova posição com o espaçamento
velocidade * Time.deltaTime //Tempo da transição
);
}
}
Por hora é isso, a gente se vê na próxima.