Ereignissysteme in Unity3D

Guten Tag!

Heute möchte ich kurz über die Verwendung von Ereignissen sprechen, um Müll zu beseitigen und dem Code komplexe und dynamische Funktionen bereitzustellen. Es ist zu beachten, dass sich dieser Artikel mehr an Anfänger richtet, die mehr über Ereignissysteme erfahren möchten.

Wir werden diese ganze Angelegenheit am Beispiel eines Schallkontrollsystems analysieren. Mit diesem System können wir Musik und Sounds in den Spieleinstellungen aktivieren / deaktivieren.

Bevor wir eine Manager-Klasse erstellen, die die Sound- und Musikeinstellungen verwaltet, erstellen wir eine einfache serialisierbare Klasse. Es wird als Datenmodell zum Speichern in JSON verwendet.

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; // ,    } 

Jetzt können Sie mit dem Schreiben der Manager-Klasse beginnen. Wir werden es in der ersten Szene installieren. Dieser Manager ist ein globales Objekt und wird beim Wechsel von Szene zu Szene nicht gelöscht.

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

Nachdem der Manager bereit ist, können Sie ein leeres Objekt in Ihrer ursprünglichen Szene erstellen und es beispielsweise "_AUDIO_MANAGER" nennen und dann unsere Manager-Klasse hinzufügen. Sie können dies einfach tun, indem Sie das Menü Komponente hinzufügen für das Objekt aufrufen und "Game Manager" => "Audio Manager" auswählen.

Danach müssen wir eine Komponente schreiben, die wir mit AudioSource an jedes Objekt andocken.

 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; } } 

Auf diese Weise können wir die Sounds / Musik im Spiel steuern. Dieses Beispiel sagt in keiner Weise, wie es richtig gemacht wird, sondern zeigt nur die Funktionsweise des Ereignissystems und der Listener in Unity3D.

Und zum Schluss möchte ich darüber sprechen, was wir gerade benutzt haben. Im folgenden Beispiel wurde der Delegat deklariert, aus dem der Listener erstellt wurde:

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

Sie können die Leistung des Hörers unter bestimmten Bedingungen einstellen und bestimmte Methoden einhalten, die ausgeführt werden, wenn diese Bedingungen erfüllt sind.

Und mit Hilfe von Delegierten, auf deren Grundlage wir einen Listener erstellt haben, können Sie Rückruffunktionen erstellen. Dies kann besonders für asynchrone Methoden nützlich sein (z. B. beim Senden asynchroner POST-Anforderungen).

Ich hoffe, Sie finden meine kleine Erfahrung in dieser Angelegenheit nützlich und können dieses Beispiel auf Ihre Projekte anwenden. Gerne beantworte ich auch Ihre Fragen (wenn jemand etwas nicht versteht).

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


All Articles