[RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
3 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] 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.
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.
Alguém sabe o que está acontecendo, se é alguma coisa que falta configurar na Unity quando se troca de scene? Obg!
Última edição por WLCS22 em Ter Out 03, 2023 6:06 pm, editado 2 vez(es)
WLCS22- MembroAvançado
- PONTOS : 1945
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] 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.
Magnatah- Instrutor
- PONTOS : 3566
REPUTAÇÃO : 209
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras :
Re: [RESOLVIDO] 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 : 1945
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
- Código:
alert("ola");
Testando52732- Iniciante
- PONTOS : 444
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
Testando52732 escreveu:
- Código:
alert("ola");
Não entendi
WLCS22- MembroAvançado
- PONTOS : 1945
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
Pessoal, rodei até chegar no erro de fato. Tenho um Invoke() dentro de uma Coroutine. Esse Invoke() está assim:
"OnNumSorteado" é um Evento public static event System.Action<int> OnNumSorteado; declarado nos atributos do Script Dado3D.
O erro está acontecendo na linha OnNumSorteado?.Invoke(numSorteado);
Quando abro a scene do jogo pela 1ª vez, ele roda sem problemas. Mas quando abro ela da 2ª vez em diante, dá erro. O que está depois dessa linha OnNumSorteado?.Invoke(numSorteado); não é executado. O Erro é esse:
MissingReferenceException: The object of type 'Image' 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.recebeValorDoDado3D (System.Int32 numSorteado) (at Assets/SCRIPTS/[Ludo3DPowers_e_Poderes]/Ludo3DPowers/Ludo3DPowers.cs:890)
Dado3D+<aguardarResultado>d__58.MoveNext () (at Assets/SCRIPTS/Dado3D_ItemDadoNoCanvas/Dado3D.cs:295)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <685c48cf8f0b48abb797275c046dda6a>:0)
O problema não é no "MissingReferenceException" com o 'Image'. Ele é consequência do fato de o Invoke() não ter sido realizado sem erro no Script Dado3D quando a scene é aberta pela 2ª vez.
Uma das coisas que vi nas pesquisas é que o jogo poderia estar pausado. Não é, pois nem implementei isso. Infelizmente ainda não achei nada nas pesquisas sobre esse erro. Alguém me ajuda pfv! Desde já mt obg!
- Código:
private IEnumerator aguardarResultado() {
while(!_rigidbody.IsSleeping()) {
yield return null;
}
int 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;
OnNumSorteado?.Invoke(numSorteado);
horizontalLayoutGroup.enabled = true;
transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);
}
"OnNumSorteado" é um Evento public static event System.Action<int> OnNumSorteado; declarado nos atributos do Script Dado3D.
O erro está acontecendo na linha OnNumSorteado?.Invoke(numSorteado);
Quando abro a scene do jogo pela 1ª vez, ele roda sem problemas. Mas quando abro ela da 2ª vez em diante, dá erro. O que está depois dessa linha OnNumSorteado?.Invoke(numSorteado); não é executado. O Erro é esse:
MissingReferenceException: The object of type 'Image' 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.recebeValorDoDado3D (System.Int32 numSorteado) (at Assets/SCRIPTS/[Ludo3DPowers_e_Poderes]/Ludo3DPowers/Ludo3DPowers.cs:890)
Dado3D+<aguardarResultado>d__58.MoveNext () (at Assets/SCRIPTS/Dado3D_ItemDadoNoCanvas/Dado3D.cs:295)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <685c48cf8f0b48abb797275c046dda6a>:0)
O problema não é no "MissingReferenceException" com o 'Image'. Ele é consequência do fato de o Invoke() não ter sido realizado sem erro no Script Dado3D quando a scene é aberta pela 2ª vez.
Uma das coisas que vi nas pesquisas é que o jogo poderia estar pausado. Não é, pois nem implementei isso. Infelizmente ainda não achei nada nas pesquisas sobre esse erro. Alguém me ajuda pfv! Desde já mt obg!
WLCS22- MembroAvançado
- PONTOS : 1945
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
O "?" em "OnNumSorteado?.Invoke" é um operador de verificação de nulidade. Ele é usado para verificar se o objeto "OnNumSorteado" é nulo antes de invocá-lo. Isso é importante porque o método "Invoke" pode lançar uma exceção se o objeto for nulo.
O objeto "OnNumSorteado" é um método virtual. Isso significa que ele pode ser substituído por uma implementação personalizada em classes derivadas. Se o objeto "OnNumSorteado" for nulo, significa que a classe derivada não forneceu uma implementação para o método "OnNumSorteado". Nesse caso, o método "Invoke" lançará uma exceção.
O operador de verificação de nulidade é usado para verificar se o objeto "OnNumSorteado" é nulo antes de invocá-lo.
Se o objeto for nulo, o operador de verificação de nulidade retornará o valor null. Isso impedirá que o método "Invoke" lance uma exceção.
O objeto "OnNumSorteado" é um método virtual. Isso significa que ele pode ser substituído por uma implementação personalizada em classes derivadas. Se o objeto "OnNumSorteado" for nulo, significa que a classe derivada não forneceu uma implementação para o método "OnNumSorteado". Nesse caso, o método "Invoke" lançará uma exceção.
O operador de verificação de nulidade é usado para verificar se o objeto "OnNumSorteado" é nulo antes de invocá-lo.
Se o objeto for nulo, o operador de verificação de nulidade retornará o valor null. Isso impedirá que o método "Invoke" lance uma exceção.
Magnatah- Instrutor
- PONTOS : 3566
REPUTAÇÃO : 209
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras :
Re: [RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
Magnatah escreveu:O "?" em "OnNumSorteado?.Invoke" é um operador de verificação de nulidade. Ele é usado para verificar se o objeto "OnNumSorteado" é nulo antes de invocá-lo. Isso é importante porque o método "Invoke" pode lançar uma exceção se o objeto for nulo.
O objeto "OnNumSorteado" é um método virtual. Isso significa que ele pode ser substituído por uma implementação personalizada em classes derivadas. Se o objeto "OnNumSorteado" for nulo, significa que a classe derivada não forneceu uma implementação para o método "OnNumSorteado". Nesse caso, o método "Invoke" lançará uma exceção.
O operador de verificação de nulidade é usado para verificar se o objeto "OnNumSorteado" é nulo antes de invocá-lo.
Se o objeto for nulo, o operador de verificação de nulidade retornará o valor null. Isso impedirá que o método "Invoke" lance uma exceção.
magnatah, obg pela resposta!
É exatamente isso que está acontecendo. Quando abro pela 1ª vez, não é lançada nenhuma exceção e ele funciona normalmente, mas quando é da 2ª vez em diante ele lança essa exceção. os Eventos public static event System.Action<int> OnNumSorteado; tem alguma coisa a ver com o abrir uma scene?
WLCS22- MembroAvançado
- PONTOS : 1945
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
Verifique se a Classe Derivada forneceu uma implementação para o método "OnNumSorteado".
Tambem pode tentar algo simples, como verificar se "OnNumSorteado" é nulo, ante do invoque.
- Código:
if(OnNumSorteado == null)
{
Debug.Log("é nulo");
}
é simples mas é trabalho honesto.
Magnatah- Instrutor
- PONTOS : 3566
REPUTAÇÃO : 209
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras :
Re: [RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
Então, Magnatah, fiz assim
No console diz que ele está diferente de null, mas mesmo assim ele dá o mesmo erro.
Na 1ª que rodo a scene do jogo, não dá erro.
Mas da 2ª vez em diante dá esse mesmo erro.
Diante disso, entendo que o problema seja alguma coisa a ver com a mudança de scene.
por certo não era pra existir isso, pois a scene é destruída, mas acontece.
- Código:
if(OnNumSorteado == null) {
print("OnNumSorteado == null");
}
else {
print("OnNumSorteado != null");
}
No console diz que ele está diferente de null, mas mesmo assim ele dá o mesmo erro.
Na 1ª que rodo a scene do jogo, não dá erro.
Mas da 2ª vez em diante dá esse mesmo erro.
Diante disso, entendo que o problema seja alguma coisa a ver com a mudança de scene.
por certo não era pra existir isso, pois a scene é destruída, mas acontece.
WLCS22- MembroAvançado
- PONTOS : 1945
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
e se o método estiver sido chamado com atraso por algum script, antes da scene ser destruida?
"O método Invoke() do Unity é usado para agendar uma chamada de método para ocorrer em um momento posterior. A instrução Invoke(numSorteado); agenda o método numSorteado para ser chamado após um curto atraso."
"O método Invoke() do Unity é usado para agendar uma chamada de método para ocorrer em um momento posterior. A instrução Invoke(numSorteado); agenda o método numSorteado para ser chamado após um curto atraso."
Magnatah- Instrutor
- PONTOS : 3566
REPUTAÇÃO : 209
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras :
Re: [RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
Magnatah escreveu:e se o método estiver sido chamado com atraso por algum script, antes da scene ser destruida?
"O método Invoke() do Unity é usado para agendar uma chamada de método para ocorrer em um momento posterior. A instrução Invoke(numSorteado); agenda o método numSorteado para ser chamado após um curto atraso."
O Invoke() está dentro de uma Coroutine e o StartCoroutine dela está num Método que só é chamado em um Button lá no Canvas. Ele não é chamado mais em lugar nenhum. Esse Invoke() é dado um um Evento public static event System.Action<int> OnNumSorteado; não tem como dar erro.
Tanto é que ele não dá erro quando o Jogador vai pra Scene do Jogo pela 1ª Vez. Mas se for da 2ª em diante, dá esse erro. Não entendo pq ao mudar de scene, a anterior é destruída, não deveria ter esse erro, por isso que acho que tem alguma coisa a ver com a mudança de scene. Ele funciona bem na 1ª rodada, a bronca é da 2ª em diante.
Aí vi nas pesquisas que alguém teve o mesmo problema e a causa foi por que ele estava PAUSANDO o jogo. Isso interferiria no Invoke() ou na Coroutine por que mexe com o tempo. Mas eu nem implementando isso estou! O mesmo erros em vários contextos diferentes.
WLCS22- MembroAvançado
- PONTOS : 1945
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Unity - SceneManager.LoadScene abre scene com objeto "vazio"
Magnatah escreveu:e se o método estiver sido chamado com atraso por algum script, antes da scene ser destruida?
"O método Invoke() do Unity é usado para agendar uma chamada de método para ocorrer em um momento posterior. A instrução Invoke(numSorteado); agenda o método numSorteado para ser chamado após um curto atraso."
RESOLVIDO!
Magnatah, meu caro, tá vendo que o buraco era mais embaixo?! Pois bem.
"public static event System.Action<int> OnNumSorteado;" é uma STATIC. Ela não sofria alteração quando mudava de scene. Daí eu solicitava ela e ela por não ter sido recriada ou reiniciada no LoadScene dava esse erro. Daí nas Pesquisas encontrei esse Tópico, no Comentário feito por "3 respostas" tive a resposta.
No Script do Jogo tenho o Método "recebeValorDoDado3D(int numSorteado)" que está no Awake() e recebe de Dado3D na Linha "Dado3D.OnNumSorteado += recebeValorDoDado3D;" o Valor do Dado que foi Sorteado.
A Solução foi inserir a linha "Dado3D.OnNumSorteado -= recebeValorDoDado3D;" no Método "recebeValorDoDado3D(int numSorteado)" depois do Valor do Dado ser tratado! Também inseri nos Métodos "vitoriaDoHumano()" e "vitoriaDoRobo()" para testes, mas apesar disso, deixei neles também.
Fica aí o Tópico pra quem precisar.
Quem diria, o LoadScene não destrói a Scene por completo, ela deixa as variáveis estáticas dessa forma, pense.. Graças a Deus consegui resolver essa bronca. Obg pela atenção!
WLCS22- MembroAvançado
- PONTOS : 1945
REPUTAÇÃO : 60
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] Como utilizar "Application.LoadLevel" na Unity 5 (SceneManager.LoadScene)
» [RESOLVIDO] É possível alterar a cor de um objeto com o som na unity 3d?
» [RESOLVIDO] Unity 2018 nao abre o editor?
» Copiar de uma array de objeto para um objeto vazio
» [RESOLVIDO] Unity - Scene com poucas coisas, mas ainda pesada de mais!
» [RESOLVIDO] É possível alterar a cor de um objeto com o som na unity 3d?
» [RESOLVIDO] Unity 2018 nao abre o editor?
» Copiar de uma array de objeto para um objeto vazio
» [RESOLVIDO] Unity - Scene com poucas coisas, mas ainda pesada de mais!
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos