using System; using System.Linq; using UniRx; using UnityEngine; public class GameDataObserver : SingletonMonoBehaviour { [SerializeField] private FloatReactiveProperty checkInterval = new FloatReactiveProperty(.1f); private IObservable heartObserver; public IObservable Heart => heartObserver; private IObservable sceneCounter; public IObservable SceneCounter => sceneCounter; public IObservable ShopLevelUpdate; private void Start() { checkInterval.AddTo(this); var gameData = GameDataManager.GameData; var levelList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.ShopLevelDataSheet); heartObserver = checkInterval .Select(x => Observable.Interval(TimeSpan.FromSeconds(x)) .Select(_ => gameData.Heart) .DistinctUntilChanged()) .Switch(); var shopLevelObserver = checkInterval .Select(x => Observable.Interval(TimeSpan.FromSeconds(x)) .Select(_ => gameData.ViewedShopLevel) .DistinctUntilChanged()) .Switch(); 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) => { var currentLevel = levelList.LastOrDefault(data => data.heart <= heart)?.shopLevel ?? 1; return currentLevel > level && sceneCount == 1; }) .DistinctUntilChanged() .Publish(false) .RefCount(); ShopLevelUpdate.Subscribe(x => { Debug.Log($"change:{x}"); }); } }