Dúvida sobre método de acesso as variáveis
2 participantes
Página 1 de 1
Dúvida sobre método de acesso as variáveis
Olá pessoal, estudo a pouco tempo C#, orientação a objetos infelizmente ainda não é meu forte, mas estou melhorando bastante.
Ao acompanhar alguns vídeos, ler documentações sobre a engine e acompanhar aqui no forum sobre Unity, já vi diversas formas de acesso as variáveis, então resolvi perguntar aqui qual seria o método mais adequado e os motivos para tal.
Fiz um pequeno Script de teste com os métodos que vejo o pessoal usando, scripts bem simples mesmo para discutir a dúvida.
Deixei da forma mais clara possível, quem souber responder, fico muito agradecido.
Ao acompanhar alguns vídeos, ler documentações sobre a engine e acompanhar aqui no forum sobre Unity, já vi diversas formas de acesso as variáveis, então resolvi perguntar aqui qual seria o método mais adequado e os motivos para tal.
Fiz um pequeno Script de teste com os métodos que vejo o pessoal usando, scripts bem simples mesmo para discutir a dúvida.
- Código:
using UnityEngine;
public class ClasseOrigem : MonoBehaviour {
public int valor = 1;
}
- Código:
using UnityEngine;
public class ClasseTeste : MonoBehaviour
{
int valorRecebe;
int valorRecebe2;
int valorRecebe3;
public void Start()
{
valorRecebe = FindObjectOfType<ClasseOrigem>().valor; //Método 1
valorRecebe2 = GetComponent<ClasseOrigem>().valor; //Método 2
ClasseOrigem a = GetComponent<ClasseOrigem>(); //Método 3
valorRecebe3 = a.valor;
print(valorRecebe);
print(valorRecebe2);
print(valorRecebe3);
}
}
Deixei da forma mais clara possível, quem souber responder, fico muito agradecido.
Re: Dúvida sobre método de acesso as variáveis
Os três estão certos, só o primeiro pode dar um resultado inesperado se tiver mais de um objeto na cena com esse script.
Eu uso sempre o segundo, mas dessa forma:
Mas isso claro, apenas se eu quiser ter acesso a outras propriedades da classe, e for utilizá-la mais de uma vez no código.
Agora, se a variável é algo que vale pro jogo todo e não é apenas uma propriedade de instância, como a vida do player por exemplo, que vai ser a mesma para todos os scripts, eu deixo ela como estática:
E chamo ela assim externamente:
Eu uso sempre o segundo, mas dessa forma:
- Código:
ClasseOrigem classe;
void Start(){
classe = GetComponent<ClasseOrigem>();
}
Mas isso claro, apenas se eu quiser ter acesso a outras propriedades da classe, e for utilizá-la mais de uma vez no código.
Agora, se a variável é algo que vale pro jogo todo e não é apenas uma propriedade de instância, como a vida do player por exemplo, que vai ser a mesma para todos os scripts, eu deixo ela como estática:
- Código:
public class Teste{
public static int vida;}
E chamo ela assim externamente:
- Código:
if(Teste.vida > 0)
Re: Dúvida sobre método de acesso as variáveis
Neste caso eu fiz este exemplo para discutir estes 3 métodos, não uso em projetos estes scripts, mas entendi o ponto.
Também conheço sobre variáveis e métodos estáticos.
Na questão de desempenho, tem alguma diferença?
Também conheço sobre variáveis e métodos estáticos.
Na questão de desempenho, tem alguma diferença?
Re: Dúvida sobre método de acesso as variáveis
Sim, é um pouco óbvio que você não utilize isso, só demonstrei também uma outra forma de declaração além das citadas.guimaraf escreveu:Neste caso eu fiz este exemplo para discutir estes 3 métodos, não uso em projetos estes scripts, mas entendi o ponto.
Também conheço sobre variáveis e métodos estáticos.
Na questão de desempenho, tem alguma diferença?
No caso de desempenho, o GetComponent dentro de métodos como o Update e o FixedUpdate pode não ser o mais recomendável de usar, como você pode ver nessa discussão no fórum da Unity: https://answers.unity.com/questions/712804/getcomponent-in-void-update.html portanto, o mais recomendável é sempre fazer essa referência no Start ou no Awake, como eu fiz no primeiro exemplo!
Já o FindObjectOfType é mais crítico, pois é como eu disse, ele pode gerar um resultado inesperado se mais de um objeto na cena tiver esse script, sem dizer o que a própria documentação da Unity cita:
Não é recomendável usar esse comando em métodos como Update porque ele é lento e pode diminuir o frame rate do seu jogo.Please note that this function is very slow. It is not recommended to use this function every frame. In most cases you can use the singleton pattern instead.
Você pode ler um tópico mais detalhado sobre a diferença entre GetComponent e FindObjectOfType nesse link: https://stackoverflow.com/questions/30310847/gameobject-findobjectoftype-vs-getcomponent
Com relação à performance entre os outros 2, não tem muita diferença, o segundo e o terceiro métodos são praticamente a mesma coisa, só que o terceiro é mais extenso e nesse caso não há tanta necessidade de fazer isso.
Mas há sempre o questionamento do que será melhor para seu código em determinada situação, porém na maioria dos casos, o segundo método é mais eficiente.
É óbvio que estamos discutindo esses métodos com relação à referência externa, mas no caso de querer ter acesso ao componente do próprio objeto que possui o script, o GetComponent é o ideal, aliás, essa é a função dele.
Re: Dúvida sobre método de acesso as variáveis
Muito obrigado, você me ajudou bastante, não sabia da recomendação da Unity sobre este tipo de evento.
Esta discussão deixe bem claro os motivos, o que eu queria saber, além da sua explicação é claro.
https://stackoverflow.com/questions/30310847/gameobject-findobjectoftype-vs-getcomponent
Muito obrigado.
Caso alguém queira fechar o tópico.
Esta discussão deixe bem claro os motivos, o que eu queria saber, além da sua explicação é claro.
https://stackoverflow.com/questions/30310847/gameobject-findobjectoftype-vs-getcomponent
Muito obrigado.
Caso alguém queira fechar o tópico.
Tópicos semelhantes
» Duvida sobre exceso de declaracao de variaveis publicas.
» [Duvida] Acesso a Classes no C#
» [RESOLVIDO] Duvida sobre versao da unity e sobre o lerp
» dúvida com variáveis
» [Duvida] Problemas com Variaveis/Vetores/Classe
» [Duvida] Acesso a Classes no C#
» [RESOLVIDO] Duvida sobre versao da unity e sobre o lerp
» dúvida com variáveis
» [Duvida] Problemas com Variaveis/Vetores/Classe
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos