1
resposta

[Dúvida] error CS0029: Cannot implicitly convert type 'Obstaculo' to 'Obstaculo[]'

Estou com esse erro persistente no meu código, não sei resolver e estava tentando fazer acompanhando o professor

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Diretor : MonoBehaviour{
    [SerializeField]
    private GameObject imagemGameOver;
    private Aviao aviao;

    private void Start(){
        this.aviao = GameObject.FindObjectOfType<Aviao>();
    }

    public void FinalizarJogo(){
        Time.timeScale = 0;
        this.imagemGameOver.SetActive(true);
    }
    public void ReiniciarJogo(){
        this.imagemGameOver.SetActive(false);
        Time.timeScale = 1;
        this.aviao.Reiniciar();
        this.DestruirObstaculos();
    }

    private void DestruirObstaculos()
    {
        Obstaculo[] obstaculos = GameObject.FindObjectOfType<Obstaculo>();
        foreach(Obstaculo obstaculo in obstaculos)
        {
            obstaculo.Destruir();
        }
    }
}
1 resposta

O erro CS0029 indica que você está tentando converter um tipo em outro que não é compatível. No seu caso, você está tentando atribuir o resultado de GameObject.FindObjectOfType<Obstaculo>() (que retorna um único objeto Obstaculo) a uma variável do tipo array de Obstaculo[].

O método FindObjectOfType<T>() retorna apenas uma única instância de Obstaculo. Se você quer retornar todos os Obstaculo em sua cena, você deve usar FindObjectsOfType<T>() (note o 's' em 'Objects').

Aqui está a correção para o seu método DestruirObstaculos():

private void DestruirObstaculos()
{
    Obstaculo[] obstaculos = GameObject.FindObjectsOfType<Obstaculo>();
    foreach(Obstaculo obstaculo in obstaculos)
    {
        obstaculo.Destruir();
    }
}

Agora, GameObject.FindObjectsOfType<Obstaculo>() retorna um array de objetos Obstaculo, que é o que você esperava.