AchievementsController.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using Sirenix.OdinInspector;
  5. using KairoEngine.Utilities.Statistics;
  6. using KairoEngine.Core;
  7. using UniRx;
  8. namespace KairoEngine.Achievements
  9. {
  10. [HideMonoScript]
  11. public class AchievementsController : SerializedMonoBehaviour
  12. {
  13. public string achievementCompletedEvent = "AchievementCompletedEvent";
  14. public bool CheckOnStart = true;
  15. public bool checkOnInterval = true;
  16. [ShowIf("@checkOnInterval"), SuffixLabel("ms")] public int checkInterval = 1000;
  17. [SuffixLabel("ms")] public int startDelay = 0;
  18. public bool debug = false;
  19. [ShowIf("@!initialized")] public AchievementsLibrary library;
  20. [ShowIf("@initialized"), System.NonSerialized, ShowInInspector, HideReferenceObjectPicker]
  21. [ListDrawerSettings(IsReadOnly = true, DraggableItems = false, Expanded = true, ShowIndexLabels = false, ShowPaging = false, ShowItemCount = true, HideRemoveButton = true)]
  22. public List<AchievementStatus> achievementsStatus;
  23. private bool initialized = false;
  24. private CompositeDisposable timerComposite;
  25. private void Start()
  26. {
  27. if(debug) Debug.Log("Initializing AchievementsController");
  28. if(Statistics.instance == null) Debug.LogError("Missing Statistics component");
  29. if(library == null)
  30. {
  31. Debug.LogError("Missing Achievements Library on AchievementsController.\nPlease configure the Achievements module in the GameConfig file.");
  32. return;
  33. }
  34. achievementsStatus = new List<AchievementStatus>();
  35. for (int i = 0; i < library.achievements.Count; i++)
  36. {
  37. int value = PlayerPrefs.GetInt($"ACHIEVEMENT_{library.achievements[i].identifier}", 0);
  38. achievementsStatus.Add(new AchievementStatus(library.achievements[i], value == 0 ? false : true));
  39. PlayerPrefs.SetInt($"ACHIEVEMENT_{library.achievements[i].identifier}", value);
  40. }
  41. initialized = true;
  42. Timer.ExecuteRealTime(startDelay, () => {
  43. if(CheckOnStart) CheckAchievements();
  44. if(checkOnInterval) StartCheckTimer();
  45. });
  46. }
  47. private void OnDestroy()
  48. {
  49. if (timerComposite != null) timerComposite.Dispose();
  50. }
  51. public void CheckAchievements()
  52. {
  53. if(debug) Debug.Log($"Checking achievements ({achievementsStatus.Count})");
  54. if(library == null) return;
  55. for (int i = 0; i < achievementsStatus.Count; i++)
  56. {
  57. if(achievementsStatus[i].unlocked == true) continue;
  58. if(achievementsStatus[i].achievement.HasAchieved())
  59. {
  60. Debug.Log($"Achievement Unlocked: {achievementsStatus[i].achievement.title}");
  61. GenericEvents.Trigger(achievementCompletedEvent, achievementsStatus[i].achievement.identifier);
  62. achievementsStatus[i].unlocked = true;
  63. PlayerPrefs.SetInt($"ACHIEVEMENT_{achievementsStatus[i].achievement.identifier}", 1);
  64. }
  65. }
  66. }
  67. public void StartCheckTimer()
  68. {
  69. timerComposite = Timer.ExecuteRealTime(checkInterval, () => {
  70. if(checkOnInterval)
  71. {
  72. CheckAchievements();
  73. StartCheckTimer();
  74. }
  75. });
  76. }
  77. }
  78. }