بازی Unity خود را با Firebase Remote Config ابزار کنید

۱. مقدمه

شما می‌توانید از Firebase Remote Config برای تعریف جفت‌های کلید-مقدار ، که به عنوان پارامتر نیز شناخته می‌شوند، در برنامه خود استفاده کنید و مقادیر آنها را در فضای ابری به‌روزرسانی کنید، که به شما امکان می‌دهد ظاهر و رفتار برنامه خود را بدون توزیع به‌روزرسانی برنامه تغییر دهید .

شما این قابلیت جدید را به یک بازی نمونه، MechaHamster: Level Up with Firebase Edition ، اضافه خواهید کرد. این بازی نمونه، نسخه جدیدی از بازی کلاسیک Firebase، MechaHamster، است که بیشتر قابلیت‌های داخلی Firebase آن حذف شده و به شما این امکان را می‌دهد که کاربردهای جدیدی از Firebase را به جای آنها پیاده‌سازی کنید.

برای اطمینان از اینکه برنامه شما طبق انتظار عمل می‌کند، تنظیمات پیش‌فرض را برای مقادیر موجود در کد بازی نمونه تنظیم خواهید کرد و این مقادیر می‌توانند توسط مقادیری که در Remote Config در کنسول Firebase تنظیم می‌کنید، لغو شوند.

آنچه یاد خواهید گرفت

  • نحوه تنظیم مقادیر Remote Config در فضای ابری و بازیابی آنها
  • چگونه کد سی‌شارپ یونیتی خود را طوری تنظیم کنیم که به طور خودکار از مقادیر بازیابی شده استفاده کند
  • نحوه ذخیره، ابزارسازی و لغو مقادیر/اشیاء مرکب به عنوان مقادیر JSON
  • نحوه استفاده از شرایط پیکربندی از راه دور برای ارائه انواع مقادیر مختلف به گروه‌های مختلف کاربران

آنچه نیاز دارید

  • یونیتی ۲۰۱۹.۱.۰f۱ یا بالاتر با پشتیبانی از ساخت iOS و/یا اندروید
  • یک دستگاه فیزیکی اندروید/iOS یا یک شبیه‌ساز/امولاتور برای ساخت و اجرای بازی

۲. محیط توسعه خود را تنظیم کنید

The following sections describe how to download the Level Up with Firebase code, open it in Unity, and add a Firebase project. This Level Up with Firebase sample game is used by several other Firebase + Unity codelabs, so you might have already completed the tasks in this section. If so, you can skip these steps and proceed to Add Firebase SDKs for Unity to add Remote Config to the sample game code.

کد را دانلود کنید

مخزن گیت‌هاب این codelab را از خط فرمان کلون کنید:

git clone https://github.com/firebase/level-up-with-firebase

از طرف دیگر، اگر git را نصب ندارید، می‌توانید مخزن را به صورت یک فایل ZIP دانلود کنید .

باز کردن Level Up با Firebase در ویرایشگر Unity

  1. Unity Hub را اجرا کنید و از تب Projects ، روی فلش کشویی کنار Open کلیک کنید.
  2. روی افزودن پروژه از دیسک کلیک کنید.
  3. به پوشه‌ای که کد در آن قرار دارد بروید و سپس روی تأیید کلیک کنید.
  4. در صورت درخواست، نسخه ویرایشگر Unity مورد استفاده و پلتفرم هدف خود (Android یا iOS) را انتخاب کنید.
  5. روی نام پروژه، level-up-with-firebase ، کلیک کنید تا پروژه در ویرایشگر Unity باز شود.
  6. اگر ویرایشگر شما به طور خودکار آن را باز نکرد، MainGameScene در Assets > Hamster در تب Project ویرایشگر Unity باز کنید.

برای اطلاعات بیشتر در مورد نصب و استفاده از یونیتی، به «کار در یونیتی» مراجعه کنید.

۳. فایربیس را به پروژه یونیتی خود اضافه کنید

ایجاد یک پروژه فایربیس

  1. با استفاده از حساب گوگل خود وارد کنسول فایربیس شوید.
  2. برای ایجاد یک پروژه جدید، روی دکمه کلیک کنید و سپس نام پروژه را وارد کنید (برای مثال، LevelUpWithFirebase ).
  3. روی ادامه کلیک کنید.
  4. در صورت درخواست، شرایط Firebase را مرور و قبول کنید و سپس روی ادامه کلیک کنید.
  5. (اختیاری) دستیار هوش مصنوعی را در کنسول Firebase (با نام "Gemini در Firebase") فعال کنید.
  6. برای این آزمایشگاه کد، برای استفاده بهینه از محصولات Firebase به Google Analytics نیاز دارید، بنابراین گزینه Google Analytics را فعال نگه دارید. برای تنظیم Google Analytics، دستورالعمل‌های روی صفحه را دنبال کنید.
  7. روی ایجاد پروژه کلیک کنید، منتظر بمانید تا پروژه شما آماده شود و سپس روی ادامه کلیک کنید.

