วัดคุมเกม Unity ด้วยการกำหนดค่าระยะไกลของ Firebase

1. บทนำ

คุณสามารถใช้การกำหนดค่าระยะไกลของ Firebase เพื่อกำหนดคู่คีย์-ค่าหรือที่เรียกว่าพารามิเตอร์ในแอปและอัปเดตค่าในระบบคลาวด์ ซึ่งช่วยให้คุณแก้ไขรูปลักษณ์และลักษณะการทำงานของแอปได้โดยไม่ต้องเผยแพร่การอัปเดตแอป

คุณจะเพิ่มฟังก์ชันใหม่นี้ลงในเกมตัวอย่าง MechaHamster: เลื่อนระดับด้วย Firebase Edition เกมตัวอย่างนี้คือเกม Firebase คลาสสิกใหม่อย่าง MechaHamster ที่นำฟังก์ชันส่วนใหญ่ของ Firebase ที่มีมาในตัวออก ทำให้คุณมีโอกาสนำเอา Firebase มาใช้ในรูปแบบใหม่ๆ แทนที่ได้

เพื่อให้มั่นใจว่าแอปทำงานตามที่ต้องการ คุณจะต้องตั้งการกำหนดค่าเริ่มต้นสำหรับค่าต่างๆ ในโค้ดเกมตัวอย่าง แล้วค่าเหล่านี้สามารถลบล้างได้ด้วยค่าที่คุณกำหนดไว้ในการกำหนดค่าระยะไกลในคอนโซล Firebase

สิ่งที่คุณจะได้เรียนรู้

  • วิธีตั้งค่าการกำหนดค่าระยะไกลในระบบคลาวด์และเรียกข้อมูล
  • วิธีใช้โค้ด Unity C# เพื่อใช้ค่าที่ดึงมาโดยอัตโนมัติ
  • วิธีจัดเก็บ วัด และแทนที่ค่า/วัตถุผสมเป็นค่า JSON
  • วิธีใช้เงื่อนไขการกำหนดค่าระยะไกลเพื่อแสดงตัวแปรค่าที่แตกต่างกันต่อกลุ่มผู้ใช้ต่างๆ

สิ่งที่ต้องมี

  • Unity 2019.1.0f1 ขึ้นไปที่รองรับบิลด์ของ iOS และ/หรือ Android
  • อุปกรณ์ Android/iOS หรืออุปกรณ์จำลอง/โปรแกรมจำลองสำหรับสร้างและใช้งานเกม

2. ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์

ส่วนต่อไปนี้จะอธิบายวิธีดาวน์โหลดโค้ด Level Up ด้วย Firebase เปิดโค้ดใน Unity และเพิ่มโปรเจ็กต์ Firebase Firebase + Unity Codelab อื่นๆ ใช้เกมตัวอย่างเลเวลอัปนี้ด้วย Firebase อยู่แล้ว คุณจึงอาจทำงานในส่วนนี้เสร็จสมบูรณ หากใช่ ให้ข้ามขั้นตอนเหล่านี้และดำเนินการเพิ่ม Firebase SDK สำหรับ Unity เพื่อเพิ่มการกำหนดค่าระยะไกลลงในโค้ดเกมตัวอย่าง

ดาวน์โหลดโค้ด

โคลนที่เก็บ GitHub ของ Codelab นี้จากบรรทัดคำสั่ง

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

หรือหากยังไม่ได้ติดตั้ง Git ให้ดาวน์โหลดที่เก็บเป็นไฟล์ ZIP

เปิด Level Up ด้วย Firebase ในตัวแก้ไข Unity

  1. เปิด Unity Hub แล้วคลิกลูกศรแบบเลื่อนลงถัดจากเปิดจากแท็บโปรเจ็กต์
  2. คลิกเพิ่มโปรเจ็กต์จากดิสก์
  3. ไปที่ไดเรกทอรีที่มีโค้ด แล้วคลิกตกลง
  4. หากได้รับข้อความแจ้ง ให้เลือกเวอร์ชันตัวแก้ไข Unity ที่จะใช้และแพลตฟอร์มเป้าหมาย (Android หรือ iOS)
  5. คลิกที่ชื่อโปรเจ็กต์ level-up-with-firebase แล้วโปรเจ็กต์จะเปิดขึ้นในตัวแก้ไข Unity
  6. หากเครื่องมือแก้ไขไม่เปิดโดยอัตโนมัติ ให้เปิด MainGameScene ในเนื้อหา > Hamster ในแท็บโปรเจ็กต์ของ Unity Editor

ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการใช้ Unity ได้ที่การทำงานใน Unity

