Como eu faço pra pegar a posição de um prefab?

Eu pego o objeto pelo inspetor:
[SerializeField] private GameObject objeto;

void Update()
{
if (objeto.transform.position.x < 10)
{
//Executa Ação
}

}

O problema é que o quando o objeto é instanciado em cena, ele aparece com o nome " objeto(clone)", ou seja, é uma cópia do prefab e não o prefab original, então eu não consigo pegar a posição dele.
A solução que eu encontrei foi começar o objeto como nullo, e pegar ele toda vez que aparecer na cena:

void Update()
{
if(GameObject.FindGameObjectWithTag(“obj”))
_____ {
objeto =
GameObject.FindGameObjectWithTag(“obj”);
_____}
}

Nesse caso, eu só preciso que ele seja instanciado e ao chegar em determinada posição, ele seja destruído, e que isso se repita toda vez que ele for instanciado na cena.
Porém eu não acho que essa seja uma solução muito boa, se alguém souber como eu posso melhorar isso…

1 curtida

Uma abordagem melhor seria instanciar o objeto, e ter nele próprio um script de controle, onde você pode mover, executar ações, destruir o objeto… Isso elimina a necessidade de ficar buscando o objeto a cada frame. Veja como poderia ser feito:

public class ObjectController : MonoBehaviour
{
    private void Update()
    {
        if (transform.position.x < 10)
        {
            // Executa ação
            Destroy(gameObject); // Destrói o objeto ao atingir a condição
        }
    }
}

Nesse caso, você adiciona esse script ao prefab do objeto. Cada instância do objeto gerenciará sua própria ação e destruição sem precisar de outro script para monitorá-la.

Solução 2: Referenciar o objeto instanciado diretamente

Se você precisa que outro script monitore o objeto, você pode manter uma referência ao objeto instanciado diretamente:

[SerializeField] private GameObject prefab;
private GameObject objetoInstanciado;

void Update()
{
    if (objetoInstanciado == null) 
    {
        // Instancia o objeto e guarda a referência
        objetoInstanciado = Instantiate(prefab);
    }

    if (objetoInstanciado.transform.position.x < 10)
    {
        // Executa ação
        Destroy(objetoInstanciado);
        objetoInstanciado = null; // Limpa a referência após a destruição
    }
}

Nesse exemplo, objetoInstanciado é uma referência direta ao objeto instanciado, eliminando a necessidade de buscá-lo repetidamente com FindGameObjectWithTag.

2 curtidas