أنظمة الأحداث في 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/ar414155/


All Articles