3. เพิ่ม Firebase ไปยังโปรเจ็กต์ Unity

สร้างโปรเจ็กต์ Firebase

  1. ในคอนโซล Firebase ให้คลิกเพิ่มโปรเจ็กต์
  2. หากต้องการสร้างโปรเจ็กต์ใหม่ ให้ป้อนชื่อโปรเจ็กต์ที่ต้องการ
    การดำเนินการนี้ยังจะตั้งค่ารหัสโปรเจ็กต์ (แสดงอยู่ใต้ชื่อโปรเจ็กต์) ตามชื่อโปรเจ็กต์ด้วย หรือคุณจะคลิกไอคอนแก้ไขบนรหัสโปรเจ็กต์เพื่อปรับแต่งเพิ่มเติมก็ได้
  3. หากได้รับข้อความแจ้ง ให้ตรวจสอบและยอมรับข้อกำหนดของ Firebase
  4. คลิกต่อไป
  5. เลือกตัวเลือกเปิดใช้ Google Analytics สำหรับโปรเจ็กต์นี้ แล้วคลิกต่อไป
  6. เลือกบัญชี Google Analytics ที่มีอยู่เพื่อใช้ หรือเลือกสร้างบัญชีใหม่เพื่อสร้างบัญชีใหม่
  7. คลิกสร้างโครงการ
  8. เมื่อสร้างโปรเจ็กต์แล้ว ให้คลิกต่อไป

ลงทะเบียนแอปด้วย Firebase

  1. เปิดคอนโซล Firebase แล้วคลิกไอคอน Unity จากตรงกลางหน้าภาพรวมของโปรเจ็กต์เพื่อเปิดเวิร์กโฟลว์การตั้งค่า หรือหากคุณเพิ่มแอปไปยังโปรเจ็กต์ Firebase แล้ว ให้คลิกเพิ่มแอปเพื่อแสดงตัวเลือกแพลตฟอร์ม
  2. เลือกเพื่อลงทะเบียนเป้าหมายบิลด์ของทั้ง Apple (iOS) และ Android
  3. ป้อนรหัสเฉพาะแพลตฟอร์มของโปรเจ็กต์ Unity สำหรับ Codelab นี้ ให้ป้อนข้อมูลต่อไปนี้:
  4. ป้อนชื่อเล่นเฉพาะแพลตฟอร์มของโปรเจ็กต์ Unity(ไม่บังคับ)
  5. คลิกลงทะเบียนแอปและดำเนินการต่อในส่วนดาวน์โหลดไฟล์กำหนดค่า
  6. ทำซ้ำขั้นตอนสำหรับเป้าหมายบิลด์ที่คุณไม่ได้ทำในครั้งแรก

เพิ่มไฟล์การกำหนดค่า Firebase

หลังจากคลิกลงทะเบียนแอป คุณจะได้รับแจ้งให้ดาวน์โหลดไฟล์การกำหนดค่า 2 ไฟล์ (ไฟล์การกำหนดค่า 1 ไฟล์สำหรับเป้าหมายบิลด์แต่ละรายการ) โปรเจ็กต์ Unity ของคุณต้องใช้ข้อมูลเมตา Firebase ในไฟล์เหล่านี้เพื่อเชื่อมต่อกับ Firebase

  1. ดาวน์โหลดไฟล์กำหนดค่าที่ใช้ได้ทั้ง 2 ไฟล์:
    • สําหรับ Apple (iOS): ดาวน์โหลด GoogleService-Info.plist
    • สำหรับ Android: ดาวน์โหลด google-services.json
  2. เปิดหน้าต่าง Project ของโปรเจ็กต์ Unity จากนั้นย้ายไฟล์การกำหนดค่าทั้ง 2 ไฟล์ไปยังโฟลเดอร์ Assets
  3. กลับไปที่คอนโซล Firebase ในขั้นตอนการตั้งค่า ให้คลิกถัดไป แล้วเพิ่ม Firebase SDK สำหรับ Unity

หมายเหตุ: คุณสามารถดาวน์โหลดไฟล์เหล่านี้อีกครั้งในภายหลังได้เสมอโดยเปิดการตั้งค่าทั่วไปของโครงการ เลื่อนลงไปที่ส่วนแอปของคุณ แล้วคลิกปุ่มดาวน์โหลดสำหรับไฟล์การกำหนดค่าที่ต้องการ

