diff --git a/popcorn/Assets/MyGame/Scripts/GameDataObserver.cs b/popcorn/Assets/MyGame/Scripts/GameDataObserver.cs index 5619613b..f9333b80 100644 --- a/popcorn/Assets/MyGame/Scripts/GameDataObserver.cs +++ b/popcorn/Assets/MyGame/Scripts/GameDataObserver.cs @@ -7,52 +7,58 @@ using UnityEngine; public class GameDataObserver : SingletonMonoBehaviour { [SerializeField] private FloatReactiveProperty checkInterval = new FloatReactiveProperty(.1f); - private IObservable heartObserver; - public IObservable Heart => heartObserver; + private readonly Subject heartObserver = new Subject(); + private readonly Subject sceneCounter = new Subject(); + private readonly Subject shopLevelObserver = new Subject(); + private readonly Subject achievedMissionObserver = new Subject(); + private readonly Subject addCoinObserver = new Subject(); + private readonly Subject subCoinObserver = new Subject(); + private readonly Subject addCornObserver = new Subject(); + private readonly Subject addCustomerObserver = new Subject(); + private readonly Subject addSalesObserver = new Subject(); + private readonly Subject addRareSalesObserver = new Subject(); + private readonly Subject hasRecipeObserver = new Subject(); + private readonly Subject deliveredBulkOrderObserver = new Subject(); + private readonly BoolReactiveProperty updateMissionAchieved = new BoolReactiveProperty(); + public IReadOnlyReactiveProperty UpdateMissionAchieved => updateMissionAchieved; - private IObservable sceneCounter; - public IObservable SceneCounter => sceneCounter; - - public IObservable ShopLevelUpdate; + public IObservable ShopLevelUpdate { get; private set; } private void Start() { checkInterval.AddTo(this); + updateMissionAchieved.AddTo(this); var levelList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.ShopLevelDataSheet); - heartObserver = checkInterval - .Select(x => - Observable.Interval(TimeSpan.FromSeconds(x)) - .Select(_ => GameDataManager.GameData.Heart) - .DistinctUntilChanged()) - .Switch(); - - var shopLevelObserver = checkInterval - .Select(x => - Observable.Interval(TimeSpan.FromSeconds(x)) - .Select(_ => GameDataManager.GameData.ViewedShopLevel) - .DistinctUntilChanged()) - .Switch(); + checkInterval.Select(x => Observable.Interval(TimeSpan.FromSeconds(x))).Switch().Subscribe(_ => + { + var gameData = GameDataManager.GameData; + heartObserver.OnNext(gameData.Heart); + sceneCounter.OnNext(UnityEngine.SceneManagement.SceneManager.sceneCount); + shopLevelObserver.OnNext(gameData.ViewedShopLevel); + achievedMissionObserver.OnNext(gameData.AchievedMission.Count); + // addCoinObserver.OnNext(gameData.TotalAddCoin); + subCoinObserver.OnNext(gameData.TotalSubCoin); + addCornObserver.OnNext(gameData.TotalAddCornSeed); + addCustomerObserver.OnNext(gameData.TotalCustomerCount); + addSalesObserver.OnNext(gameData.TotalSales); + addRareSalesObserver.OnNext(gameData.RareTotalSales); + hasRecipeObserver.OnNext(gameData.MyRecipes.Length); + deliveredBulkOrderObserver.OnNext(gameData.BulkOrderDeliveredCount); + }).AddTo(this); - sceneCounter = checkInterval - .Select(x => - Observable.Interval(TimeSpan.FromSeconds(x)) - .Select(_ => UnityEngine.SceneManagement.SceneManager.sceneCount) - .DistinctUntilChanged() - .Delay(TimeSpan.FromSeconds(.4f)) - // .Do(c => { Debug.Log($"sceneCount:{c}");}) - ) - .Switch(); - - ShopLevelUpdate = Observable.CombineLatest(heartObserver, shopLevelObserver, sceneCounter, - (heart, level, sceneCount) => - { - if (level == 0 && GameDataManager.GameData.isFirstPlay) + ShopLevelUpdate = Observable.CombineLatest( + heartObserver.DistinctUntilChanged(), + sceneCounter.DistinctUntilChanged().Delay(TimeSpan.FromSeconds(.4f)), + (heart, sceneCount) => { - return false; - } - var currentLevel = levelList.LastOrDefault(data => data.heart <= heart)?.shopLevel ?? 1; - return currentLevel > level && sceneCount == 1; - }) + var viewedLevel = GameDataManager.GameData.ViewedShopLevel; + if (viewedLevel == 0 && GameDataManager.GameData.isFirstPlay) + { + return false; + } + var currentLevel = levelList.LastOrDefault(data => data.heart <= heart)?.shopLevel ?? 1; + return currentLevel > viewedLevel && sceneCount == 1; + }) .DistinctUntilChanged() .Publish(false) .RefCount();