Independente do jogo ou projeto que você está desenvolvendo, pode ser necessário interagir com objetos que estão no espaço 3D. Sabemos que interagir com a UI do Canvas é um processo simples, já objetos 3D nem tanto.
Felizmente a Unity 3D contém vários métodos e recursos que tornam o desenvolvimento muito mais simples e rápido, como é o caso da classe RayCast, com ela podemos lançar um raio a partir da posição do mouse e acessar o GameObject desejado.
Para o nosso exemplo, vamos utilizar dois scripts, ambos estão abaixo.
Destruindo um GameObject
Com esse script associado à um GameObject, podemos chamar o método DestroyMe(), para fazer a deleção.
DesroyCube.cs
using UnityEngine;
public class DestroyCube : MonoBehaviour
{
public void DestroyMe()
{
Destroy(this.gameObject);
}
}
Clicando em GameObjects
Os GameObjects não têm um evento de OnClick ou algo relacionado, para contornar isso, vamos criar uma classe que utiliza a câmera e o RayCast para lançar um raio até o ponto clicado seguindo a posição do mouse como referência.
RayCastClickScript.cs
using UnityEngine;
public class RayCastClickScript : MonoBehaviour
{
//Variável que recebe informações de onde o raio atingiu
private RaycastHit hit;
//Variável que vai montar o destino do raio
private Ray ray;
void Update()
{
//Verficamos se o botão do mouse esquerdo não foi pressionado
if (!Input.GetMouseButtonDown(0))
return;
//Criamos o raio como ponto de referência a posição da mouse em relação a câmera
this.ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//Através da classe Physics lançamos o raio e capturamos a saída na vriável hit
if (!Physics.Raycast(this.ray, out this.hit))
return;
//Exibimos o nome do GameObject que o raio atingiu
Debug.Log(this.hit.transform.name);
//Criamos uma variável do tipo DestroyCube e obtemos acesso ao componente do objeto clicado
DestroyCube destroyCube = this.hit.transform.GetComponent<DestroyCube>();
//Verificamos se o objeto tem o componente DestroyCube
if (destroyCube)
{
//Chamamos o método de destruir o cubo
destroyCube.DestroyMe();
//Encerramos o loop atual
return;
}
}
}
Continue aprendendo mais sobre esse assunto, assista nossa videoaula complementar.