เพิ่ม Firebase SDK สำหรับ Unity

  1. คลิกดาวน์โหลด Firebase Unity SDK ในคอนโซล Firebase
  2. แตกไฟล์ SDK ในจุดที่สะดวกสบาย
  3. ในโปรเจ็กต์ Unity แบบเปิด ให้ไปที่เนื้อหา > นำเข้าแพ็กเกจ > แพ็กเกจที่กำหนดเอง
  4. ในกล่องโต้ตอบนำเข้าแพ็กเกจ ให้ไปที่ไดเรกทอรีที่มี SDK ที่แยกไฟล์แล้ว เลือก FirebaseAnalytics.unitypackage แล้วคลิกเปิด
  5. จากกล่องโต้ตอบนำเข้าแพ็กเกจ Unity ที่ปรากฏขึ้น ให้คลิกนำเข้า
  6. ทำซ้ำขั้นตอนก่อนหน้าเพื่อนำเข้าแพ็กเกจสองแพ็กเกจต่อไปนี้:
    • FirebaseRemoteConfig.unitypackage
    • FirebaseCrashlytics.unitypackage
      Crashlytics เป็นรายงานข้อขัดข้องแบบเรียลไทม์ที่ใช้งานง่าย ซึ่งช่วยให้คุณติดตาม จัดลำดับความสำคัญ และแก้ไขปัญหาด้านความเสถียรที่ทำให้แอปมีคุณภาพลดลง หากคุณไม่เคยใช้โปรแกรมดังกล่าวมาก่อน โปรดลองทำตาม Crashlytics Learning Pathway for Unity ให้เสร็จสมบูรณ์
  7. กลับไปที่คอนโซล Firebase แล้วคลิกถัดไปในเวิร์กโฟลว์การตั้งค่า

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่ม Firebase SDK ไปยังโปรเจ็กต์ Unity ได้ที่ตัวเลือกการติดตั้ง Unity เพิ่มเติม

4. ตั้งค่าเริ่มต้นของการกำหนดค่าระยะไกลและดึงข้อมูลค่าใหม่

ใน Codelab นี้ คุณจะอัปเดตออบเจ็กต์ที่ใช้ค่าที่กำหนดไว้ในโค้ดหรือได้รับการทำให้เป็นอนุกรมในตัวแก้ไข Unity ให้ใช้ค่าที่มีการควบคุมด้วยการกำหนดค่าระยะไกล คุณจะต้องกำหนดค่าเริ่มต้นสำหรับแต่ละพารามิเตอร์โดยใช้ SetDefaultsAsync เพื่อให้แอปทำงานตามที่ต้องการก่อนที่จะเชื่อมต่อกับแบ็กเอนด์ของการกำหนดค่าระยะไกล แอปของคุณจะเป็นเวอร์ชันล่าสุดอยู่เสมอโดยการดึงข้อมูลค่าใหม่จากการกำหนดค่าระยะไกล และเปิดใช้งานค่าเหล่านั้นในโค้ด

หากต้องการดึงค่าใหม่จากการกำหนดค่าระยะไกล มีวิธีการที่ยังไม่ได้ใช้จำนวนหนึ่งซึ่งไฟล์ Assets/Hamster/Scripts/MainGame.cs ต้องดำเนินการให้เสร็จอยู่แล้ว

  1. เพิ่มคำสั่ง using ต่อไปนี้ใน MainGame.cs:
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    using Firebase.RemoteConfig;
    
    โมดูล Firebase.Extensions มีส่วนขยายบางรายการของ C# Tasks API ซึ่งจะช่วยให้จัดการกระบวนการเริ่มต้นด้วย Callback ได้ง่ายขึ้น
  2. เพิ่มการเริ่มต้น Firebase ลงในเมธอด MainGame.cs Start() โดยแทนที่เมธอด InitializeCommonDataAndStartGame() ที่มีอยู่ด้วยเมธอด InitializeFirebaseAndStartGame() ที่ยังไม่ได้ใช้ในปัจจุบัน:
    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 ที่มีอยู่ให้เสร็จสมบูรณ์ การดำเนินการนี้จะเชื่อมโยงการเรียกใช้ไปยังเมธอดของการกำหนดค่าระยะไกล FetchAsync (ซึ่งดึงค่าใหม่จากการกำหนดค่าระยะไกล) และ ActivateAsync (ซึ่งจะเปิดใช้งานค่าที่ได้รับเหล่านั้นเพื่อให้พร้อมใช้งานในโค้ด) โดยใช้พารามิเตอร์ Callback ที่ชื่อ onFetchAndActivateSuccessful

