Unity - SceneManager.LoadScene abre scene com objeto "vazio"
3 participantes
Página 1 de 1
Unity - SceneManager.LoadScene abre scene com objeto "vazio"
Boa tarde! Pessoal, seguinte
Quando o jogador inicia o jogo e vai até a scene principal do jogo, as coisas funcionam, daí se eu clicar na seta de voltar pra abandonar o jogo e voltar pra scene Inicia, ele volta normal, mas se for pro jogo novamente as coisas não funcionam normal como deveriam funcionar. Nessa situação, quando lanço o dado, ele não conclui a ação e dá esse erro
MissingReferenceException: The object of type 'Personagem' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
Ludo3DPowers.tratamentoRoboEquipeNaoPodemSeDeslocar (System.Int32 valorDado) (at Assets/SCRIPTS/[Ludo3DPowers_e_Poderes]/Ludo3DPowers/Ludo3DPowers.cs:2332)
Ludo3DPowers.recebeValorDoDado3D (System.Int32 numSorteado) (at Assets/SCRIPTS/[Ludo3DPowers_e_Poderes]/Ludo3DPowers/Ludo3DPowers.cs:956)
Dado3D+<aguardarResultado>d__57.MoveNext () (at Assets/SCRIPTS/Dado3D_ItemDadoNoCanvas/Dado3D.cs:289)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <685c48cf8f0b48abb797275c046dda6a>:0
A origem do erro está em "Dado3D.cs:289"
Não entendo, não faz sentido esse erro, pois o processo de mudança de scene é o mesmo. A mesma coisa acontece se o jogador concluir o jogo e ir pra scene da vitória. Se o Jogador Voltar pra scene principal do jogo, acontece o mesmo erro. Os Métodos que ficam nos botões são:
O Script do Carregamento na Scene de Carregamento é este:
O Método e a Coroutine que pegam o valor do Dado3D Aleatoriamente é:
Alguém sabe o que está acontecendo, se é alguma coisa que falta configurar na Unity quando se troca de scene? Obg!
Quando o jogador inicia o jogo e vai até a scene principal do jogo, as coisas funcionam, daí se eu clicar na seta de voltar pra abandonar o jogo e voltar pra scene Inicia, ele volta normal, mas se for pro jogo novamente as coisas não funcionam normal como deveriam funcionar. Nessa situação, quando lanço o dado, ele não conclui a ação e dá esse erro
MissingReferenceException: The object of type 'Personagem' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
Ludo3DPowers.tratamentoRoboEquipeNaoPodemSeDeslocar (System.Int32 valorDado) (at Assets/SCRIPTS/[Ludo3DPowers_e_Poderes]/Ludo3DPowers/Ludo3DPowers.cs:2332)
Ludo3DPowers.recebeValorDoDado3D (System.Int32 numSorteado) (at Assets/SCRIPTS/[Ludo3DPowers_e_Poderes]/Ludo3DPowers/Ludo3DPowers.cs:956)
Dado3D+<aguardarResultado>d__57.MoveNext () (at Assets/SCRIPTS/Dado3D_ItemDadoNoCanvas/Dado3D.cs:289)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <685c48cf8f0b48abb797275c046dda6a>:0
A origem do erro está em "Dado3D.cs:289"
Não entendo, não faz sentido esse erro, pois o processo de mudança de scene é o mesmo. A mesma coisa acontece se o jogador concluir o jogo e ir pra scene da vitória. Se o Jogador Voltar pra scene principal do jogo, acontece o mesmo erro. Os Métodos que ficam nos botões são:
- Código:
// Método que vai pra Scene "TelaInicial"
public void sceneTelaInicial() {
//print("MudaDeScene ::: sceneTelaInicial()");
// Salva o Nome da Scene Atual
PlayerPrefs.SetString("NomeDaSceneAtual", "TelaInicial");
PlayerPrefs.Save();
// Salva o Nome desta Scene para o caso dela ser a Anterior de "Creditos"
PlayerPrefs.SetString("SceneAnteriorASceneCreditos", "TelaInicial");
PlayerPrefs.Save();
// Abre a Scene
SceneManager.LoadScene("TelaInicial", LoadSceneMode.Single);
// Scene que tem o Canvas que tem a Área que Fecha todas as Janelas
// Tem que ser a Primeira. Se colocar na Última, ela fica na frente de tudo
SceneManager.LoadScene("AreaFechaJanelas", LoadSceneMode.Additive);
// Ícones das Telas
SceneManager.LoadScene("BotaoSairDoJogo", LoadSceneMode.Additive);
SceneManager.LoadScene("BotaoDasConfiguracoes", LoadSceneMode.Additive);
SceneManager.LoadScene("BotaoDoIdioma", LoadSceneMode.Additive);
SceneManager.LoadScene("BotaoDoSomNasTelasLojasCreditos", LoadSceneMode.Additive);
SceneManager.LoadScene("BotaoRaioDosPoderes", LoadSceneMode.Additive);
SceneManager.LoadScene("JanelaDasRegras", LoadSceneMode.Additive);// Nessa Ordem
}
// Método que vai pra Scene "CarregamentoLudo3DPowers" que faz o Carregamento da Scene de Ludo3DPowers Antes de Abrir o Jogo
public void sceneLudo3DPowers() {
print("MudaDeScene ::: sceneLudo3DPowers()");
// Salva o Nome da Scene Atual
PlayerPrefs.SetString("NomeDaSceneAtual", "Ludo3DPowers");
PlayerPrefs.Save();
// Vai pra Scene
SceneManager.LoadScene("CarregamentoLudo3DPowers", LoadSceneMode.Single);
}
// Método que vai pra Scene "VitoriaDoHumano"
public void sceneVitoriaDoHumano() {
//print("MudaDeScene ::: sceneVitoriaDoHumano()");
// Salva o Nome da Scene Atual
PlayerPrefs.SetString("NomeDaSceneAtual", "VitoriaDoHumano");
PlayerPrefs.Save();
// Abre a Scene "VitoriaDoHumano"
SceneManager.LoadScene("VitoriaDoHumano", LoadSceneMode.Single);
// Scene que tem o Canvas que tem a Área que Fecha todas as Janelas
// Tem que ser a Primeira. Se colocar na Última, ela fica na frente de tudo
SceneManager.LoadScene("AreaFechaJanelas", LoadSceneMode.Additive);
// Fica nessa ordem por causa das Janelas. Se essas Scenes estiverem Antes dos ícones acima, eles ficarão na frente das Janelas
SceneManager.LoadScene("BotaoSairDoJogo", LoadSceneMode.Additive);
SceneManager.LoadScene("BotaoDoSomDasVitorias", LoadSceneMode.Additive);
SceneManager.LoadScene("BotaoTotalDosPoderes", LoadSceneMode.Additive);
SceneManager.LoadScene("BotaoRaioDosPoderes", LoadSceneMode.Additive);
SceneManager.LoadScene("JanelaDaBarraDoNivelDoJogador", LoadSceneMode.Additive);
}
O Script do Carregamento na Scene de Carregamento é este:
- Código:
void Start() {
// Coroutine que Carrega a Scene Ludo3DPowres Assinconamente
StartCoroutine(delayCarregaLudo3DPowers(0f));
}
// Coroutine que Carrega a Scene Ludo3DPowres Assinconamente
IEnumerator delayCarregaLudo3DPowers(float tempo) {
yield return new WaitForSeconds(tempo);
//print("CarregamentoLudo3DPowers ::: delayCarregaLudo3DPowers()");
// Carregamento de Ludo3DPowers em 2º Plano
AsyncOperation asyncOperation = SceneManager.LoadSceneAsync("Ludo3DPowers");
// Carregando
while(!asyncOperation.isDone) {
// Progresso do Carregamento
progresso = asyncOperation.progress * 100f;
//print("CarregamentoLudo3DPowers ::: delayCarregaLudo3DPowers() ::: while() ::: progresso ::: " + progresso);
// Carregamento de 0 a 50
if(progresso >= 0 && progresso <= 50) {
// Carregamento na Tela
carregamento.sprite = spritesUsadosTelas.spCarregamento50;
}
// Carregamento Mais de 50
if(progresso > 50) {
// Carregamento na Tela
carregamento.sprite = spritesUsadosTelas.spCarregamento95;
}
// Espera o Próximo Frame. Se não tiver esse retorno, trava a Unity. Isso por causa do while
yield return null;
}
}
O Método e a Coroutine que pegam o valor do Dado3D Aleatoriamente é:
- Código:
// Método que lança o Dado na Posição que ele vai parar (A posição da Equipe da Vez)
public void lancarDado() {
//print("Dado3D ::: lancarDado()");
http://transform.position = posicaoDoDado;
transform.position = ludo3DPowers.equipes[ludo3DPowers.numEquipeAtual].posicaoLancamentoDado.transform.position;
// Rotacao Aleatoria do Dado
Vector3 rotacaoAleatoria = new Vector3(Random.Range(0, 360), Random.Range(0, 360), Random.Range(0, 360));
// Ângulo do Dado
transform.rotation = Quaternion.Euler(rotacaoAleatoria);
// Velocidade do Dado. Não esquecer de colocar "3" no Eixo "Y" em "posicaoDoDado" no Inspector.
// Ele impede do Dado3D vá mais que essa altura (3). Do contrário, o Dado voa desesperado e impede do jogo continuar
_rigidbody.velocity = new Vector3(0f, 3f, 0f);
// Faz o Dado girar a partir da rotação Aleatória
_rigidbody.AddRelativeTorque(rotacaoAleatoria);
// Chama a Coroutine AguardarResultado()
StartCoroutine(aguardarResultado());
}
// Coroutine que pega o Valor o Dado
public IEnumerator aguardarResultado() {
//print("Dado3D ::: aguardarResultado()");
// Equanto o Dado está Girando o fluxo fica aqui retornando null
while(!_rigidbody.IsSleeping()) {
yield return null;
}
// -----------------------------------------------------------------------------------------
// Quando o while para de rodar, o Dado "dorme" e o que vem aqui abaixo é rodado
// -----------------------------------------------------------------------------------------
numSorteado = 1;
numSorteado = Vector3.Dot(Vector3.up, -transform.up) > 0.6f ? 6 : numSorteado;
numSorteado = Vector3.Dot(Vector3.up, transform.forward) > 0.6f ? 3 : numSorteado;
numSorteado = Vector3.Dot(Vector3.up, -transform.forward) > 0.6f ? 4 : numSorteado;
numSorteado = Vector3.Dot(Vector3.up, transform.right) > 0.6f ? 5 : numSorteado;
numSorteado = Vector3.Dot(Vector3.up, -transform.right) > 0.6f ? 2 : numSorteado;
print("Dado3D ::: aguardarResultado() ::: numSorteado ::: " + numSorteado);
// Pega o Número Sorteado e o guarda em "OnNumSorteado" para que outros Scripts usem esse Valor
OnNumSorteado?.Invoke(numSorteado);
print("Dado3D ::: aguardarResultado() ::: OnNumSorteado");
// O Dado3D Desaparece
transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);
}
Alguém sabe o que está acontecendo, se é alguma coisa que falta configurar na Unity quando se troca de scene? Obg!
WLCS22- MembroAvançado
- PONTOS : 1404
REPUTAÇÃO : 56
Respeito as regras :
Re: Unity - SceneManager.LoadScene abre scene com objeto "vazio"
De acordo com a mensagem "O objeto do tipo 'Personagem' foi destruído mas você ainda está tentando acessá-lo."
Seu script deve verificar se é nulo ou você não deve destruir o objeto.
Seu script deve verificar se é nulo ou você não deve destruir o objeto.
Re: Unity - SceneManager.LoadScene abre scene com objeto "vazio"
Magnatah escreveu:De acordo com a mensagem "O objeto do tipo 'Personagem' foi destruído mas você ainda está tentando acessá-lo."
Seu script deve verificar se é nulo ou você não deve destruir o objeto.
Obg pela resposta!
É aí que tá, ele não foi Destruído. Quando vou pra scene do Jogo pela primeira vez, ele roda normalmente sem erro algum. Mas se eu voltar pra scene anterior e ir novamente pra scene do jogo, ele apresenta esse erro. O mesmo acontece se o jogador finalizar o jogo e ir pra scene da vitória, se ele voltar pra do jogo pra jogar novamente, acontece o mesmo erro. O Pior é que estou chamando os mesmos métodos nos botões. O esquema é assim:
Abertura > Tela Introdutória > Tela Inicial > Tela Offline > JOGO > Vitoria
O método que faz o jogador ir da Tela Inicial para a Tela Offline é o mesmo usado de JOGO voltando pra Tela Offline.
O mesmo acontece com a Vitória. O Método que faz o jogador voltar da Vitória para o JOGO é o mesmo da Tela Offline indo para JOGO. São os mesmos métodos, as mesmas scenes. Não deveria acontecer erro algum já que ele roda normal da 1ª vez.
Quando eu "corrijo" esse erro checando o Personagem, surge outro erro, e outro e assim vai. Daí eu teria que checar absolutamente tudo sem necessidade, já que ele funciona na 1ª vez que vai pra JOGO. Outra coisa que ele faz, se eu checar o "Personagem", ele diz que está null sem estar! Esse erro "Dado3D.cs:289" deve estar acontecendo, acredito eu, por faltar alguma coisa nessa mudança entre as scenes. Alguma coisa que está afetando essa Coroutine. Se ele está fazendo isso com uma Coroutine em um Script, deve estar fazendo com outros scripts também. O fato é que ao voltar novamente para JOGO, a scene não está sendo carregada corretamente. Esse erro mostra isso, eu só não sei oq é..
WLCS22- MembroAvançado
- PONTOS : 1404
REPUTAÇÃO : 56
Respeito as regras :
Re: Unity - SceneManager.LoadScene abre scene com objeto "vazio"
- Código:
alert("ola");
Testando52732- Iniciante
- PONTOS : 2
REPUTAÇÃO : 0
Respeito as regras :

» [TUTORIAL] Como utilizar "Application.LoadLevel" na Unity 5 (SceneManager.LoadScene)
» UI duplicando numeração usando SceneManager.LoadScene
» unity não abre o link
» [TUTORIAL] Unity 5.3 Scene Management, Scene Manage, Loading.
» Objeto que abre arquivos ao encostar
» UI duplicando numeração usando SceneManager.LoadScene
» unity não abre o link
» [TUTORIAL] Unity 5.3 Scene Management, Scene Manage, Loading.
» Objeto que abre arquivos ao encostar
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos