Sistemas de eventos no Unity3D

Bom dia

Hoje eu gostaria de falar brevemente sobre o uso de eventos para se livrar do lixo e fornecer funcionalidades complexas e dinĂąmicas ao cĂłdigo. Note-se que este artigo se concentra mais em iniciantes que desejam aprender mais sobre sistemas de eventos.

Analisaremos toda essa questĂŁo usando o exemplo de um sistema de controle de som. Este sistema nos permitirĂĄ ativar / desativar mĂșsicas e sons nas configuraçÔes do jogo.

Antes de criarmos uma classe gerenciadora que gerenciarĂĄ as configuraçÔes de som e mĂșsica, criaremos uma classe serializĂĄvel simples. SerĂĄ usado como um modelo de dados para salvar em JSON.

using System.Collections; using System.Collections.Generic; using UnityEngine; //============================================= // AudioSettingsModel // @usage model for audio settings // // Developed by CodeBits Interactive // https://cdbits.net/ //============================================= [System.Serializable] public class AudioSettingsModel { public bool music = true; // ,    public bool sounds = true; // ,    } 

Agora vocĂȘ pode começar a escrever a classe de gerente. Vamos instalĂĄ-lo na primeira cena. Este gerente serĂĄ um objeto global e nĂŁo serĂĄ excluĂ­do ao passar de uma cena para outra.

 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; //============================================= // Audio Manager // @usage works with audio settings // // Developed by CodeBits Interactive // https://cdbits.net/ //============================================= [AddComponentMenu("Game Managers/Audio Manager")] public class AudioManager : MonoBehaviour{ //   public static AudioManager instance = null; //   public static AudioSettingsModel settings = null; //    private static string _settings_path = ""; //      //   void Awake(){ //      _settings_path = Application.persistentDataPath + "/audioSettings.gdf"; // ,      if (instance == null){ //    instance = this; //      } //  ,    , //         //  DontDestroyOnLoad(gameObject); //     InitializeSettings(); } //   private void InitializeSettings(){ //      if (settings == null) settings = new AudioSettingsModel(); //    if (File.Exists(_settings_path)){ //      loadSettings(); //     } } //    public void loadSettings(){ string _data = File.ReadAllText(_settings_path); //      settings = JsonUtility.FromJson<AudioSettingsModel>(_data); //      } //    public void saveSettings(){ string _json_data = JsonUtility.ToJson(settings); //      File.WriteAllText(_settings_path, _json_data); //     } //     ,    //        public delegate void AudioSettingsChanged(); //    public event AudioSettingsChanged OnAudioSettingsChanged; //      // /  public void toggleSounds(bool enabled){ settings.sounds = enabled; //       saveSettings(_settings_path, settings); //   if (OnAudioSettingsChanged != null) OnAudioSettingsChanged(); //    } // /  public void toggleMusic(bool enabled){ settings.music = enabled; //       saveSettings(_settings_path, settings); //   if (OnAudioSettingsChanged != null) OnAudioSettingsChanged(); //    } } 

Agora que o gerente estĂĄ pronto, vocĂȘ pode criar um objeto vazio em sua cena inicial e nomeĂĄ-lo, por exemplo, "_AUDIO_MANAGER" e adicionar nossa classe de gerente a ele. VocĂȘ pode fazer isso simplesmente chamando o menu adicionar componente no objeto e selecionando “Game Managers” => “Audio Manager” .

Depois disso, precisamos escrever um componente que encaixaremos em cada objeto com o AudioSource.

 using System.Collections; using System.Collections.Generic; using UnityEngine; //============================================= // Audio Muter // @usage on/off audio sources on objects // // Developed by CodeBits Interactive // https://cdbits.net/ //============================================= [AddComponentMenu("Audio/Audio Muter Component")] public class AudioMuter : MonoBehaviour { //    public bool is_music = false; //      ,   AudioSource   . //   private AudioSource _as; // AudioSource private float _base_volume = 1F; //   AudioSource //   void Start(){ //   AudioSource     _as = this.gameObject.GetComponent<AudioSource>(); //   _base_volume = _as.volume; //    //    ,     _audioSettingsChanged, //   /   AudioManager.instance.OnAudioSettingsChanged += _audioSettingsChanged; //  //          / _audioSettingsChanged(); } //    void OnDestroy(){ AudioManager.instance.OnAudioSettingsChanged -= _audioSettingsChanged; //   } //     /  AudioSource private void _audioSettingsChanged(){ if (is_music) _as.volume = (AudioManager.settings.music) ? _base_volume : 0F; if (!is_music) _as.volume = (AudioManager.settings.sounds) ? _base_volume : 0F; } } 

Desta forma, podemos controlar os sons / mĂșsicas no jogo. Este exemplo nĂŁo diz de forma alguma como fazĂȘ-lo corretamente, mas apenas demonstra a operação do sistema de eventos e ouvintes no Unity3D.

E, finalmente, quero falar sobre o que acabamos de usar. No exemplo abaixo, o delegado a partir do qual o ouvinte foi criado foi declarado:

 public delegate void AudioSettingsChanged(); public event AudioSettingsChanged OnAudioSettingsChanged; 

VocĂȘ pode definir o desempenho do ouvinte sob certas condiçÔes e se apegar a eles certos mĂ©todos que serĂŁo executados quando essas condiçÔes forem alcançadas.

E com a ajuda de delegados, com base nos quais criamos um ouvinte, vocĂȘ pode criar funçÔes de retorno de chamada. Isso pode ser especialmente Ăștil para mĂ©todos assĂ­ncronos (por exemplo, ao enviar solicitaçÔes POST assĂ­ncronas).

Espero que vocĂȘ ache minha pouca experiĂȘncia Ăștil nesse assunto e possa aplicar este exemplo aos seus projetos. TambĂ©m ficarei feliz em responder Ă s suas perguntas (se alguĂ©m nĂŁo entender alguma coisa).

Source: https://habr.com/ru/post/pt414155/


All Articles