รหัสการเริ่มต้นใช้งานที่เราเพิ่มในขั้นตอนก่อนหน้าจะเรียก FetchRemoteConfig โดยมี InitializeCommonDataAndStartGame เป็น Callback เพื่อเริ่มเกมในตอนท้ายของลำดับ คุณสามารถส่ง Callback สำรองไปยัง FetchRemoteConfig เพื่อเรียกใช้การดึงข้อมูลที่มีผลลัพธ์ที่แตกต่างกันได้ เช่น การส่งผ่านในเมธอดที่เปิดเมนู UI ใหม่ ซึ่งจะขึ้นอยู่กับค่าของการกำหนดค่าระยะไกล ซึ่งจะทำให้เมนูเปิดขึ้นมาหลังจากที่ดึงข้อมูลและเปิดใช้งานค่าเหล่านั้นแล้วเท่านั้น

  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 ให้เสร็จสมบูรณ์ ซึ่งจะได้รับการ Callback onFetchAndActivateSuccessful ที่ผ่านไป เมื่อการเปิดใช้งานเสร็จสิ้น ระบบจะเรียกใช้ Callback ที่ระบุ
    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. กำหนดกลยุทธ์การโหลดการกำหนดค่าระยะไกล

หากต้องการดึงข้อมูลและเปิดใช้งานค่าในเวลาอื่นระหว่างการใช้แอป คุณจะต้องเรียกใช้ฟังก์ชันเหล่านี้อีกครั้ง และหากมีออบเจ็กต์ใดแคชค่าไว้ จะต้องแจ้งให้อัปเดตด้วย โปรดพิจารณาเวลาที่ต้องใช้ค่าใหม่และเวลาที่ควรเริ่มการดึงข้อมูลและเปิดใช้งานค่าใหม่เพื่อไม่ให้มีการเปลี่ยนแปลงขณะใช้งาน เพื่อพัฒนากลยุทธ์ในการดึงข้อมูลค่าการกำหนดค่าระยะไกลอีกครั้ง

ระบบจะดึงข้อมูลและเปิดใช้งานค่าการกำหนดค่าระยะไกลเมื่อแอปเริ่มทำงานเหมือนที่ทำอยู่ในปัจจุบัน ขณะเปลี่ยนเมนู คุณสามารถซ่อนการดึงข้อมูลขณะเปลี่ยนเมนู ขณะเดียวกันก็บล็อกการโต้ตอบระหว่างการเปลี่ยนด้วย นอกจากนี้ ซึ่งมักเป็นเวลาที่เกี่ยวข้องมากที่สุดในการรับค่าใหม่ เนื่องจากการเปลี่ยนแปลงสถานะเมนูมักจะใช้ในการทราบว่า "where" ผู้เล่นจะเล่นเกมและคาดการณ์ว่าจะมีการใช้ค่า

เมื่อดูในระบบเมนูของ Mechahamster วิธีที่ง่ายที่สุดในการเพิ่มการรีเฟรชเมนูการบล็อก UI คือการเรียกใช้ก่อนที่เมนูหลักจะกลับมาทำงานอีกครั้ง (โดยเฉพาะเมื่อเข้าถึงโดยสำรองข้อมูลจากเมนูอื่น) และส่งวิธีการแสดง UI เป็น Callback onFetchAndActivateSuccessful เมนูเลือกระดับก็สามารถทำได้เช่นเดียวกัน

เมื่อโหลดครั้งแรกเป็นส่วนหนึ่งของการเริ่มต้นแอป ระบบจะจัดการกับการไปยังส่วนต่างๆ ของเมนูผ่านเมนูหลักตามเมนูแรก แต่การเข้าชมเมนูเลือกระดับอีกครั้งจะทำให้มีการรีเฟรชด้วย การเข้าสู่เมนูเลือกระดับตอนแรกนั้นไม่สำคัญเนื่องจากเข้าถึงได้จากเมนูหลักเท่านั้นและจึงครอบคลุมอยู่แล้ว

หากต้องการเปิดใช้ฟีเจอร์นี้ในแอป ให้ทําตามขั้นตอนที่เกี่ยวข้องในเมนูหลักและเลือกไฟล์ระดับ ซึ่งจะบล็อกการแสดง UI จนกว่า 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. แก้ไขข้อบกพร่อง/ตรวจสอบพฤติกรรมการดึงข้อมูล

ในตอนนี้ คุณควรทำการตรวจสอบเพื่อวินิจฉัย/ตรวจสอบความถูกต้อง ขั้นตอนต่อไปนี้จะช่วยให้คุณทดสอบแอปด้วยตนเองได้ รวมถึงดูว่าแอปดึงข้อมูลและเปิดใช้งานค่าของการกำหนดค่าระยะไกลหรือไม่

ข้อมูลจะพิมพ์ออกมาเป็นส่วนหนึ่งของบันทึกจำลอง อุปกรณ์ หรือเครื่องมือแก้ไข สำหรับ iOS คุณจะดูบันทึกของอุปกรณ์และเครื่องมือจำลองใน Xcode ได้ สำหรับ Android ให้ดูบันทึกโดยเรียกใช้ adb logcat หากคุณเรียกใช้โค้ดใน Unity โดยกด Play ในตัวแก้ไข บันทึกจะปรากฏในแท็บคอนโซล

  1. สร้างและเรียกใช้แอปอีกครั้ง (ใน Editor โดยใช้อุปกรณ์หรือเครื่องจำลอง)
  2. หลังจากที่เมนูหลักของเกมปรากฏขึ้น ให้ตรวจสอบผลลัพธ์การบันทึกของเกม ซึ่งควรมีบันทึกที่สร้างโดย Debug.Log ใน FetchRemoteConfig และ ActivateRetrievedRemoteConfigValues ซึ่งควรแสดงเป็น "กำลังดึงข้อมูล..." และ "โหลดข้อมูลระยะไกลแล้วและพร้อม" ข้อความ จดการประทับเวลาไว้ที่ตอนต้นของข้อความเหล่านี้
  3. กดใบอนุญาตในเกม
  4. กดตกลง
  5. รอให้เมนูหลักของเกมปรากฏขึ้น
  6. ตรวจสอบเอาต์พุตบันทึกของเกม ซึ่งควรคล้ายกับข้อมูลในขั้นตอนก่อนหน้า โดยมีการประทับเวลาใหม่ (เวลาตรงกับเวลาที่ตั้งไว้ในนาฬิการะบบที่คุณใช้เล่นเกม)
  7. กดเล่นในเกม
  8. กด Let's Roll
  9. นำทางลูกบอลไปยังเป้าหมายโดยใช้ลูกศรบนแป้นพิมพ์ซึ่งจะเปิดเมนูระดับเสร็จสมบูรณ์
  10. กด Levels
  11. รอให้เมนูเลือกระดับโหลดขึ้นมา
  12. ตรวจสอบเอาต์พุตบันทึกของเกมอีกครั้ง ซึ่งควรตรงกับข้อความในบันทึกจากขั้นตอนก่อนหน้านี้ และมีการประทับเวลาที่ใหม่กว่า (ตรงกับเวลาที่ตั้งไว้ในนาฬิกาของระบบที่คุณกำลังเล่นเกม)

หากส่วนใดเหตุการณ์หนึ่งไม่ปรากฏในแอป แสดงว่าบางส่วนของขั้นตอนการดึงข้อมูลและเปิดใช้งาน (หรืออุปกรณ์) อาจกำหนดค่าไม่ถูกต้อง หากบันทึกแรกไม่ปรากฏขึ้น อาจเป็นไปได้ว่าเกมของคุณไม่เริ่มต้น ดูคำเตือนและข้อผิดพลาดเกี่ยวกับโปรเจ็กต์/สภาพแวดล้อมแล้วตรวจสอบในคอนโซล Editor หรือบันทึกของอุปกรณ์/โปรแกรมจำลอง แล้วปัญหานี้อาจเป็นเรื่องง่ายเหมือนกับการเชื่อมต่ออินเทอร์เน็ต

หากบันทึกเริ่มต้นจากการโหลดเมนูปรากฏขึ้น แต่หนึ่งในบันทึกหลังจากนั้นไม่ปรากฏขึ้น ให้ตรวจสอบ/ใช้เมธอด Resume ใหม่ใน Assets/Hamster/Scripts/States/MainMenu.cs และ Assets/Hamster/Scripts/States/BaseLevelSelect.cs

8. ใช้โค้ดเป็นเครื่องมือ

