Unity3D中的事件系统

美好的一天!

今天,我想简要地谈谈使用事件来摆脱垃圾并为代码提供复杂和动态的功能。 应该注意的是,本文的重点是希望更多地了解事件系统的初学者。

我们将使用声音控制系统的示例来分析整个问题。 该系统将允许我们启用/禁用游戏设置中的音乐和声音。

在创建用于管理声音和音乐设置的管理器类之前,我们将创建一个简单的可序列化类。 它将用作保存在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; // ,    } 

现在,您可以开始编写经理类了。 我们将在第一个场景中安装它。 该管理器将是一个全局对象,并且在从一个场景移动到另一个场景时不会被删除。

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

现在经理已经准备就绪,您可以在初始场景上创建一个空对象并将其命名为例如“ _AUDIO_MANAGER” ,然后将我们的经理类添加到其中。 您只需在对象上调用添加组件菜单,然后选择“游戏管理器” =>“音频管理器”,即可完成此操作

之后,我们需要编写一个组件,该组件将通过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; } } 

这样,我们可以控制游戏中的声音/音乐。 该示例没有以任何方式说明如何正确执行操作,而仅演示了Unity3D中事件系统和侦听器的操作。

最后,我想谈谈我们刚刚使用的内容。 在下面的示例中,声明了用于创建侦听器的委托:

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

您可以在特定条件下设置听众的演奏,并在满足这些条件时执行某些方法。

在代表的帮助下,我们创建了监听器,您可以创建回调函数。 这对于异步方法尤其有用(例如,在发送异步POST请求时)。

希望您发现我的一点经验对这件事有用,并且您可以将此示例应用于您的项目。 我也会很乐意回答您的问题(如果某人不了解某事)。

Source: https://habr.com/ru/post/zh-CN414155/


All Articles