Interagir com GameObject no espaço 3D da Unity

Utilizando a classe Raycast podemos acessar GameObjects no espaço 3D e seus componentes.

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.