คุณได้กําหนดค่าพารามิเตอร์ในแอปใน SetDefaultsAsync() และทําให้เวอร์ชันล่าสุดใช้ได้กับ FetchAsync() และ ActivateAsync() แล้ว คุณจะอ้างอิงและใช้ค่าเหล่านั้นในโค้ดได้

หลังจากที่คุณกำหนดค่าในแบ็กเอนด์การกำหนดค่าระยะไกลแล้ว ให้ดึงข้อมูลแล้วเปิดใช้งาน (หรือทำทั้ง 2 อย่างพร้อมกัน) ค่าเหล่านั้นจะพร้อมใช้งานสำหรับแอปของคุณ หากต้องการใช้ค่าเหล่านี้ ให้เรียก GetValue(string key) แล้วเลือกคีย์พารามิเตอร์เป็นอาร์กิวเมนต์ การดำเนินการนี้จะแสดงผล ConfigValue ซึ่งมีพร็อพเพอร์ตี้สำหรับเข้าถึงค่าเป็นประเภทต่างๆ ที่รองรับ ได้แก่ string, bool, long, double ในโปรเจ็กต์นี้และกรณีการใช้งานเกมส่วนใหญ่ คุณต้องแคสต์ 2 ประเภทสุดท้ายเป็น int และ float ที่มีสำนวนมากกว่า โปรดตรวจสอบว่าค่าเริ่มต้นที่ตั้งไว้ในการกำหนดค่าระยะไกลอยู่ในช่วงที่ถูกต้องของประเภทที่คุณจะใช้ในโค้ดของแอป เพื่อให้มั่นใจว่า Conversion เหล่านี้จะไม่ทำให้เกิดปัญหา

  1. นำเข้าการกำหนดค่าระยะไกลโดยเพิ่ม 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;
    }
    
    การเปลี่ยนแปลงนี้จะทำให้จำนวนแรงที่ส่งต่อโดยการ์ดการเร่งจะเปลี่ยนเป็น 1 ที่ได้รับจากการกำหนดค่าระยะไกล
  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. ตั้งค่าค่าพารามิเตอร์จากระยะไกล

เนื่องจากแอปมีการติดตั้งเครื่องมือโดยสมบูรณ์แล้ว คุณก็พร้อมจะกำหนดค่าพารามิเตอร์และค่าในเซิร์ฟเวอร์การกำหนดค่าระยะไกลแล้ว ใน Codelab นี้ เราจะตั้งค่านี้โดยใช้คอนโซล Firebase

  1. เปิดโปรเจ็กต์ในคอนโซล Firebase
  2. เลือกการกำหนดค่าระยะไกลจากเมนูเพื่อดูแดชบอร์ดการกำหนดค่าระยะไกล
  3. สําหรับพารามิเตอร์แต่ละรายการที่คุณกําหนดไว้ในแอปและแสดงในตารางที่ตามมา ให้คลิกเพิ่มพารามิเตอร์ วางชื่อพารามิเตอร์ (คีย์) เลือกประเภทข้อมูลที่แสดงในตาราง ปิดใช้ใช้ค่าเริ่มต้นในแอป แล้ววางค่าเริ่มต้นใหม่

    ชื่อพารามิเตอร์ (คีย์)

    ประเภทข้อมูล

    ค่าเริ่มต้น

    การเร่งความเร็วไทล์

    ตัวเลข

    100

    การแทนที่คำบรรยาย

    JSON

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

    เครื่องมือแก้ไขพารามิเตอร์การกำหนดค่าระยะไกลที่มีการเติม\nacceleration_tile_force
  4. คลิกบันทึกเพื่อบันทึกการเปลี่ยนแปลง
  5. คลิกเผยแพร่เพื่อเผยแพร่การกำหนดค่าใหม่และทำให้ค่าใหม่พร้อมใช้งานในเกม
  6. เรียกใช้แอปอีกครั้งหลังจากตั้งค่าพารามิเตอร์ระยะไกลเหล่านี้ และสังเกตวิธีลบล้างค่าเริ่มต้นเดิมหน้าจอหลัก Mechahamster พร้อมการแก้ไขข้อบกพร่อง\nเปิดใช้เมนู

10. ใช้เงื่อนไขการกำหนดค่าระยะไกลเพื่อแสดงตัวแปร