برنامه خود را با Firebase ثبت کنید

  1. کنسول فایربیس را باز کنید و از مرکز صفحه نمای کلی پروژه، روی آیکون یونیتی کلیک کنید تا گردش کار راه‌اندازی شود یا اگر قبلاً برنامه‌ای به پروژه فایربیس خود اضافه کرده‌اید، روی افزودن برنامه کلیک کنید تا گزینه‌های پلتفرم نمایش داده شود.
  2. برای ثبت هر دو هدف ساخت اپل (iOS) و اندروید، انتخاب کنید.
  3. شناسه (شناسه‌های) مخصوص پلتفرم پروژه Unity خود را وارد کنید. برای این codelab، موارد زیر را وارد کنید:
  4. در صورت تمایل، نام مستعار مخصوص پلتفرم پروژه Unity خود را وارد کنید.
  5. روی ثبت برنامه کلیک کنید و به بخش دانلود فایل پیکربندی بروید.
  6. این فرآیند را برای هر هدف ساختی که بار اول انجام ندادید، تکرار کنید.

اضافه کردن فایل‌های پیکربندی فایربیس

پس از کلیک روی ثبت برنامه ، از شما خواسته می‌شود دو فایل پیکربندی (یک فایل پیکربندی برای هر هدف ساخت) را دانلود کنید. پروژه Unity شما برای اتصال به Firebase به فراداده Firebase در این فایل‌ها نیاز دارد.

  1. هر دو فایل پیکربندی موجود را دانلود کنید:
    • برای اپل (iOS) : فایل GoogleService-Info.plist را دانلود کنید.
    • برای اندروید : google-services.json را دانلود کنید.
  2. پنجره پروژه Unity خود را باز کنید، سپس هر دو فایل پیکربندی را به پوشه Assets منتقل کنید.
  3. به کنسول Firebase برگردید، در گردش کار تنظیمات، روی Next کلیک کنید و به Add Firebase SDKs for Unity بروید.

توجه: شما همیشه می‌توانید این فایل‌ها را بعداً با باز کردن تنظیمات عمومی پروژه، رفتن به پایین و رسیدن به بخش برنامه‌های شما (Your apps ) و سپس کلیک بر روی دکمه دانلود فایل پیکربندی مورد نظر، دوباره دانلود کنید.

اضافه کردن SDK های فایربیس برای یونیتی

  1. در کنسول فایربیس، روی دانلود Firebase Unity SDK کلیک کنید.
  2. SDK را در جایی مناسب از حالت فشرده خارج کنید.
  3. در پروژه یونیتی باز خود، به مسیر Assets > Import Package > Custom Package بروید.
  4. در پنجره‌ی «وارد کردن بسته» ، به پوشه‌ای که SDK از حالت فشرده خارج شده در آن قرار دارد بروید، FirebaseAnalytics.unitypackage را انتخاب کنید و سپس روی «باز کردن» کلیک کنید.
  5. از پنجره‌ی «وارد کردن بسته‌ی یونیتی» که ظاهر می‌شود، روی «وارد کردن» کلیک کنید.
  6. مراحل قبلی را برای وارد کردن دو بسته زیر تکرار کنید:
    • FirebaseRemoteConfig.unitypackage
    • FirebaseCrashlytics.unitypackage
      Crashlytics یک گزارشگر خرابی سبک و بلادرنگ است که به شما کمک می‌کند تا مشکلات پایداری را که کیفیت برنامه شما را کاهش می‌دهند، ردیابی، اولویت‌بندی و برطرف کنید. اگر قبلاً از آن استفاده نکرده‌اید، تکمیل مسیر یادگیری Crashlytics برای Unity را در نظر بگیرید.
  7. به کنسول Firebase برگردید و در گردش کار تنظیمات، روی Next کلیک کنید.

برای اطلاعات بیشتر در مورد افزودن SDK های Firebase به پروژه‌های Unity، به گزینه‌های نصب اضافی Unity مراجعه کنید.

۴. تنظیمات پیش‌فرض Remote Config را تنظیم کنید و مقادیر جدید را دریافت کنید

در این آزمایشگاه کد، شما اشیایی را که از مقادیر تعریف‌شده در کد استفاده می‌کنند یا در ویرایشگر Unity سریالی شده‌اند، به‌روزرسانی خواهید کرد تا از مقادیری که با Remote Config تجهیز شده‌اند، استفاده کنند. شما مقادیر پیش‌فرض را برای هر پارامتر با استفاده از SetDefaultsAsync پیکربندی خواهید کرد تا برنامه شما قبل از اتصال به Remote Config backend طبق انتظار رفتار کند. برنامه شما با دریافت مقادیر جدید از Remote Config و فعال‌سازی آنها برای قابل استفاده شدن در کد، به‌روز می‌ماند.

برای دریافت مقادیر جدید از Remote Config، تعدادی متد پیاده‌سازی نشده از قبل در فایل Assets/Hamster/Scripts/MainGame.cs وجود دارد که باید تکمیل شوند.

  1. دستورات using زیر را به MainGame.cs اضافه کنید:
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    using Firebase.RemoteConfig;
    
    ماژول Firebase.Extensions شامل برخی افزونه‌ها برای API وظایف C# است که به مدیریت فرآیند مقداردهی اولیه با فراخوانی‌های برگشتی ساده‌تر کمک می‌کند.
  2. با جایگزینی متد InitializeCommonDataAndStartGame() موجود با متد پیاده‌سازی نشده‌ی فعلی، InitializeFirebaseAndStartGame() ، مقداردهی اولیه‌ی Firebase را به متد Start() در MainGame.cs خود اضافه کنید:
    void Start()
    {
       Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
       InitializeFirebaseAndStartGame();
    }
    
  3. در MainGame.cs ، تابع InitializeFirebaseAndStartGame() را پیدا کنید. یک متغیر app تعریف کنید و پیاده‌سازی متد را به صورت زیر بازنویسی کنید:
    public Firebase.FirebaseApp app = null;
    
    // Begins the firebase initialization process and afterwards, opens the main menu.
    private void InitializeFirebaseAndStartGame()
    {
       Firebase.FirebaseApp.CheckAndFixDependenciesAsync()
       .ContinueWithOnMainThread(
          previousTask =>
          {
             var dependencyStatus = previousTask.Result;
             if (dependencyStatus == Firebase.DependencyStatus.Available) {
             // Create and hold a reference to your FirebaseApp,
             app = Firebase.FirebaseApp.DefaultInstance;
             // Set the recommended Crashlytics uncaught exception behavior.
             Crashlytics.ReportUncaughtExceptionsAsFatal = true;
             SetRemoteConfigDefaults();
             } else {
             UnityEngine.Debug.LogError(
                $"Could not resolve all Firebase dependencies: {dependencyStatus}\n" +
                "Firebase Unity SDK is not safe to use here");
             }
          });
    }
    
  4. مقداردهی اولیه Firebase در صورت موفقیت، SetRemoteConfigDefaults را برای تنظیم مقادیر پیش‌فرض درون برنامه فراخوانی می‌کند. متد SetRemoteConfigDefaults پیاده‌سازی نشده را با کد زیر جایگزین کنید:
    private void SetRemoteConfigDefaults()
    {
       var defaults = new System.Collections.Generic.Dictionary < string, object > ();
       defaults.Add(
          Hamster.MapObjects.AccelerationTile.AccelerationTileForceKey,
          Hamster.MapObjects.AccelerationTile.AccelerationTileForceDefault);
       defaults.Add(
          Hamster.States.MainMenu.SubtitleOverrideKey,
          Hamster.States.MainMenu.SubtitleOverrideDefault);
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       remoteConfig.SetDefaultsAsync(defaults).ContinueWithOnMainThread(
          previousTask =>
          {
             FetchRemoteConfig(InitializeCommonDataAndStartGame);
          }
       );
    }
    

۵. دریافت و فعال‌سازی مقادیر جدید (در صورت نیاز)

اکنون باید متد FetchRemoteConfig موجود را تکمیل کنیم. این کار فراخوانی‌های زنجیره‌ای به متدهای FetchAsync (که مقادیر جدید را از Remote Config دریافت می‌کند) و ActivateAsync (که مقادیر به‌دست‌آمده را فعال می‌کند تا در کد در دسترس باشند) از Remote Config را با استفاده از یک پارامتر فراخوانی به نام onFetchAndActivateSuccessful انجام می‌دهد.

کد راه‌اندازی که در مرحله قبل اضافه کردیم، FetchRemoteConfig با InitializeCommonDataAndStartGame به عنوان فراخوانی برگشتی خود فراخوانی می‌کند تا بازی را در انتهای دنباله شروع کند. می‌توانید فراخوانی‌های برگشتی جایگزین را به FetchRemoteConfig ارسال کنید تا واکشی را با نتایج مختلف فراخوانی کنید. یک مثال (که بعداً پیاده‌سازی خواهید کرد) ارسال متدی است که منوهای رابط کاربری جدیدی را باز می‌کند که به مقادیر Remote Config بستگی دارند. این باعث می‌شود منوها فقط پس از واکشی و فعال شدن آن مقادیر باز شوند.

  1. کد زیر را در FetchRemoteConfig قرار دهید:
    public void FetchRemoteConfig(System.Action onFetchAndActivateSuccessful)
    {
       if(app==null)
       {
          Debug.LogError($"Do not use Firebase until it is properly initialized by calling {nameof(InitializeFirebaseAndStartGame)}.");
          return;
       }
    
       Debug.Log("Fetching data...");
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       remoteConfig.FetchAsync(System.TimeSpan.Zero).ContinueWithOnMainThread(
          previousTask=>
          {
             if (!previousTask.IsCompleted)
             {
             Debug.LogError($"{nameof(remoteConfig.FetchAsync)} incomplete: Status '{previousTask.Status}'");
             return;
             }
             ActivateRetrievedRemoteConfigValues(onFetchAndActivateSuccessful);
          });
    }
    
  2. در مرحله بعد، متد ActivateRetrievedRemoteConfigValues ​​را که یک فراخوانی برگشتی به نام onFetchAndActivateSuccessful دریافت می‌کند، تکمیل کنید. پس از اتمام فعال‌سازی، فراخوانی برگشتی مشخص شده فراخوانی خواهد شد:
    private void ActivateRetrievedRemoteConfigValues(System.Action onFetchAndActivateSuccessful)
    {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       var info = remoteConfig.Info;
       if(info.LastFetchStatus == LastFetchStatus.Success)
       {
          remoteConfig.ActivateAsync().ContinueWithOnMainThread(
             previousTask =>
             {
             Debug.Log($"Remote data loaded and ready (last fetch time {info.FetchTime}).");
             onFetchAndActivateSuccessful();
             });
       }
    }
    

وقتی SetRemoteConfigDefaults از زمینه مقداردهی اولیه فراخوانی می‌شود، ActivateRetrievedRemoteConfigValues ​​نقطه شروع قبلی، InitializeCommonDataAndStartGame ، را برای شروع بازی با باز کردن منوی اصلی فراخوانی می‌کند.

۶. یک استراتژی بارگذاری Remote Config تنظیم کنید

برای دریافت و فعال‌سازی مقادیر در زمان دیگری در حین استفاده از برنامه، باید این توابع را دوباره فراخوانی کنید و اگر اشیاء مقادیر را ذخیره کرده باشند، باید برای انجام به‌روزرسانی به آنها اطلاع داده شود. برای تدوین استراتژی برای دریافت مجدد مقادیر Remote Config، در نظر بگیرید که چه زمانی به مقادیر جدید نیاز است و چه زمانی باید دریافت و فعال‌سازی مقادیر جدید را آغاز کنید تا از تغییر آنها در حین استفاده جلوگیری شود.

همانطور که در حال حاضر پیاده‌سازی شده است، مقادیر Remote Config هنگام شروع برنامه دریافت و فعال می‌شوند. دریافت‌ها می‌توانند در حین تغییر منو پنهان شوند و در عین حال تعامل را در طول انتقال مسدود کنند. علاوه بر این، این اغلب مناسب‌ترین زمان برای دریافت مقادیر جدید است، زیرا تغییر در وضعیت منو اغلب می‌تواند برای دانستن اینکه "بازیکن" به کجا می‌رود و پیش‌بینی اینکه از یک مقدار استفاده خواهد شد، استفاده شود.

با نگاهی به سیستم منوی Mechahamster، ساده‌ترین راه برای اضافه کردن قابلیت مسدود کردن به‌روزرسانی‌های منو توسط رابط کاربری، فراخوانی آن قبل از از سرگیری منوی اصلی (به‌ویژه زمانی که با خروج از منوی دیگر به آن دسترسی پیدا می‌کنید) و ارسال متد نمایش رابط کاربری به عنوان تابع onFetchAndActivateSuccessful . همین کار را می‌توان برای منوی Level Select نیز انجام داد.

With the initial load as part of app start-up, any menu navigation that goes through the main menu will be handled by the first of these, while any re-entrance of the Level Select menu will also cause a refresh. The initial entrance into the level select menu does not matter as it can only be accessed from the main menu and thus is already covered.

برای فعال کردن این قابلیت در برنامه، متدهای مربوطه را در منوی اصلی تکمیل کنید و فایل‌های انتخابی را سطح‌بندی کنید، که نمایش رابط کاربری را تا زمان تکمیل FetchAsync و ActivateAsync مسدود می‌کند:

  1. Assets/Hamster/Scripts/States/MainMenu.cs را باز کنید و متد Resume موجود را با کد زیر جایگزین کنید:
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.SelectAndPlayMusic(CommonData.prefabs.menuMusic, true);
       CommonData.mainGame.FetchRemoteConfig(InitializeUI);
    }
    
  2. فایل را ذخیره کنید.
  3. Assets/Hamster/Scripts/States/BaseLevelSelect.cs را باز کنید و متد Resume موجود را با کد زیر جایگزین کنید:
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.FetchRemoteConfig(ShowUI);
    }
    
  4. فایل را ذخیره کنید.

۷. اشکال‌زدایی/اعتبارسنجی رفتارهای واکشی

در این مرحله، انجام یک بررسی تشخیصی/اعتبارسنجی مفید است. روش زیر به شما امکان می‌دهد برنامه خود و نحوه/نحوه دریافت و فعال‌سازی مقادیر Remote Config را به صورت دستی آزمایش کنید.

این اطلاعات به عنوان بخشی از لاگ‌های شبیه‌ساز، دستگاه یا ویرایشگر شما چاپ می‌شوند. برای iOS، می‌توانید لاگ‌های دستگاه و شبیه‌ساز را در Xcode مشاهده کنید. برای اندروید، لاگ‌ها را با اجرای adb logcat مشاهده کنید. اگر کد را در Unity با فشار دادن Play در ویرایشگر اجرا کنید، لاگ‌ها در تب Console ظاهر می‌شوند.

  1. برنامه را بازسازی و اجرا کنید (در ویرایشگر، با استفاده از یک دستگاه یا شبیه‌ساز).
  2. پس از نمایش منوی اصلی بازی، خروجی گزارش بازی خود را بررسی کنید، که باید شامل گزارش‌های تولید شده توسط Debug.Log در FetchRemoteConfig و ActivateRetrievedRemoteConfigValues ​​باشد. این گزارش‌ها باید پیام‌های "در حال دریافت داده‌ها..." و "داده‌های از راه دور بارگذاری و آماده شده‌اند" را نشان دهند. به مهرهای زمانی ابتدای این پیام‌ها توجه کنید.
  3. در بازی، روی «مجوز» کلیک کنید.
  4. تأیید را فشار دهید.
  5. صبر کنید تا منوی اصلی بازی ظاهر شود.
  6. خروجی گزارش بازی خود را بررسی کنید، که باید مشابه موارد مرحله قبل باشد، با مهرهای زمانی جدید (مطابق با زمان تنظیم شده روی ساعت سیستمی که بازی را در آن اجرا می‌کنید).
  7. در بازی، روی «پخش» کلیک کنید.
  8. دکمه‌ی «بیا بچرخیم» را فشار دهید.
  9. با استفاده از کلیدهای جهت‌نمای کیبورد، توپ را به سمت دروازه هدایت کنید که منوی تکمیل سطح را باز می‌کند.
  10. سطوح را فشار دهید.
  11. صبر کنید تا منوی انتخاب سطح بارگذاری شود.
  12. خروجی گزارش بازی خود را دوباره بررسی کنید. باید با پیام‌های گزارش مراحل قبلی، به همراه مهرهای زمانی جدیدتر (مطابق با زمان تنظیم شده روی ساعت سیستمی که بازی را در آن اجرا می‌کنید) مطابقت داشته باشد.

اگر هر یک از این موارد در برنامه شما ظاهر نشد، ممکن است بخشی از جریان واکشی و فعال‌سازی (یا دستگاه شما) به اشتباه پیکربندی شده باشد. اگر اولین گزارش ظاهر نشد، احتمال دارد بازی شما شروع نشود. کنسول ویرایشگر یا گزارش‌های دستگاه/شبیه‌ساز را برای هشدارها و خطاهای مربوط به پروژه/محیط خود بررسی کنید و آنها را بررسی کنید - مشکل ممکن است به سادگی اتصال به اینترنت باشد.

اگر گزارش‌های اولیه از بارگذاری منو ظاهر می‌شوند، اما یکی از گزارش‌های بعدی ظاهر نمی‌شود، متدهای Resume را در Assets/Hamster/Scripts/States/MainMenu.cs و Assets/Hamster/Scripts/States/BaseLevelSelect.cs بررسی/دوباره پیاده‌سازی کنید.

۸. کد خود را ابزاربندی کنید

اکنون که مقادیر پارامترهای درون برنامه‌ای را در SetDefaultsAsync() پیکربندی کرده‌اید و جدیدترین نسخه‌ها را با FetchAsync() و ActivateAsync() در دسترس قرار داده‌اید، می‌توانید به این مقادیر در کد ارجاع داده و از آنها استفاده کنید.

پس از تنظیم مقادیر در Remote Config backend، دریافت آنها و فعال کردن آنها ( یا انجام هر دو کار به طور همزمان )، این مقادیر در برنامه شما در دسترس خواهند بود. برای استفاده از این مقادیر، GetValue(string key ) را فراخوانی کنید و یک پارامتر key را به عنوان آرگومان انتخاب کنید. این یک ConfigValue برمی‌گرداند که دارای ویژگی‌هایی برای دسترسی به مقدار به عنوان انواع مختلف پشتیبانی شده است: string ، bool ، long ، double . در این پروژه و اکثر موارد استفاده از بازی، باید دو نوع آخر را به int و float که اصطلاحاً رایج‌تر هستند، تبدیل کنید. برای اطمینان از اینکه این تبدیل‌ها مشکلی ایجاد نمی‌کنند، مطمئن شوید که مقادیر اولیه تنظیم شده در Remote Config در محدوده معتبر انواعی هستند که در کد برنامه خود استفاده خواهید کرد.

  1. با اضافه کردن using Firebase.RemoteConfig; به بالای فایل‌های زیر، Remote Config را وارد کنید:
    • Assets/Hamster/Scripts/States/MainMenu.cs
    • Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs
  2. متد Start از AccelerationTile.cs را جایگزین کنید:
    private void Start() {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       Acceleration = (float)remoteConfig.GetValue(AccelerationTileForceKey).DoubleValue;
    }
    
    با این تغییر، مقدار نیروی اعمال شده توسط کاشی شتاب به نیرویی که از Remote Config دریافت می‌شود، تغییر خواهد کرد.
  3. بدنه‌ی متد InitializeUI از MainMenu.cs را ویرایش کنید:
    private void InitializeUI() {
       if (menuComponent == null) {
          menuComponent = SpawnUI<Menus.MainMenuGUI>(StringConstants.PrefabMainMenu);
       }
    
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       var subtitleOverride = JsonUtility.FromJson<Menus.MainMenuGUI.SubtitleOverride>(
          remoteConfig.GetValue(SubtitleOverrideKey).StringValue);
       // Only sets values if all fields of the override are non-default.
       if(subtitleOverride != null && subtitleOverride.IsValidOverride())
       {
          menuComponent.MenuSubtitleText.text = subtitleOverride.text;
          menuComponent.MenuSubtitleText.fontSize = subtitleOverride.fontSize;
          menuComponent.MenuSubtitleText.color = subtitleOverride.textColor;
       }
       ShowUI();
    }
    
    در اینجا، subtitleOverride طوری تنظیم شده است که اگر تمام فیلدهای آن در ابر به عنوان مقادیری غیر از مقادیر پیش‌فرض نوعشان تنظیم شده باشند، زیرنویس را در صفحه منوی اصلی تغییر دهد.

۹. تنظیم مقادیر پارامترها از راه دور

اکنون که برنامه شما به طور کامل تجهیز شده است، آماده پیکربندی پارامترها و مقادیر در سرور Remote Config هستید. در این آزمایشگاه کد، این کار را با استفاده از کنسول Firebase انجام خواهیم داد.

  1. در کنسول Firebase ، پروژه خود را باز کنید.
  2. برای مشاهده داشبورد Remote Config، از منو گزینه Remote Config را انتخاب کنید.
  3. برای هر یک از پارامترهایی که در برنامه خود تعریف کرده‌اید و در جدول زیر فهرست شده‌اند، روی افزودن پارامتر کلیک کنید، نام پارامتر (کلید) را جای‌گذاری کنید، نوع داده فهرست‌شده در جدول را انتخاب کنید، استفاده از پیش‌فرض درون برنامه را غیرفعال کنید و مقدار پیش‌فرض جدید را جای‌گذاری کنید:

    نام پارامتر (کلید)

    نوع داده

    مقدار پیش‌فرض

    شتاب_کاشی_نیروی

    شماره

    ۱۰۰

    زیرنویس_حذف‌شده

    جی‌سون

    {"text":"We overwrote the subtitle","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}

    Remote Config Parameter editor with\nacceleration_tile_force populated
  4. برای ذخیره تغییرات، روی ذخیره کلیک کنید.
  5. برای انتشار پیکربندی جدید و در دسترس قرار دادن مقادیر جدید برای بازی خود، روی انتشار کلیک کنید.
  6. پس از تنظیم این پارامترهای ریموت، برنامه خود را دوباره اجرا کنید و مشاهده کنید که چگونه آنها پیش‌فرض‌های اصلی را نادیده می‌گیرند. Mechahamster main screen with Debug\nMenu enabled

۱۰. از شرایط Remote Config برای ارائه انواع مختلف استفاده کنید

ممکن است بخواهید تجربه برنامه را بر اساس زبانی که کاربر صحبت می‌کند، مکانی که در آن قرار دارد، زمان روز یا پلتفرمی که استفاده می‌کند، برای او فراهم کنید. شرایط پیکربندی از راه دور به شما این امکان را می‌دهد که از این ویژگی‌ها و سایر ویژگی‌ها به صورت جداگانه یا ترکیبی برای ارائه مقادیر مختلف (به نام متغیرها) به کاربر استفاده کنید.

یکی از کاربردهای رایج شرط‌ها، تغییر محتوا بین پلتفرم‌های iOS و اندروید است. برای پیاده‌سازی شرطی که بسته به پلتفرم مورد استفاده، مقدار متفاوتی برای subtitle_override ارائه می‌دهد، مراحل زیر را دنبال کنید.

  1. تب Remote Config پروژه خود را در کنسول Firebase باز کنید.
  2. روی دکمه ویرایش subtitle_override.
  3. در گوشه پایین سمت چپ، روی «افزودن جدید» کلیک کنید.
  4. در منوی کشویی که ظاهر می‌شود، نشانگر ماوس را روی گزینه‌ی «مقدار شرطی» (Conditional value) قرار دهید و روی «ایجاد شرط جدید» (Create new condition) کلیک کنید. Remote Config parameter editor:\nConditional value option
  5. وقتی از شما خواسته شد، اگر iOS را هدف قرار می‌دهید، شرط را «is iOS» یا اگر اندروید را هدف قرار می‌دهید، «is Android» نامگذاری کنید. اگر هر دو را هدف قرار می‌دهید، کافیست یکی را اینجا انتخاب کنید و برای بقیه‌ی کد از آن استفاده کنید. Using the Define a new condition\ndialog to define an iOS-specific condition
  6. در قسمت «اعمال می‌شود اگر...» ، روی منوی کشویی «انتخاب...» کلیک کنید و «پلتفرم» را انتخاب کنید. سپس، پلتفرم مناسب را انتخاب کنید. Using the Define a new condition\neditor to select the iOS platform
  7. برای ایجاد شرط، روی «ایجاد شرط» کلیک کنید. پنجره‌ی «ویرایش پارامتر» دوباره ظاهر می‌شود و اکنون می‌توانید مقداری را تنظیم کنید:
    • اگر هدف شما اندروید است، مقدار را به صورت زیر تنظیم کنید:
      {"text":"Level Up Android Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
    • اگر iOS را هدف قرار می‌دهید، مقدار را روی این تنظیم کنید:
      {"text":"Level Up iOS Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
  8. برای ذخیره تغییرات، روی ذخیره کلیک کنید.
  9. برای انتشار پیکربندی جدید و در دسترس قرار دادن مقادیر جدید برای بازی خود، روی انتشار کلیک کنید.

اگر بازی را دوباره بسازید و اجرا کنید، باید ببینید که زیرنویس بازی با نسخه مخصوص پلتفرم آن جایگزین شده است.

۱۱. پیکربندی Remote Config را برای دریافت به‌روزرسانی‌های بلادرنگ پیکربندی کنید

اکنون Remote Config می‌تواند به‌روزرسانی‌های قالب‌های Remote Config را به‌صورت بلادرنگ دریافت و مدیریت کند. برنامه‌ها می‌توانند در API جدید Remote Config به‌صورت بلادرنگ مشترک شوند تا تغییرات پیکربندی و مقادیر به‌روزرسانی‌شده را دریافت کنند.

چگونه کار می‌کند؟

برای دریافت به‌روزرسانی‌ها، برنامه شما باید متدی را پیاده‌سازی کند که در رویداد OnConfigUpdateListener مشترک شود. در حالی که یک یا چند شنونده به‌روزرسانی پیکربندی مشترک می‌شوند، قالب‌های جدید Remote Config به طور خودکار واکشی می‌شوند، هندلرهای مشترک فراخوانی می‌شوند و می‌توانند برای انجام منطق در پاسخ، مانند فعال کردن مقادیر جدید و در دسترس قرار دادن آنها برای بقیه برنامه، استفاده شوند.

پیکربندی از راه دور را به صورت بلادرنگ (Real-time) پیاده‌سازی کنید

برای نشان دادن نحوه عملکرد این مورد در بازی، تغییرات زیر را در کد خود اعمال کنید.

یک کنترل‌کننده‌ی به‌روزرسانی پیکربندی ایجاد کنید

اولین قدم برای استفاده از رویداد Config Update ایجاد متدی است که بتواند به آن گوش دهد. متد زیر را در Assets/Hamster/Scripts/MainGame.cs قرار دهید:

   void ActivateValuesOnConfigUpdate( object sender, ConfigUpdateEventArgs args)
   {
      if (args.Error != RemoteConfigError.None) {
         Debug.Log($"Error occurred while listening: {args.Error}");
         return;
      }

      Debug.Log("Updated keys: " + string.Join(", ", args.UpdatedKeys));
      // Activate all fetched values and then logs.
      var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
      remoteConfig.ActivateAsync().ContinueWithOnMainThread(
         task => {
            Debug.Log($"Keys from {nameof(ActivateValuesOnConfigUpdate)} activated.");
         });
   }

این متد لیستی از کلیدهای به‌روزرسانی‌شده و یک پیام موفقیت‌آمیز را هنگام فعال‌سازی مقادیر جدید در لاگ چاپ می‌کند.

در رویداد به‌روزرسانی مشترک شوید

برای فعال کردن ActivateValuesOnConfigUpdate هنگام فراخوانی رویداد، آن را در رویداد ثبت کنید. متد InitializeCommonDataAndStartGame() را در Assets/Hamster/Scripts/MainGame.cs با کد زیر جایگزین کنید:

   void InitializeCommonDataAndStartGame()
   {
      CommonData.prefabs = FindObjectOfType<PrefabList>();
      CommonData.mainCamera = FindObjectOfType<CameraController>();
      CommonData.mainGame = this;

      Screen.orientation = ScreenOrientation.LandscapeLeft;

      musicPlayer = CommonData.mainCamera.GetComponentInChildren<AudioSource>();

      CommonData.gameWorld = FindObjectOfType<GameWorld>();

      // Set up volume settings.
      MusicVolume = PlayerPrefs.GetInt(StringConstants.MusicVolume, MaxVolumeValue);
      // Set the music to ignore the listeners volume, which is used for sound effects.
      CommonData.mainCamera.GetComponentInChildren<AudioSource>().ignoreListenerVolume = true;
      SoundFxVolume = PlayerPrefs.GetInt(StringConstants.SoundFxVolume, MaxVolumeValue);

      // Subscribes to on config update after first initial fetch and activate
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener += ActivateValuesOnConfigUpdate;

      stateManager.PushState(new States.MainMenu());
   }

خط جدید (که با += ActivateValuesOnConfigUpdate; ‎ خاتمه می‌یابد) کنترل‌کننده رویداد را به رویداد اختصاص می‌دهد.

لغو اشتراک زمانی که شیء مالکِ گرداننده از بین می‌رود

برای جلوگیری از خطاهای ارجاع تهی، اشیاء دارای متدهایی که در رویدادها مشترک هستند، باید هنگام از بین رفتن، آن متد را لغو اشتراک کنند. متد زیر را به Assets/Hamster/Scripts/MainGame.cs اضافه کنید:

   private void OnDestroy() 
   {
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener -= ActivateValuesOnConfigUpdate;
   }

قابلیت جدید را آزمایش کنید

برای اعتبارسنجی قابلیت جدید، برنامه ساخته شده خود را امتحان کنید. روش زیر مستلزم آن است که بتوانید گزارش را بخوانید و با استفاده از یک دستگاه واقعی اشکال‌زدایی کنید .

acceleration_tile_force تغییر دهید و مشاهده کنید

پس از شروع برنامه، در بخش Remote Config کنسول Firebase:

  1. دکمه ویرایش کنار acceleration_tile_force را فشار دهید.

dc602d4db54e50a4.png

  1. مقدار را به «۱۲۰» تغییر دهید و ذخیره را فشار دهید.

fcbc1df848f88009.png

  1. روی دکمه انتشار تغییرات کلیک کنید.

3785c1e00e7a6359.png

  1. لاگ را بررسی کنید.
  2. اگر پیام لاگی را مشاهده کردید که با عبارت «خطایی هنگام گوش دادن رخ داده است» شروع می‌شود، ادامه آن را بخوانید و با پیام خطایی که چاپ می‌کند، اشکال‌زدایی را امتحان کنید.
  3. اگر گزارشی را مشاهده کردید که با عبارت «کلیدها به‌روز شده‌اند» شروع می‌شود، یعنی برنامه شما مقادیر تغییر یافته را دریافت کرده است.
  4. اگر هیچ‌کدام از این‌ها را مشاهده نکردید، بقیه‌ی لاگ‌های خود را بررسی کنید و سپس دستورالعمل‌های موجود در بخش «ایجاد یک کنترل‌کننده‌ی به‌روزرسانی پیکربندی» را دوباره مرور کنید، لاگ‌ها را دوباره آزمایش و بررسی کنید تا مشخص شود که آیا مشکلی وجود دارد یا خیر.

۱۲. تبریک می‌گویم!

شما از Remote Config برای کنترل مقادیر درون بازی از راه دور، با دریافت آنها در برنامه خود و استفاده از شرایط برای ارائه انواع مختلف، استفاده کرده‌اید!

آنچه ما پوشش داده‌ایم

  • نحوه تنظیم و بازیابی مقادیر Remote Config
  • چگونه کد سی شارپ یونیتی خود را برای استفاده از مقادیر بازیابی شده، تجهیز کنیم؟
  • نحوه ذخیره، ابزارسازی و لغو مقادیر/اشیاء مرکب به عنوان مقادیر JSON
  • نحوه استفاده از شرایط پیکربندی از راه دور برای ارائه انواع مختلف مقادیر

مراحل بعدی

برای درک بهتر منطق اینکه یک نمونه برنامه هنگام استفاده از پارامتری با چندین مقدار (به دلیل شرایط یا موقعیت مکانی) چه مقادیری را دریافت می‌کند، در مورد اولویت مقادیر پارامتر مطالعه کنید.