Sistemas de eventos en Unity3D

Buen dia

Hoy me gustaría hablar brevemente sobre el uso de eventos para deshacerse de la basura y proporcionar una funcionalidad compleja y dinámica al código. Cabe señalar que este artículo se centra más en los principiantes que desean aprender más sobre los sistemas de eventos.

Analizaremos todo este asunto utilizando el ejemplo de un sistema de control de sonido. Este sistema nos permitirá habilitar / deshabilitar música y sonidos en la configuración del juego.

Antes de crear una clase de administrador que gestionará la configuración de sonido y música, crearemos una clase simple serializable. Se utilizará como modelo de datos para guardar en 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; // ,    } 

Ahora puede comenzar a escribir la clase de administrador. Lo instalaremos en la primera escena. Este administrador será un objeto global y no se eliminará al pasar de una escena a otra.

 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(); //    } } 

Ahora que el administrador está listo, puede crear un objeto vacío en su escena inicial y nombrarlo, por ejemplo, "_AUDIO_MANAGER" , y luego agregarle nuestra clase de administrador. Puede hacerlo simplemente llamando al menú Agregar componente en el objeto y seleccionando "Game Managers" => "Audio Manager" .

Después de eso, necesitamos escribir un componente que acoplaremos a cada objeto con 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; } } 

De esta manera podemos controlar los sonidos / música en el juego. Este ejemplo no dice de ninguna manera cómo hacerlo correctamente, sino que solo muestra el funcionamiento del sistema de eventos y los oyentes en Unity3D.

Y finalmente, quiero hablar sobre lo que acabamos de usar. En el siguiente ejemplo, se declaró el delegado desde el que se creó el oyente:

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

Puede establecer el rendimiento del oyente bajo ciertas condiciones y aferrarse a ellos ciertos métodos que se realizarán cuando se cumplan estas condiciones.

Y con la ayuda de delegados, sobre la base de los cuales creamos un oyente, puede crear funciones de devolución de llamada. Esto puede ser especialmente útil para métodos asincrónicos (por ejemplo, al enviar solicitudes POST asincrónicas).

Espero que encuentre útil mi pequeña experiencia en este asunto y pueda aplicar este ejemplo a sus proyectos. También me complacerá responder sus preguntas (si alguien no comprende algo).

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


All Articles