[Unity 5] Problema com GameObject.Find(string);
5 participantes
Página 1 de 1
[Unity 5] Problema com GameObject.Find(string);
Bom, estou criando uma espécie de diálogo, não estou usando textos porque não tem como fazer o efeito que eu quero em textos da Unity, ai faço a fala no PS e jogo ao projeto, ai então resolvi criar uma void, que possa sempre ser acessada por outros scripts, para que eu não tenha que sempre programar umas 70 linhas em cada diálogo, mas percebi algum problema na hora de encontrar o GameObject que eu quero, segue o script:
Eu coloquei um Debug.Log para ver o problema, porém nem debuga no console, eu, sinceramente, não sei qual é o problema, sendo que funciona com os outros GameObjects.
Acontece um erro no console no console também:
Link: https://imgur.com/a/27Jql
- Código:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class Dialogo : MonoBehaviour {
public GameObject[] textosDialogo;
public AudioSource efeitoSonoroBalao;
private GameObject[] caixaDialogo;
public string[] falas, dialogos;
void Awake(){
}
void Start () {
encontrarFalasEDialogos (textosDialogo, caixaDialogo, falas, dialogos);
}
public static void encontrarFalasEDialogos(GameObject[] falas, GameObject[] caixasDeDialogo, string[] nomeFalas, string[] nomeDialogo){
if (falas.Length <= 5) {
nomeFalas[0] = "1stDialogoPt1";
nomeFalas[1] = "1stDialogoPt2";
nomeFalas[2] = "2ndDialogoPt1";
nomeFalas[3] = "2ndDialogoPt2";
falas [0] = GameObject.Find (nomeFalas[0].ToString());
falas [1] = GameObject.Find (nomeFalas[1].ToString());
falas [2] = GameObject.Find (nomeFalas[2].ToString());
falas [3] = GameObject.Find (nomeFalas[3].ToString());
falas [0].SetActive (false);
falas [1].SetActive (false);
falas [2].SetActive (false);
falas [3].SetActive (false);
}
if (falas.Length > 4 && falas.Length <= {
nomeFalas[4] = "3rdDialogoPt1";
nomeFalas[5] = "3rdDialogoPt2";
nomeFalas[6] = "4thDialogoPt1";
nomeFalas[7] = "4thDialogoPt2";
falas [4] = GameObject.Find (nomeFalas[4]);
falas [5] = GameObject.Find (nomeFalas[5]);
falas [6] = GameObject.Find (nomeFalas[6]);
falas [7] = GameObject.Find (nomeFalas[7]);
falas [4].SetActive (false);
falas [5].SetActive (false);
falas [6].SetActive (false);
falas [7].SetActive (false);
}
if (falas.Length > 8 && falas.Length <= 12) {
nomeFalas[4] = "5thDialogoPt1";
nomeFalas[5] = "5thDialogoPt2";
nomeFalas[6] = "6thDialogoPt1";
nomeFalas[7] = "6thDialogoPt2";
falas [8] = GameObject.Find (nomeFalas[8]);
falas [9] = GameObject.Find (nomeFalas[9]);
falas [10] = GameObject.Find (nomeFalas[10]);
falas [11] = GameObject.Find (nomeFalas[11]);
falas [8].SetActive (false);
falas [9].SetActive (false);
falas [10].SetActive (false);
falas [11].SetActive (false);
}
if (caixasDeDialogo.Length <= 3) {
nomeDialogo[0] = "caixaDialogo1";
nomeDialogo[1] = "caixaDialogo2";
caixasDeDialogo [0] = GameObject.Find (nomeDialogo[0]);
caixasDeDialogo [1] = GameObject.Find (nomeDialogo[1]);
caixasDeDialogo [0].SetActive (false);
caixasDeDialogo [1].SetActive (false);
Debug.Log ("" + nomeDialogo [0]);
}
}
}
- Código:
if (caixasDeDialogo.Length <= 3) {
nomeDialogo[0] = "caixaDialogo1";
nomeDialogo[1] = "caixaDialogo2";
caixasDeDialogo [0] = GameObject.Find (nomeDialogo[0]);
caixasDeDialogo [1] = GameObject.Find (nomeDialogo[1]);
caixasDeDialogo [0].SetActive (false);
caixasDeDialogo [1].SetActive (false);
Debug.Log ("" + nomeDialogo [0]);
}
Eu coloquei um Debug.Log para ver o problema, porém nem debuga no console, eu, sinceramente, não sei qual é o problema, sendo que funciona com os outros GameObjects.
Acontece um erro no console no console também:
Link: https://imgur.com/a/27Jql
ScorpionG4mer- Avançado
- PONTOS : 3448
REPUTAÇÃO : 45
Áreas de atuação : Inciante no C#, Arruaceiro no Blender
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
você não definiu o tamanho da matriz
Weslley- Moderador
- PONTOS : 5729
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
Como assim ? Onde eu posso consertar ?weslleyFx escreveu:você não definiu o tamanho da matriz
ScorpionG4mer- Avançado
- PONTOS : 3448
REPUTAÇÃO : 45
Áreas de atuação : Inciante no C#, Arruaceiro no Blender
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
- Código:
private GameObject[] caixaDialogo;
void Start(){
caixaDialogo = new GameObject[tamanho];
}
verifique se os nomes estão corretos
Weslley- Moderador
- PONTOS : 5729
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
Os nomes estão corretos, quando ao length eu defino pela Unity, fora do script.weslleyFx escreveu:
- Código:
private GameObject[] caixaDialogo;
void Start(){
caixaDialogo = new GameObject[tamanho];
}
verifique se os nomes estão corretos
ScorpionG4mer- Avançado
- PONTOS : 3448
REPUTAÇÃO : 45
Áreas de atuação : Inciante no C#, Arruaceiro no Blender
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
Nesta parte aqui:
void Start () {
encontrarFalasEDialogos (textosDialogo, caixaDialogo, falas, dialogos);
}
Onde você declarou a variável "encontrarFalasEDialogos"?
void Start () {
encontrarFalasEDialogos (textosDialogo, caixaDialogo, falas, dialogos);
}
Onde você declarou a variável "encontrarFalasEDialogos"?
George Lucas Vieira- Avançado
- PONTOS : 3394
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
wtf, "encontrarFalasEDialogos" é uma void, não uma variável ;-;George Lucas Vieira escreveu:Nesta parte aqui:
void Start () {
encontrarFalasEDialogos (textosDialogo, caixaDialogo, falas, dialogos);
}
Onde você declarou a variável "encontrarFalasEDialogos"?
ScorpionG4mer- Avançado
- PONTOS : 3448
REPUTAÇÃO : 45
Áreas de atuação : Inciante no C#, Arruaceiro no Blender
Respeito as regras :
ScorpionG4mer- Avançado
- PONTOS : 3448
REPUTAÇÃO : 45
Áreas de atuação : Inciante no C#, Arruaceiro no Blender
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
Bom dia brow! Atenção as regras do fórum, cuidado com o flood, regra número 3: "Não é permitido postar novamente em um tópico mais de duas vezes seguidas. Caso queira adicionar algo, edite o último post ou aguarde 24h."ScorpionG4mer escreveu:Alguém ? ...
Obrigado!
Re: [Unity 5] Problema com GameObject.Find(string);
Desculpe se eu estou infringindo alguma regra, é que na minha opinião, isso deve ser coisa simples ou um erro bobo meu, mas ainda não consegui encontrar até porque voltei a programar esses dias, precisava que alguém me ajudasse, desculpe o incômodo, vou esperar até amanhã :3dstaroski escreveu:Bom dia brow! Atenção as regras do fórum, cuidado com o flood, regra número 3: "Não é permitido postar novamente em um tópico mais de duas vezes seguidas. Caso queira adicionar algo, edite o último post ou aguarde 24h."ScorpionG4mer escreveu:Alguém ? ...
Obrigado!
ScorpionG4mer- Avançado
- PONTOS : 3448
REPUTAÇÃO : 45
Áreas de atuação : Inciante no C#, Arruaceiro no Blender
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
ScorpionG4mer escreveu:wtf, "encontrarFalasEDialogos" é uma void, não uma variável ;-;George Lucas Vieira escreveu:Nesta parte aqui:
void Start () {
encontrarFalasEDialogos (textosDialogo, caixaDialogo, falas, dialogos);
}
Onde você declarou a variável "encontrarFalasEDialogos"?
Eu passei o olho rápido pelo script e nem percebi a declaração do método. Enfim. Talvez o erro esteja aqui:
George Lucas Vieira- Avançado
- PONTOS : 3394
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
Eu notei isso e já arrumei, porém não conserta o erro.George Lucas Vieira escreveu:ScorpionG4mer escreveu:wtf, "encontrarFalasEDialogos" é uma void, não uma variável ;-;George Lucas Vieira escreveu:Nesta parte aqui:
void Start () {
encontrarFalasEDialogos (textosDialogo, caixaDialogo, falas, dialogos);
}
Onde você declarou a variável "encontrarFalasEDialogos"?
Eu passei o olho rápido pelo script e nem percebi a declaração do método. Enfim. Talvez o erro esteja aqui:
ScorpionG4mer- Avançado
- PONTOS : 3448
REPUTAÇÃO : 45
Áreas de atuação : Inciante no C#, Arruaceiro no Blender
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
Estranho. Pra mim não aparece nenhum erro além daquele. Como você consertou aquilo? Coloque aqui pra mim testar pfv.
George Lucas Vieira- Avançado
- PONTOS : 3394
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
null reference exception você esta tentando pegar algo que não existe verifique a linha do erro
Weslley- Moderador
- PONTOS : 5729
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
Script:George Lucas Vieira escreveu:Estranho. Pra mim não aparece nenhum erro além daquele. Como você consertou aquilo? Coloque aqui pra mim testar pfv.
- Código:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Dialogo : MonoBehaviour {
public bool x;
public float i;
public GameObject[] textosDialogo;
public AudioSource efeitoSonoroBalao;
private Image[] caixaDialogo;
public string[] falas;
public string[] dialogos;
void Awake(){
}
void Start () {
Falas_Dialogos (textosDialogo, falas, dialogos, caixaDialogo);
}
public void Falas_Dialogos(GameObject[] falas, string[] nomeFalas, string[] nomeDialogo, Image[] caixasDeDialogo){
if (falas.Length <= 5) {
nomeFalas[0] = "1stDialogoPt1";
nomeFalas[1] = "1stDialogoPt2";
nomeFalas[2] = "2ndDialogoPt1";
nomeFalas[3] = "2ndDialogoPt2";
falas [0] = GameObject.Find (nomeFalas[0].ToString());
falas [1] = GameObject.Find (nomeFalas[1].ToString());
falas [2] = GameObject.Find (nomeFalas[2].ToString());
falas [3] = GameObject.Find (nomeFalas[3].ToString());
falas [0].SetActive(false);
falas [1].SetActive (false);
falas [2].SetActive (false);
falas [3].SetActive (false);
falas [0].GetComponent<Image> ().fillAmount = 0;
falas [1].GetComponent<Image> ().fillAmount = 0;
falas [2].GetComponent<Image> ().fillAmount = 0;
falas [3].GetComponent<Image> ().fillAmount = 0;
}
if (falas.Length > 4 && falas.Length <= 8) {
nomeFalas[4] = "3rdDialogoPt1";
nomeFalas[5] = "3rdDialogoPt2";
nomeFalas[6] = "4thDialogoPt1";
nomeFalas[7] = "4thDialogoPt2";
falas [4] = GameObject.Find (nomeFalas[4]);
falas [5] = GameObject.Find (nomeFalas[5]);
falas [6] = GameObject.Find (nomeFalas[6]);
falas [7] = GameObject.Find (nomeFalas[7]);
falas [4].SetActive (false);
falas [5].SetActive (false);
falas [6].SetActive (false);
falas [7].SetActive (false);
falas [4].GetComponent<Image> ().fillAmount = 0;
falas [5].GetComponent<Image> ().fillAmount = 0;
falas [6].GetComponent<Image> ().fillAmount = 0;
falas [7].GetComponent<Image> ().fillAmount = 0;
}
if (falas.Length > 8 && falas.Length <= 12) {
nomeFalas[4] = "5thDialogoPt1";
nomeFalas[5] = "5thDialogoPt2";
nomeFalas[6] = "6thDialogoPt1";
nomeFalas[7] = "6thDialogoPt2";
falas [8] = GameObject.Find (nomeFalas[8]);
falas [9] = GameObject.Find (nomeFalas[9]);
falas [10] = GameObject.Find (nomeFalas[10]);
falas [11] = GameObject.Find (nomeFalas[11]);
falas [8].SetActive (false);
falas [9].SetActive (false);
falas [10].SetActive (false);
falas [11].SetActive (false);
falas [8].GetComponent<Image> ().fillAmount = 0;
falas [9].GetComponent<Image> ().fillAmount = 0;
falas [10].GetComponent<Image> ().fillAmount = 0;
falas [11].GetComponent<Image> ().fillAmount = 0;
}
if (caixasDeDialogo.Length > 0) {
nomeDialogo [0] = "caixaDialogo1";
nomeDialogo [1] = "caixaDialogo2";
caixasDeDialogo [0] = GameObject.Find (nomeDialogo [0]).GetComponent<Image> ();
caixasDeDialogo [1] = GameObject.Find (nomeDialogo [1]).GetComponent<Image> ();
caixasDeDialogo [0].gameObject.SetActive (false);
caixasDeDialogo [1].gameObject.SetActive (false);
}
}
ScorpionG4mer- Avançado
- PONTOS : 3448
REPUTAÇÃO : 45
Áreas de atuação : Inciante no C#, Arruaceiro no Blender
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
Erro:weslleyFx escreveu:null reference exception você esta tentando pegar algo que não existe verifique a linha do erro
NullReferenceException: Object reference not set to an instance of an object
Dialogo.Falas_Dialogos (UnityEngine.GameObject[] falas, System.String[] nomeFalas, System.String[] nomeDialogo, UnityEngine.UI.Image[] caixasDeDialogo) (at Assets/Scripts/Outros/Dialogo.cs:36)
Dialogo.Start () (at Assets/Scripts/Outros/Dialogo.cs:18)
ScorpionG4mer- Avançado
- PONTOS : 3448
REPUTAÇÃO : 45
Áreas de atuação : Inciante no C#, Arruaceiro no Blender
Respeito as regras :
Re: [Unity 5] Problema com GameObject.Find(string);
Ola, dei um olhada no teu código e gostaria de sugerir algumas coisa.
Uma delas é que evite usar array associativos, principalmente por índices.Se duas coisa andam juntas deveriam ser uma classe ou struct. Parece ser algo tosco, mas no final em um projeto grande isso pode acabar criando um bug.
Outra é sobre o .find(), evite sempre que possível, ele pode se tornar pesado, sempre que for possivel passe a referencia via inspector.
Como não sei exatamente o que voce estava fazendo, fiz um codigo de exemplo(em cima do que entendi, posso ter viajada), subi pro github se quiser olhar a minha viajada.
Repositorio com exemplo
pode ter erros, pois fiz agora de noite.Foi mais pra mostrar uma alternativa pra evitar usar dois vetores.
Usei assim, claro que depende do que tu esta fazendo.
Uma delas é que evite usar array associativos, principalmente por índices.Se duas coisa andam juntas deveriam ser uma classe ou struct. Parece ser algo tosco, mas no final em um projeto grande isso pode acabar criando um bug.
Outra é sobre o .find(), evite sempre que possível, ele pode se tornar pesado, sempre que for possivel passe a referencia via inspector.
Como não sei exatamente o que voce estava fazendo, fiz um codigo de exemplo(em cima do que entendi, posso ter viajada), subi pro github se quiser olhar a minha viajada.
Repositorio com exemplo
pode ter erros, pois fiz agora de noite.Foi mais pra mostrar uma alternativa pra evitar usar dois vetores.
- Código:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
[System.Serializable]
public class Fala
{
public GameObject falaGO;
Image falaImag;
public string nomeFala;
public void Init()
{
if (falaGO != null)
{
falaImag = falaGO.GetComponent<Image>();
falaImag.fillAmount = 0;
falaGO.SetActive(false);
}
else
{
Debug.LogWarning("Falta referencia da fala!");
}
}
internal void SetFill(float qt)
{
falaImag.fillAmount += qt;
}
internal float GetfillAmount()
{
return falaImag.fillAmount;
}
}
[System.Serializable]
public class Dialogo
{
public Fala[] falas;
int cur;
internal void Init()
{
for (int i = 0; i < falas.Length; i++)
{
falas[i].Init();
}
}
internal Fala GetNextFala()
{
if (cur >= falas.Length)
{
cur = 0;
}
Fala retorno = falas[cur];
cur++;
return retorno;
}
}
public class Dialogos : MonoBehaviour
{
public Dialogo[] dialogos;
int cur;
[SerializeField]
float velocidade = 1f;
public void Start()
{
cur = 0;
for (int i = 0; i < dialogos.Length; i++)
{
dialogos[i].Init();
}
}
public void Next()
{
if (cur >= dialogos.Length)
{
cur = 0;
}
Fala fala = dialogos[cur].GetNextFala();
cur++;
StartCoroutine(PreencheFala(fala));
}
IEnumerator PreencheFala(Fala fala)
{
fala.falaGO.SetActive(true);
while (fala.GetfillAmount() < 1f)
{
fala.SetFill(velocidade * Time.deltaTime);
yield return null;
}
}
}
Usei assim, claro que depende do que tu esta fazendo.
Altamir- Iniciante
- PONTOS : 3068
REPUTAÇÃO : 10
Idade : 40
Áreas de atuação : Programação, C# and PHP
Respeito as regras :
Tópicos semelhantes
» Pegar a string guardada em um GameObject e utiliza-la em um script;
» Problema Unity
» Problema com a unity ads
» Problema com Unity Ads
» Problema com vídeo em 360° na Unity
» Problema Unity
» Problema com a unity ads
» Problema com Unity Ads
» Problema com vídeo em 360° na Unity
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos