Interagir com GameObject no espaço 3D da Unity

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

Publicado em

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.

 

Gunnar Correa
Gunnar Correa

Autodidata, Graduado em Desenvolvimento Web, Especialista em Tecnologias na Educação e Pós-graduando em Segurança da Informação. Começou seus estudos na área de programação quando era criança, e atualmente, está estudando desenvolvimento de jogos. Fundador da SatellaSoft, criado em 2009 com o intuito de compartilhar conhecimento de forma gratuita e inédita.

Todos os nossos cursos em promoção
Todos os nossos cursos em promoção

Webstories

Todos os nossos cursos em promoção

Todos os nossos cursos em promoção

Deixe um comentário
Aguarde...
Todos os nossos cursos em promoção