[Duvida] Como chamar uma void criada por mim, apenas em determinados momentos.
4 participantes
Página 1 de 1
[Duvida] Como chamar uma void criada por mim, apenas em determinados momentos.
Quero por exemplo chamar a void UpdatePontos() a partir de outro script. se possivel até dentro da void OnTriggerEnter() do outro script, tem como? Se não, como chamá-la a partir de outro script?
Obrigado a todos.
Obrigado a todos.
Weslley- Moderador
- PONTOS : 5727
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: [Duvida] Como chamar uma void criada por mim, apenas em determinados momentos.
Bom, acho que não é o que eu pedi, como faço para chamar a void abaixo, por exemplo?
- Código:
pular(){
}
Re: [Duvida] Como chamar uma void criada por mim, apenas em determinados momentos.
Ora jovem, assim:
#EDIT:
Agora eu entendi, kkk.
Assim jovem:
onde Script é um objeto com referência, exceto quando a void pular é estática.
- Código:
pular();
#EDIT:
Agora eu entendi, kkk.
Assim jovem:
- Código:
Script.pular();
onde Script é um objeto com referência, exceto quando a void pular é estática.
NKKF- ProgramadorMaster
- PONTOS : 4818
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: [Duvida] Como chamar uma void criada por mim, apenas em determinados momentos.
Esses métodos da engine (Start, Update, FixedUpdate, OnTrigger e etc) não são métodos "comuns", eles se chamam eventos e são disparados num determinado momento, mediante a uma ação do jogador ou do jogo.
No caso dos Start, Update, FixedUpdate e Awake, são disparados de acordo com os frames do jogo, já os OnTrigger e OnCollision são disparados quando ocorrem colisões, OnMouseDown quando o jogador clica sobre o objeto, e assim por diante...
Para entender como funcionam esses "métodos especiais" ditos eventos, recomendo que leia este artigo: http://www.macoratti.net/12/06/c_event1.htm
Algo mais específico da Microsoft: https://docs.microsoft.com/pt-br/dotnet/standard/events/
E algo mais "light" de entender: https://www.devmedia.com.br/delegates-e-eventos-com-csharp-csharp-net/7050
Porém, na maioria das vezes, nós, game designers não precisamos nos preocupar com a criação de eventos próprios (que serão chamados de acordo com alguma ação contínua, como um clique de mouse, por exemplo) a própria Unity tem vários eventos já prontos que realmente já suprem a nossa necessidade, mas entender o conceito é importante para saber como manipular esses tipos de métodos.
Mas com relação à sua dúvida, a questão é bem mais simples: para chamar um método a partir de outra classe basta que o mesmo seja público (public) assim ele poderá ser acessado a partir de outras classes, como você deseja.
Porém, você precisa de uma referencia de onde esse método será chamado.
Digamos que você tenha uma classe chamada "Personagem" e essa classe possui o método que você citou "Pular()".
Também digamos que você queria que esse método seja chamado quando um Trigger for disparado, ou seja, o objeto que contém o script "Personagem" colidiu com algo.
Para tal, basta fazer:
Veja que dessa forma você possui dentro da variável "other" do Trigger a informação do objeto que colidiu, uma vez tendo essa informação você pode referenciar a classe que deseja manipular, eu por exemplo, utilizei o "GetComponent" para fazer acesso à classe "Personagem" e chamar o método "Pular" através dela.
Lembrando que o método 'pular' deve estar público para ser acessado externamente, assim:
Essa é uma das formas para acessar e chamar métodos externamente, através do GetComponent, mas existem outras formas como referenciar o objeto que possui a classe que tem o método de acesso através do inspector, utilizando as funções de "GameObject" Find, FindWithTag ou FindObjectWithType.
Referências das funções acima, dentro da documentação Unity:
Find
FindWithTag
FindObjectWithType
A diferença entre eles é básica: o primeiro vai buscar pelo objeto com o nome especificado, o segundo vai buscar pelo objeto com a tag específica e o último (o que eu mais uso, para essa situação) vai buscar pelo objeto que possui a classe(script) que você quer fazer acesso, por exemplo, buscar pelo objeto com o script "Personagem".
Outra forma bastante utilizada é quando você usa o "static" na assinatura do método, por exemplo:
Essa forma é mais direta e não precisa da referência do objeto que possui o método, basta chamar sua cllasse automaticamente:
Como mostrado pelo membro NKKF.
Porém, métodos estáticos são métodos que não pertencem a uma instância e sim a uma classe única, só pode ser usado por uma classe, é algo mais "geral" e possui algumas limitações, recomendo que dê uma lida aqui: https://www.caelum.com.br/apostila-csharp-orientacao-objetos/metodos-e-atributos-estaticos/
Como visto, existem várias formas, basta escolher qual é a que mais se adéqua ao seu problema.
No caso dos Start, Update, FixedUpdate e Awake, são disparados de acordo com os frames do jogo, já os OnTrigger e OnCollision são disparados quando ocorrem colisões, OnMouseDown quando o jogador clica sobre o objeto, e assim por diante...
Para entender como funcionam esses "métodos especiais" ditos eventos, recomendo que leia este artigo: http://www.macoratti.net/12/06/c_event1.htm
Algo mais específico da Microsoft: https://docs.microsoft.com/pt-br/dotnet/standard/events/
E algo mais "light" de entender: https://www.devmedia.com.br/delegates-e-eventos-com-csharp-csharp-net/7050
Porém, na maioria das vezes, nós, game designers não precisamos nos preocupar com a criação de eventos próprios (que serão chamados de acordo com alguma ação contínua, como um clique de mouse, por exemplo) a própria Unity tem vários eventos já prontos que realmente já suprem a nossa necessidade, mas entender o conceito é importante para saber como manipular esses tipos de métodos.
Mas com relação à sua dúvida, a questão é bem mais simples: para chamar um método a partir de outra classe basta que o mesmo seja público (public) assim ele poderá ser acessado a partir de outras classes, como você deseja.
Porém, você precisa de uma referencia de onde esse método será chamado.
Digamos que você tenha uma classe chamada "Personagem" e essa classe possui o método que você citou "Pular()".
Também digamos que você queria que esse método seja chamado quando um Trigger for disparado, ou seja, o objeto que contém o script "Personagem" colidiu com algo.
Para tal, basta fazer:
- Código:
void OnTriggerEnter(Collider other){
other.gameObject.GetComponent<Personagem>().Pular();
}
Veja que dessa forma você possui dentro da variável "other" do Trigger a informação do objeto que colidiu, uma vez tendo essa informação você pode referenciar a classe que deseja manipular, eu por exemplo, utilizei o "GetComponent" para fazer acesso à classe "Personagem" e chamar o método "Pular" através dela.
Lembrando que o método 'pular' deve estar público para ser acessado externamente, assim:
- Código:
public void Pular(){
//conteudo
}
Essa é uma das formas para acessar e chamar métodos externamente, através do GetComponent, mas existem outras formas como referenciar o objeto que possui a classe que tem o método de acesso através do inspector, utilizando as funções de "GameObject" Find, FindWithTag ou FindObjectWithType.
Referências das funções acima, dentro da documentação Unity:
Find
FindWithTag
FindObjectWithType
A diferença entre eles é básica: o primeiro vai buscar pelo objeto com o nome especificado, o segundo vai buscar pelo objeto com a tag específica e o último (o que eu mais uso, para essa situação) vai buscar pelo objeto que possui a classe(script) que você quer fazer acesso, por exemplo, buscar pelo objeto com o script "Personagem".
Outra forma bastante utilizada é quando você usa o "static" na assinatura do método, por exemplo:
- Código:
public static void Pular(){
}
Essa forma é mais direta e não precisa da referência do objeto que possui o método, basta chamar sua cllasse automaticamente:
- Código:
Personagem.Pular();
Como mostrado pelo membro NKKF.
Porém, métodos estáticos são métodos que não pertencem a uma instância e sim a uma classe única, só pode ser usado por uma classe, é algo mais "geral" e possui algumas limitações, recomendo que dê uma lida aqui: https://www.caelum.com.br/apostila-csharp-orientacao-objetos/metodos-e-atributos-estaticos/
Como visto, existem várias formas, basta escolher qual é a que mais se adéqua ao seu problema.
Tópicos semelhantes
» como chamar void do objeto em que o RayCast bateu?
» dúvida com void Start () ou void Update? qual usar !!! #HELP
» Chamar void à cada Frames/S
» como eu consigo chamar uma void pelo comando Input.GetKey?
» [DÚVIDA] Script teleporte, como esperar determinados segundos para teleportar
» dúvida com void Start () ou void Update? qual usar !!! #HELP
» Chamar void à cada Frames/S
» como eu consigo chamar uma void pelo comando Input.GetKey?
» [DÚVIDA] Script teleporte, como esperar determinados segundos para teleportar
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos