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

1. مقدمه

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

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

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

چیزی که یاد خواهید گرفت

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

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

  • Unity 2019.1.0f1 یا بالاتر با پشتیبانی از ساخت iOS و/یا Android
  • یک دستگاه فیزیکی Android/iOS یا یک شبیه ساز/شبیه ساز برای ساخت و اجرای بازی

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

بخش های زیر نحوه دانلود Level Up با کد Firebase ، باز کردن آن در Unity و افزودن یک پروژه Firebase را توضیح می دهد. این بازی نمونه Level Up با Firebase توسط چندین کد لبه Firebase + Unity دیگر استفاده می شود، بنابراین ممکن است قبلاً وظایف این بخش را انجام داده باشید. اگر چنین است، می توانید این مراحل را رد کنید و به Add Firebase SDKs for Unity بروید تا Remote Config را به کد بازی نمونه اضافه کنید.

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

مخزن GitHub این Codelab را از خط فرمان کلون کنید:

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

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

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

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

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

3. Firebase را به پروژه Unity خود اضافه کنید

یک پروژه Firebase ایجاد کنید

  1. در کنسول Firebase ، روی افزودن پروژه کلیک کنید.
  2. برای ایجاد یک پروژه جدید، نام پروژه مورد نظر را وارد کنید.
    با این کار شناسه پروژه (که در زیر نام پروژه نمایش داده می شود) بر اساس نام پروژه نیز تعیین می شود. برای سفارشی سازی بیشتر می توانید به صورت اختیاری روی نماد ویرایش در شناسه پروژه کلیک کنید.
  3. در صورت درخواست، شرایط Firebase را بررسی کرده و بپذیرید.
  4. روی Continue کلیک کنید.
  5. گزینه Enable Google Analytics for this project را انتخاب کنید و سپس روی Continue کلیک کنید.
  6. یک حساب Google Analytics موجود را برای استفاده انتخاب کنید یا برای ایجاد حساب جدید Create a new account را انتخاب کنید.
  7. روی ایجاد پروژه کلیک کنید.
  8. پس از ایجاد پروژه، روی Continue کلیک کنید.

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

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

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

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

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

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

SDK های Firebase را برای Unity اضافه کنید

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

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

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

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

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

  1. using دستورات زیر را به MainGame.cs اضافه کنید:
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    using Firebase.RemoteConfig;
    
    ماژول Firebase.Extensions شامل برخی از برنامه‌های افزودنی برای C# Tasks API است که به مدیریت فرآیند اولیه‌سازی با فراخوان‌ها ساده‌تر کمک می‌کند.
  2. مقداردهی اولیه Firebase را با جایگزین کردن متد InitializeCommonDataAndStartGame() موجود با متد فعلی اجرا نشده InitializeFirebaseAndStartGame() به روش MainGame.cs Start() خود اضافه کنید:
    void Start()
    {
       Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
       InitializeFirebaseAndStartGame();
    }
    
  3. در MainGame.cs ، InitializeFirebaseAndStartGame() پیدا کنید. یک متغیر برنامه را اعلام کنید و پیاده سازی متد را به صورت زیر بازنویسی کنید:
    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);
          }
       );
    }
    

5. واکشی و فعال کردن مقادیر جدید (در صورت نیاز)

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

کد راه اندازی که در مرحله قبل اضافه کردیم، FetchRemoteConfig با InitializeCommonDataAndStartGame به عنوان callback می نامد تا بازی را در انتهای دنباله شروع کند. می‌توانید به منظور فراخوانی واکشی با نتایج متفاوت، فراخوان‌های جایگزین را به 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 فرا می خواند تا با باز کردن منوی اصلی، بازی را شروع کند.

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

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

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

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

با بارگذاری اولیه به عنوان بخشی از راه‌اندازی برنامه، هر پیمایش منو که از طریق منوی اصلی می‌رود توسط اولین مورد کنترل می‌شود، در حالی که ورود مجدد به منوی انتخاب سطح نیز باعث تازه‌سازی می‌شود. ورود اولیه به منوی انتخاب سطح مهم نیست زیرا فقط از منوی اصلی قابل دسترسی است و بنابراین قبلاً پوشش داده شده است.

برای فعال کردن این مورد در برنامه، روش‌های مربوطه را در منوی اصلی تکمیل کنید و فایل‌های انتخاب سطح را تکمیل کنید، تا زمانی که 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. فایل را ذخیره کنید.

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

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

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

  1. برنامه را بازسازی و اجرا کنید (در ویرایشگر، با استفاده از یک دستگاه یا شبیه ساز).
  2. پس از ظاهر شدن منوی اصلی بازی، خروجی گزارش بازی خود را بررسی کنید، که باید شامل گزارش های ایجاد شده توسط Debug.Log in FetchRemoteConfig و ActivateRetrievedRemoteConfigValues ​​باشد. اینها باید پیام‌های «در حال واکشی داده‌ها...» و «داده‌های از راه دور بارگیری شده و آماده» را نشان دهند. به مهرهای زمانی در ابتدای این پیام ها توجه کنید.
  3. در بازی، License را فشار دهید.
  4. Okay را فشار دهید.
  5. منتظر بمانید تا منوی اصلی بازی ظاهر شود.
  6. خروجی گزارش بازی خود را، که باید مشابه آنچه در مرحله قبل انجام شد، با مهرهای زمانی جدید (تطابق با زمان تنظیم شده در ساعت سیستمی که در آن بازی را اجرا می کنید، بررسی کنید).
  7. در بازی، Play را فشار دهید.
  8. Let's Roll را فشار دهید.
  9. با استفاده از فلش های صفحه کلید، توپ را به سمت دروازه هدایت کنید، که منوی Level Complete باز می شود.
  10. سطوح را فشار دهید.
  11. منتظر بمانید تا منوی انتخاب سطح بارگیری شود.
  12. خروجی ورود به سیستم بازی خود را دوباره مرور کنید. باید با پیام‌های گزارش مراحل قبلی، با مُهرهای زمانی جدیدتر مطابقت داشته باشد (مطابق با زمان تنظیم‌شده در ساعت سیستمی که در آن بازی را اجرا می‌کنید).

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

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

8. کد خود را ابزار دقیق کنید

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

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

  1. وارد کردن Remote Config با using Firebase.RemoteConfig; به بالای فایل های زیر:
    • 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 برای تغییر زیرنویس در صفحه منوی اصلی تنظیم شده است، اگر همه فیلدهای آن در ابر به عنوان مقادیری غیر از مقادیر پیش‌فرض نوع خود تنظیم شده باشند.

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

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

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

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

    نوع داده

    مقدار پیش فرض

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

    شماره

    100

    subtitle_override

    JSON

    {"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

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

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

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

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

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

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

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

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

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

پیاده سازی زمان واقعی Remote Config

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

یک کنترل کننده Config Update ایجاد کنید

اولین قدم برای استفاده از رویداد 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. مقدار را به '120' تغییر دهید و ذخیره را فشار دهید.

fcbc1df848f88009.png

  1. روی دکمه Publish Changes کلیک کنید.

3785c1e00e7a6359.png

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

12. تبریک می گویم!

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

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

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

مراحل بعدی

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