Como faço pra chamar a funçao de um script em outro ?
2 participantes
Página 1 de 1
Como faço pra chamar a funçao de um script em outro ?
Eu quero que toque muscas em diferentes momento do meu jogo . A primeira , creio eu , seria automatica só colocando pra iniciar quando o jogo for iniciado . A segunda musica eu queria que tocasse quando o jogador aperta play e nisso , pausar/parar a musica do menu . E uma terceira musica de game over , com a mesma dinamica da anterior . Só que eu nao to conseguindo fazer isso , eu criei um script chamado Music Manager pra controlar as musicas e tentei chamar a funça de PlayGameMusic no script GameManager mas o unity retornou esse erro : NullReferenceException: Object reference not set to an instance of an object
GameManager.OnEnable () (at Assets/Script/GameManager.cs:61)
esse é o script do MusicManager
GameManager.OnEnable () (at Assets/Script/GameManager.cs:61)
- Código:
using UnityEngine;
public class MusicManager : MonoBehaviour
{
public AudioClip menuMusic;
public AudioClip gameMusic;
public AudioClip gameOverMusic;
private AudioSource audioSource;
void Start()
{
audioSource = GetComponent<AudioSource>();
PlayMenuMusic();
}
public void PlayMenuMusic()
{
audioSource.Stop(); // para a música atual antes de reproduzir a nova
audioSource.clip = menuMusic;
audioSource.Play();
}
public void PlayGameMusic()
{
audioSource.Stop(); // para a música atual antes de reproduzir a nova
audioSource.clip = gameMusic;
audioSource.Play();
}
public void PlayGameOverMusic()
{
audioSource.Stop(); // para a música atual antes de reproduzir a nova
audioSource.clip = gameOverMusic;
audioSource.Play();
}
}
esse é o script do MusicManager
Dafaol- Iniciante
- PONTOS : 652
REPUTAÇÃO : 0
Respeito as regras :
Re: Como faço pra chamar a funçao de um script em outro ?
Uma forma de otimizar este código seria utilizar uma estrutura de dados para armazenar as músicas e o estado atual do jogo, em vez de ter três métodos diferentes para reproduzir cada música. Dessa forma, você poderia usar um único método para reproduzir a música atual de acordo com o estado do jogo. Além disso, você poderia considerar utilizar um pool de músicas para evitar a necessidade de parar e reproduzir a música toda vez que o estado do jogo mudar.
EXEMPLO:
Aqui, utilizei um enum para armazenar o estado atual do jogo e um array para armazenar as músicas. Em vez de ter três métodos diferentes para reproduzir cada música, usei um único método "PlayCurrentMusic" para reproduzir a música atual de acordo com o estado do jogo. Além disso, adicionei um método "ChangeGameState" para permitir que o estado do jogo seja alterado e a música seja atualizada de acordo.
Esse é apenas um exemplo, você pode continuar a ajustar esse código para atender às suas necessidades específicas.
Sobre Como chamar o método "ChangeGameState" em outro script, você precisaria primeiro obter uma referência para o componente MusicManager. Isso pode ser feito de várias maneiras, incluindo:
1. Usando o método "FindObjectOfType" para obter a instância única do componente MusicManager:
2. Usando o método "GetComponent" em um objeto que já tenha o componente MusicManager adicionado:
3. Adicionando um atributo [SerializeField] para a variável pública do componente MusicManager e, em seguida, conectando essa variável no editor Unity:
Uma vez que você tenha uma referência para o componente MusicManager, você pode chamar o método "ChangeGameState" passando o novo estado do jogo como argumento:
Essa é uma forma básica de se fazer, mas existem outras formas de se fazer, como utilizando ScriptableObject, Event e até mesmo Singleton, para não precisar ficar buscando pelo componente.
EXEMPLO:
- Código:
using UnityEngine;
public enum GameState { Menu, Game, GameOver }
public class MusicManager : MonoBehaviour
{
public AudioClip[] musicTracks;
public GameState currentState;
private AudioSource audioSource;
void Start()
{
audioSource = GetComponent<AudioSource>();
currentState = GameState.Menu;
PlayCurrentMusic();
}
public void PlayCurrentMusic()
{
audioSource.Stop();
switch (currentState)
{
case GameState.Menu:
audioSource.clip = musicTracks[0];
break;
case GameState.Game:
audioSource.clip = musicTracks[1];
break;
case GameState.GameOver:
audioSource.clip = musicTracks[2];
break;
}
audioSource.Play();
}
public void ChangeGameState(GameState newState)
{
currentState = newState;
PlayCurrentMusic();
}
}
Aqui, utilizei um enum para armazenar o estado atual do jogo e um array para armazenar as músicas. Em vez de ter três métodos diferentes para reproduzir cada música, usei um único método "PlayCurrentMusic" para reproduzir a música atual de acordo com o estado do jogo. Além disso, adicionei um método "ChangeGameState" para permitir que o estado do jogo seja alterado e a música seja atualizada de acordo.
Esse é apenas um exemplo, você pode continuar a ajustar esse código para atender às suas necessidades específicas.
Sobre Como chamar o método "ChangeGameState" em outro script, você precisaria primeiro obter uma referência para o componente MusicManager. Isso pode ser feito de várias maneiras, incluindo:
1. Usando o método "FindObjectOfType" para obter a instância única do componente MusicManager:
- Código:
MusicManager musicManager = FindObjectOfType<MusicManager>();
2. Usando o método "GetComponent" em um objeto que já tenha o componente MusicManager adicionado:
- Código:
MusicManager musicManager = gameObject.GetComponent<MusicManager>();
3. Adicionando um atributo [SerializeField] para a variável pública do componente MusicManager e, em seguida, conectando essa variável no editor Unity:
- Código:
[SerializeField]
private MusicManager musicManager;
Uma vez que você tenha uma referência para o componente MusicManager, você pode chamar o método "ChangeGameState" passando o novo estado do jogo como argumento:
- Código:
musicManager.ChangeGameState(GameState.GameOver);
Essa é uma forma básica de se fazer, mas existem outras formas de se fazer, como utilizando ScriptableObject, Event e até mesmo Singleton, para não precisar ficar buscando pelo componente.
Magnatah- Instrutor
- PONTOS : 3526
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: Como faço pra chamar a funçao de um script em outro ?
Aqui está um Exemplo de como o código poderia ser otimizado para usar um pool de músicas:
Aqui, criei um array de AudioSource que é usado como um pool de músicas. No método "Start", eu crio novos objetos AudioSource e os adiciono ao array. Em vez de parar e reproduzir a música toda vez que o estado do jogo muda, eu simplesmente troco a música atualmente reproduzida para a nova música e uso a variável "currentSourceIndex" para acompanhar qual objeto AudioSource está sendo usado atualmente.
Ao utilizar um pool de músicas, você evita a necessidade de parar e reproduzir a música toda vez que o estado do jogo muda, o que pode ajudar a melhorar o desempenho do jogo. Além disso, ao utilizar vários objetos AudioSource, você pode reproduzir músicas diferentes simultaneamente, o que pode ser útil em determinadas situações.
- Código:
using UnityEngine;
public enum GameState { Menu, Game, GameOver }
public class MusicManager : MonoBehaviour
{
public AudioClip[] musicTracks;
public GameState currentState;
private AudioSource[] audioSources;
private int currentSourceIndex = 0;
void Start()
{
audioSources = new AudioSource[3];
for (int i = 0; i < audioSources.Length; i++)
{
GameObject newAudioSource = new GameObject("Audio Source " + i);
newAudioSource.transform.parent = transform;
audioSources[i] = newAudioSource.AddComponent<AudioSource>();
}
currentState = GameState.Menu;
PlayCurrentMusic();
}
public void PlayCurrentMusic()
{
audioSources[currentSourceIndex].Stop();
switch (currentState)
{
case GameState.Menu:
audioSources[currentSourceIndex].clip = musicTracks[0];
break;
case GameState.Game:
audioSources[currentSourceIndex].clip = musicTracks[1];
break;
case GameState.GameOver:
audioSources[currentSourceIndex].clip = musicTracks[2];
break;
}
audioSources[currentSourceIndex].Play();
currentSourceIndex = (currentSourceIndex + 1) % audioSources.Length;
}
public void ChangeGameState(GameState newState)
{
currentState = newState;
PlayCurrentMusic();
}
}
Aqui, criei um array de AudioSource que é usado como um pool de músicas. No método "Start", eu crio novos objetos AudioSource e os adiciono ao array. Em vez de parar e reproduzir a música toda vez que o estado do jogo muda, eu simplesmente troco a música atualmente reproduzida para a nova música e uso a variável "currentSourceIndex" para acompanhar qual objeto AudioSource está sendo usado atualmente.
Ao utilizar um pool de músicas, você evita a necessidade de parar e reproduzir a música toda vez que o estado do jogo muda, o que pode ajudar a melhorar o desempenho do jogo. Além disso, ao utilizar vários objetos AudioSource, você pode reproduzir músicas diferentes simultaneamente, o que pode ser útil em determinadas situações.
Magnatah- Instrutor
- PONTOS : 3526
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 :
Tópicos semelhantes
» Como acessar a função de um outro Script? (Unity)
» Como faço para distanciar um objeto do outro pelo script?
» Como chamar animação sem passar por outro parâmetros?
» Script faz a função tudo certo na unity, já quando gero apk o script não faz a função
» chamar float de outro script
» Como faço para distanciar um objeto do outro pelo script?
» Como chamar animação sem passar por outro parâmetros?
» Script faz a função tudo certo na unity, já quando gero apk o script não faz a função
» chamar float de outro script
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos