Boa noite pessoal!
Estou precisando complementar uma ação no cenário abaixo:
estou precisando que quando eu der um click em uma gaveta(já está com animação para abrir) a câmera aproxime e dê um zoom como na figura 2 e depois que eu clicar fora volte à posição anterior.
posição desejada quando clicar:
Grato.
Eu pensei em algo como criar um objeto vazio e colocar ele em uma posição pré definida, ai quando clicar no objeto a câmera vai pra posição do objeto.
public Transform posCamera;
private void Update()
{
transform.position = Vector3.Lerp(transform.position, posCamera.position, Time.deltaTime * 1);
transform.rotation = Quaternion.Lerp(transform.rotation, posCamera.rotation, Time.deltaTime * 1);
}
Nesse script ai por exemplo, ele vai seguir tanto a posição quanto a rotação de forma suave, então é só ajustar tanto a posição quanto a rotação do objeto. Mas obviamente que só isso não é o suficiente, tem que ter mais informações, eu não sei por exemplo como o reconhecimento do objeto está sendo feito, quando clica em cima dele, quantos objetos tem em cena etc etc
Coloquei esse script dentro na gaveta para fazer animação da gaveta abrindo. Até aí tudo tranquilo, mas gostaria que nessa mesma execução a câmera direcionasse para a posição informada.
using UnityEngine;
public class AbrGAveta : MonoBehaviour
{
private Animator animator;
bool gavetaAberta;
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>(); // Obtém o componente Animator anexado ao objeto
gavetaAberta = false;
}
void OnMouseDown()
{
// Verifica se o Animator está presente e inicia a animação
if (animator != null)
{
if (gavetaAberta == true){
animator.SetTrigger("TrOpen");
}else{
animator.SetTrigger("TrClose");
}
gavetaAberta = !gavetaAberta;
}
}
}
essa aí é uma das gavetas qu`anexei o script para abertura da gaveta. Essa parte está funcionando, mas não sei como implementar para direcionar a câmera nesse nesmo script se possível for.
using UnityEngine;
public class Teste1 : MonoBehaviour
{
//Colocar esse script na câmera
[SerializeField] private Transform[] posCamera;//Arrastar os objetos criados em cena pra camera seguir
private Vector3 posInicialCamera;//Várial pra câmera voltar a posição inicial
private GameObject objetoAtual;//o objeto que o mouse colidiu vai ser colocado nessa váriavel
//pra conferir se ele tem o animator
int posicaoDestino = 0;//essa váriavel é a posição do game object que a câmera deve ir
bool gavetaAberta = false;
bool movCamera = false;
// Start is called before the first frame update
void Start()
{
posInicialCamera = transform.position;
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
//Toda vez que o botão do mouse for apertado, ele vai lançar um raio invisivel em direção
//ao objeto selecionado
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
string objeto = hit.collider.gameObject.tag;// váriavel que vai pegar a tag do objeto
//selecionado, pra ser usada no switch
objetoAtual = hit.collider.gameObject;//aqui ele vai pegar o game object apenas
switch (objeto)
{
case "Armario": //Se a tag for igual armário por exemplo, ai ele executa as ações
PosicaoDestinoCamera(0);//Posição que a câmera deve ir, nesse caso ele vai
//pro game object da posição zero, do vetor "PosCamera"
ExecutarAnimacao();
break;
case "Exemplo2":
PosicaoDestinoCamera(1);
ExecutarAnimacao();
break;
case "Exemplo3":
PosicaoDestinoCamera(2);
ExecutarAnimacao();
break;
}
}
}
//Quando clicar no objeto que tenha a tag igual movcamera se torna verdadeiro e ele executa a ação
if (movCamera)
{
MovimentarCamera(posicaoDestino);
}
//Retorna a posição inicial
if (Input.GetMouseButtonDown(1))
{
transform.position = posInicialCamera;
movCamera = false;
}
}
//Aqui é o método pra especificar pra onde a câmera deve ir, ele é chamado no switch
public void PosicaoDestinoCamera(int posicaoDestino)
{
movCamera = true;
this.posicaoDestino = posicaoDestino;
}
//Movimento suave da câmera até o ponto designado
public void MovimentarCamera(int poscamera)
{
transform.position = Vector3.Lerp(transform.position, posCamera[poscamera].position, Time.deltaTime * 1);
transform.rotation = Quaternion.Lerp(transform.rotation, posCamera[poscamera].rotation, Time.deltaTime * 1);
}
//Aqui ele executa a animação
public void ExecutarAnimacao()
{
if (objetoAtual.GetComponent<Animator>() != null)
{
Animator animator = objetoAtual.GetComponent<Animator>();
if (gavetaAberta == true)
{
animator.SetTrigger("TrOpen");
}
else
{
animator.SetTrigger("TrClose");
}
gavetaAberta = !gavetaAberta;
}
}
}
Eu fiz esse script ai, é só colocar ele na camera. O que tem que fazer é criar objetos vazios na cena, por exemplo, se tu quer que a câmera fique na frente do armário, coloca um objeto vazio na frente do armario e arrasta esse objeto vazio pra variável “PosCamera”.
A unica coisa que tem que alterar no script são as tags, ela tem que ser igual ao objeto na cena, da pra adicionar muito mais objetos e posições diferentes. A unica coisa que deu errado pra mim foi a parte das animações, talvez porque eu não saiba como está sendo feito, mas da pra arrumar. Mais um detalhe é que também da pra ajustar a rotação da câmera caso o objeto não esteja totalmente de frente, é só rotacionar o game object vazio. Se apertar o botão direito do mouse ele volta pra posição original, nesse caso ele ta voltando de forma brusca, mas da pra fazer algo melhor se quiser
1 curtida
Grato pelo apoio. Vai ajudar muito nesse aprendizado.
Funcionou tudo direitinho? da pra mudar várias coisas
1 curtida