คุณอาจต้องการดูแลประสบการณ์การใช้งานแอปให้แก่ผู้ใช้ตามภาษา สถานที่ ช่วงเวลาของวัน หรือแพลตฟอร์มที่ใช้ เงื่อนไขการกำหนดค่าระยะไกลช่วยให้คุณใช้แอตทริบิวต์เหล่านี้และแอตทริบิวต์อื่นๆ ทีละรายการหรือใช้ร่วมกันเพื่อแสดงค่าที่แตกต่างกัน (เรียกว่ารูปแบบ) แก่ผู้ใช้ได้

การใช้งานเงื่อนไขหนึ่งที่พบบ่อยคือการเปลี่ยนเนื้อหาระหว่างแพลตฟอร์ม iOS และ Android ทำตามขั้นตอนด้านล่างเพื่อใช้เงื่อนไขที่แสดงค่า subtitle_override ที่ต่างกันโดยขึ้นอยู่กับแพลตฟอร์มที่ใช้อยู่

  1. เปิดแท็บการกำหนดค่าระยะไกลของโปรเจ็กต์ในคอนโซล Firebase
  2. คลิกปุ่มแก้ไขสำหรับ subtitle_override.
  3. ที่มุมซ้ายล่าง ให้คลิกเพิ่มใหม่
  4. ในเมนูแบบเลื่อนลงที่ปรากฏขึ้น ให้วางเมาส์เหนือค่าตามเงื่อนไข แล้วคลิกสร้างเงื่อนไขใหม่เครื่องมือแก้ไขพารามิเตอร์การกำหนดค่าระยะไกล:\nตัวเลือกค่าตามเงื่อนไข
  5. เมื่อมีข้อความแจ้ง ให้ตั้งชื่อเงื่อนไขว่า "เป็น iOS" หากคุณกำหนดเป้าหมายไปที่ iOS หรือ "คือ Android" หากคุณกำหนดเป้าหมายเป็น Android หากคุณกำหนดเป้าหมายทั้ง 2 แบบ เพียงเลือกกลุ่มเป้าหมายที่นี่และนำไปใช้กับส่วนอื่นๆ ของ Codelabใช้กล่องโต้ตอบ &quot;กำหนดเงื่อนไขใหม่&quot;\nเพื่อกำหนดเงื่อนไขเฉพาะสำหรับ iOS
  6. ภายใต้ใช้หาก... ให้คลิกเมนูแบบเลื่อนลงเลือก... แล้วเลือกแพลตฟอร์ม จากนั้นเลือกแพลตฟอร์มที่เหมาะสมใช้ตัวแก้ไข &quot;กำหนดเงื่อนไขใหม่&quot;\nเพื่อเลือกแพลตฟอร์ม iOS
  7. คลิกสร้างเงื่อนไขเพื่อสร้างเงื่อนไข กล่องโต้ตอบแก้ไขพารามิเตอร์จะปรากฏขึ้นอีกครั้ง และคุณสามารถกำหนดค่าต่อไปนี้ได้
    • หากคุณกำหนดเป้าหมายเป็น Android ให้ตั้งค่าเป็น
      {"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. คลิกเผยแพร่เพื่อเผยแพร่การกำหนดค่าใหม่และทำให้ค่าใหม่พร้อมใช้งานในเกม

หากคุณสร้างและใช้งานเกมอีกครั้ง คุณจะเห็นการแทนที่คำบรรยายของเกมด้วยตัวแปรเฉพาะแพลตฟอร์ม

11. กำหนดค่าการกำหนดค่าระยะไกลเพื่อรับข้อมูลอัปเดตแบบเรียลไทม์

การกำหนดค่าระยะไกลฟังและจัดการการอัปเดตเทมเพลตการกำหนดค่าระยะไกลแบบเรียลไทม์ได้แล้ว แอปต่างๆ สามารถสมัครใช้ Remote Config API แบบเรียลไทม์ใหม่เพื่อฟังการเปลี่ยนแปลงการกำหนดค่าและค่าที่อัปเดต

วิธีการทำงาน

หากต้องการฟังข้อมูลอัปเดต แอปของคุณต้องใช้เมธอดที่สมัครรับข้อมูลเหตุการณ์ OnConfigUpdateListener ขณะที่ Listener การอัปเดตการกำหนดค่าอย่างน้อย 1 รายการสมัครรับข้อมูลอยู่ ระบบจะดึงข้อมูลเทมเพลตการกำหนดค่าระยะไกลใหม่โดยอัตโนมัติ โดยจะมีการเรียกใช้เครื่องจัดการที่สมัครใช้บริการและใช้เพื่อดำเนินการตรรกะในการตอบสนองได้ เช่น การเปิดใช้งานค่าใหม่และทำให้ค่าดังกล่าวพร้อมใช้งานในส่วนที่เหลือของแอปพลิเคชัน

ใช้การกำหนดค่าระยะไกลแบบเรียลไทม์

เพื่อสาธิตวิธีการทำงานของวิธีนี้ในเกม ให้ทำการเปลี่ยนแปลงต่อไปนี้ในโค้ดของคุณ

สร้างเครื่องจัดการการอัปเดตการกำหนดค่า

ขั้นตอนแรกในการใช้เหตุการณ์ 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;) จะสมัครรับข้อมูลเครื่องจัดการเหตุการณ์กับเหตุการณ์

ยกเลิกการสมัครเมื่อออบเจ็กต์ที่เป็นเจ้าของของตัวแฮนเดิลถูกทำลาย

เพื่อป้องกันข้อผิดพลาดการอ้างอิงแบบ Null ออบเจ็กต์ที่มีเมธอดที่สมัครรับกับเหตุการณ์จะต้องยกเลิกการสมัครใช้บริการเมธอดนั้นเมื่อถูกทำลาย เพิ่มเมธอดต่อไปนี้ใน Assets/Hamster/Scripts/MainGame.cs:

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

ทดสอบฟังก์ชันการทำงานใหม่

หากต้องการตรวจสอบฟังก์ชันการทำงานใหม่ ให้ลองใช้แอปที่คุณสร้างขึ้น ขั้นตอนต่อไปนี้กำหนดให้คุณต้องอ่านบันทึกและแก้ไขข้อบกพร่องโดยใช้อุปกรณ์จริง

เปลี่ยนacceleration_tile_forceและสังเกตการณ์

หลังจากเริ่มต้นแอปแล้ว ในส่วนการกำหนดค่าระยะไกลของคอนโซล Firebase ให้ทำดังนี้

  1. กดปุ่มแก้ไขถัดจาก acceleration_tile_force

dc602d4db54e50a4.png

  1. เปลี่ยนค่าเป็น "120" แล้วกดบันทึก

fcbc1df848f88009.png

  1. คลิกปุ่มเผยแพร่การเปลี่ยนแปลง

3785c1e00e7a6359.png

  1. ตรวจสอบบันทึก
  2. หากคุณเห็นข้อความบันทึกที่ขึ้นต้นด้วย "เกิดข้อผิดพลาดขณะฟัง" อ่านส่วนที่เหลือแล้วลองแก้ไขข้อบกพร่องที่มีข้อความแสดงข้อผิดพลาดที่แสดงขึ้น
  3. หากคุณเห็นบันทึกที่ขึ้นต้นด้วย "คีย์ที่อัปเดต" แอปของคุณได้รับค่าที่มีการเปลี่ยนแปลง
  4. หากไม่เห็นทั้ง 2 อย่างนี้ ให้ดูบันทึกที่เหลือแล้วดูวิธีการจากสร้างเครื่องจัดการการอัปเดตการกำหนดค่าอีกครั้ง ทดสอบใหม่ และตรวจสอบบันทึกอีกครั้งเพื่อดูว่ามีข้อผิดพลาดอะไรไหม

12. ยินดีด้วย

คุณได้ใช้การกำหนดค่าระยะไกลเพื่อควบคุมค่าในเกมจากระยะไกลโดยการดึงข้อมูลค่าเหล่านั้นในแอปและใช้เงื่อนไขเพื่อแสดงตัวแปรต่างๆ

สรุปประเด็นที่ได้พูดถึง

  • วิธีตั้งค่าและเรียกข้อมูลค่าการกำหนดค่าระยะไกล
  • วิธีใช้โค้ด Unity C# เพื่อใช้ค่าที่ดึงมา
  • วิธีจัดเก็บ วัด และแทนที่ค่า/วัตถุผสมเป็นค่า JSON
  • วิธีใช้เงื่อนไขการกำหนดค่าระยะไกลเพื่อแสดงตัวแปรค่าที่แตกต่างกัน

ขั้นตอนถัดไป

อ่านเกี่ยวกับลำดับความสำคัญของค่าพารามิเตอร์เพื่อทำความเข้าใจตรรกะของค่าที่อินสแตนซ์ของแอปได้รับเมื่อใช้พารามิเตอร์ที่มีหลายค่า (เนื่องจากเงื่อนไขหรือย่าน) ได้ดียิ่งขึ้น