Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Cannot implicitly convert type 'UnityEngine.GameObject' to 'UnityEngine.Transform

Olá! O erro "Assets\Scripts\GeradorChefe.cs(18,19): error CS0029: Cannot implicitly convert type 'UnityEngine.GameObject' to 'UnityEngine.Transform' " está aparecendo no meu console, mas não sei como corrigir e segui os passos da aula :/ Deixei alguma coisa de fora? Obrigada desde já!

   private float tempoParaProximaGeracao = 0;
    private float tempoEntreGeracoes = 60;
    public GameObject ChefePrefab;
    private ControlaInterface scriptControlaInterface;
    public Transform[] PosicoesPossiveisDeGeracao;
    private Transform jogador;

    private void Start(){

        tempoParaProximaGeracao = tempoEntreGeracoes;
        scriptControlaInterface = GameObject.FindObjectOfType(typeof(ControlaInterface)) as ControlaInterface;
        jogador = GameObject.FindWithTag(Tags.Jogador);
    }
3 respostas

Oi, Maria, tudo bem?

Tá faltando um pedaço do script, pode colar ele completo?

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

public class GeradorChefe : MonoBehaviour
{
    private float tempoParaProximaGeracao = 0;
    private float tempoEntreGeracoes = 05;
    public GameObject ChefePrefab;
    private ControlaInterface scriptControlaInterface;
    public Transform[] PosicoesPossiveisDeGeracao;
    private Transform jogador;

    private void Start(){

        tempoParaProximaGeracao = tempoEntreGeracoes;
        scriptControlaInterface = GameObject.FindObjectOfType(typeof(ControlaInterface)) as ControlaInterface;
        jogador = GameObject.FindWithTag(Tags.Jogador); //O PROBLEMA É INDICADO AQUI!
    }

    private void Update() {

        if(Time.timeSinceLevelLoad > tempoParaProximaGeracao){

            Vector3 posicaoDeCriacao = CalucularPosicaoMaisDistanteDoJogador();

            Instantiate(ChefePrefab, posicaoDeCriacao, Quaternion.identity);
            scriptControlaInterface.AparecerTextoChefeCriado();
            tempoParaProximaGeracao = Time.timeSinceLevelLoad + tempoEntreGeracoes; // note que tempoEntreGeracoes é 60, devido ao start!
        }
    }

    void OnDrawGizmos(){

        Gizmos.color = Color.blue;

        Gizmos.DrawWireSphere(transform.position, 2);
    }

    Vector3 CalucularPosicaoMaisDistanteDoJogador(){
        Vector3 posicaoDeMaiorDistancia = Vector3.zero;
        float maiorDistancia = 0;

        foreach (Transform posicao in PosicoesPossiveisDeGeracao){ //tradução: para cada elemento dotipo transform dentro da coleção POsicoesPOssiveisDeGeracao
            //posicao vai mudando de valor de elemento, ela vai assumindo qual elemento está na vez de acordo com a ordem definida na unity na coleção PosicoesPossiveisDeGeracao
            float distanciaEntreOJogador = Vector3.Distance(posicao.position, jogador.position);
            if(distanciaEntreOJogador> maiorDistancia){
                maiorDistancia = distanciaEntreOJogador;
                posicaoDeMaiorDistancia = posicao.position;
            }
        }



        return posicaoDeMaiorDistancia;
    }

}
solução!

Legal. Vi agora. É que quando a variável foi criada ela é do tipo Transform mas o GameObject.FindWithTag retorna um objeto do tipo GameObject.

Então teria que mudar para:

jogador = GameObject.FindWithTag(Tags.Jogador).transform;

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software