デイリーミッション処理追加

This commit is contained in:
kimura 2021-10-25 12:32:12 +09:00
parent 9f56c50a0e
commit 70f1f2e221
5 changed files with 285 additions and 2925 deletions

View File

@ -73,7 +73,7 @@ public class Information : MonoBehaviour
var shopLevelData = shopLevelList.FirstOrDefault(data => data.shopLevel == gameData.ViewedShopLevel) ?? shopLevelList[0]; var shopLevelData = shopLevelList.FirstOrDefault(data => data.shopLevel == gameData.ViewedShopLevel) ?? shopLevelList[0];
var nextShopLevelData = shopLevelList.FirstOrDefault(data => data.shopLevel == gameData.ViewedShopLevel + 1); var nextShopLevelData = shopLevelList.FirstOrDefault(data => data.shopLevel == gameData.ViewedShopLevel + 1);
var nextLevelHeart = nextShopLevelData?.heart ?? shopLevelData.heart; var nextLevelHeart = nextShopLevelData?.heart ?? shopLevelData.heart;
totalDayText.text = String.Format(dayFormat, 1); totalDayText.text = String.Format(dayFormat, gameData.dailyLoginCount);
totalSalesText.text = String.Format(salesFormat, gameData.TotalSales); totalSalesText.text = String.Format(salesFormat, gameData.TotalSales);
totalCoinText.text = gameData.TotalAddCoin.ToString(); totalCoinText.text = gameData.TotalAddCoin.ToString();
achievementText.text = shopLevelData.achievement; achievementText.text = shopLevelData.achievement;

View File

@ -10,6 +10,7 @@ public class MissionListView : MonoBehaviour
[SerializeField] private MissionTabView dailyTab; [SerializeField] private MissionTabView dailyTab;
[SerializeField] private ScrollRect scrollRect; [SerializeField] private ScrollRect scrollRect;
[SerializeField] private MissionView itemViewPrefab; [SerializeField] private MissionView itemViewPrefab;
[SerializeField] private MissionView dailyCompleteItemViewPrefab;
private readonly ReactiveProperty<MissionCategory> selectedTab = new ReactiveProperty<MissionCategory>(); private readonly ReactiveProperty<MissionCategory> selectedTab = new ReactiveProperty<MissionCategory>();
public IReadOnlyReactiveProperty<MissionCategory> SelectedTab => selectedTab; public IReadOnlyReactiveProperty<MissionCategory> SelectedTab => selectedTab;
@ -60,6 +61,18 @@ public class MissionListView : MonoBehaviour
return Instantiate(itemViewPrefab, tabs[index].content); return Instantiate(itemViewPrefab, tabs[index].content);
} }
public MissionView AddDailyCompleteItemView()
{
var index = tabs.FindIndex(x => x.category == MissionCategory.Daily);
if (index == -1)
{
index = tabs.Count;
var content = scrollRect.content;
tabs.Add((MissionCategory.Daily, Instantiate(content, content.parent)));
}
return Instantiate(dailyCompleteItemViewPrefab, tabs[index].content);
}
public void SetTab(MissionCategory category) public void SetTab(MissionCategory category)
{ {
selectedTab.SetValueAndForceNotify(category); selectedTab.SetValueAndForceNotify(category);

View File

@ -1,4 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using UniRx; using UniRx;
using UnityEngine; using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;
@ -9,6 +11,7 @@ public class MissionManager : MonoBehaviour
private static readonly string TimeFormat = "更新まで:{0}時間{1}分{2}秒"; private static readonly string TimeFormat = "更新まで:{0}時間{1}分{2}秒";
private static readonly int OpenTrigger = Animator.StringToHash("OpenTrigger"); private static readonly int OpenTrigger = Animator.StringToHash("OpenTrigger");
private static readonly int CloseTrigger = Animator.StringToHash("CloseTrigger"); private static readonly int CloseTrigger = Animator.StringToHash("CloseTrigger");
private static readonly int dailyMissionCompleteRewardCoin = 50;
[SerializeField] private Animator backgroundAnimator; [SerializeField] private Animator backgroundAnimator;
[SerializeField] private Button closeButton; [SerializeField] private Button closeButton;
@ -33,11 +36,31 @@ public class MissionManager : MonoBehaviour
timeLimitText.gameObject.SetActive(category == MissionCategory.Daily); timeLimitText.gameObject.SetActive(category == MissionCategory.Daily);
}).AddTo(this); }).AddTo(this);
var gameData = GameDataManager.GameData;
// デイリーカウントダウン
var limitTime = gameData.GetDailyMissionLimitTime();
if (limitTime.TotalSeconds > 0)
{
timeLimitText.text = String.Format(TimeFormat, limitTime.Hours, limitTime.Minutes, limitTime.Seconds);
}
else
{
timeLimitText.text = String.Format(TimeFormat, 0, 0, 0);
}
Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(1f))
.Select(x => limitTime.Add(TimeSpan.FromSeconds(-x)))
.TakeWhile(x => x.TotalSeconds > 0)
.Subscribe(x =>
{
timeLimitText.text = String.Format(TimeFormat, x.Hours, x.Minutes, x.Seconds);
}).AddTo(this);
// ミッション読み込み // ミッション読み込み
var missionList = SpreadsheetDataManager.Instance.GetBaseDataList<MissionData>(Const.MissionDataSheet); var missionList = SpreadsheetDataManager.Instance.GetBaseDataList<MissionData>(Const.MissionDataSheet);
// ミッション表示 // ミッション表示
foreach (var missionData in missionList) foreach (var missionData in missionList.Where(data => data.Category == MissionCategory.Normal && data.shopLevel <= gameData.ViewedShopLevel))
{ {
var missionView = listView.AddItemView(missionData); var missionView = listView.AddItemView(missionData);
var progressValue = GetProgressValue(missionData); var progressValue = GetProgressValue(missionData);
@ -57,6 +80,60 @@ public class MissionManager : MonoBehaviour
missionView.SetRewarded(); missionView.SetRewarded();
// 達成ID保存 // 達成ID保存
GameDataManager.GameData.AchievedMission.Add(missionData.id); GameDataManager.GameData.AchievedMission.Add(missionData.id);
GameDataManager.SaveGameData();
})));
TransitionManager.Instance.LoadSceneAdditive(GameScenes.MissionAchievement);
}).AddTo(missionView);
}
// dailyMission
// コンプリートミッション
{
var missionView = listView.AddDailyCompleteItemView();
var missionData = new MissionData(){count = 3, reward = dailyMissionCompleteRewardCoin, text = "デイリーミッションすべて完了で達成"};
var progressValue = gameData.dailyMissionAchievedIdArray.Length;
missionView.SetData(missionData, progressValue);
missionView.SetButtonActive(missionData.count <= progressValue);
if (gameData.dailyMissionCompleted) // 達成済み
{
missionView.SetRewarded();
}
// リワード獲得
missionView.RewardButton.ThrottleFirst(TimeSpan.FromSeconds(1f)).Subscribe(_ =>
{
LocalCacheManager.Save(MissionDataTag, (missionData, new Action(() =>
{
GetDailyMissionCompleteReward();
missionView.SetRewarded();
// 達成ID保存
gameData.dailyMissionCompleted = true;
GameDataManager.SaveGameData();
})));
TransitionManager.Instance.LoadSceneAdditive(GameScenes.MissionAchievement);
}).AddTo(missionView);
}
foreach (var missionData in missionList.Where(data => gameData.dailyMissionIdArray.Contains(data.id)))
{
var missionView = listView.AddItemView(missionData);
var progressValue = GetDailyProgressValue(missionData);
missionView.SetData(missionData, progressValue);
missionView.SetButtonActive(missionData.count <= progressValue);
if (gameData.dailyMissionAchievedIdArray.Contains(missionData.id)) // 達成済み
{
missionView.SetRewarded();
}
// リワード獲得
missionView.RewardButton.ThrottleFirst(TimeSpan.FromSeconds(1f)).Subscribe(_ =>
{
LocalCacheManager.Save(MissionDataTag, (missionData, new Action(() =>
{
GetReward(missionData);
missionView.SetRewarded();
// 達成ID保存
gameData.dailyMissionAchievedIdArray = new List<int>(gameData.dailyMissionIdArray){missionData.id}.ToArray();
GameDataManager.SaveGameData();
}))); })));
TransitionManager.Instance.LoadSceneAdditive(GameScenes.MissionAchievement); TransitionManager.Instance.LoadSceneAdditive(GameScenes.MissionAchievement);
}).AddTo(missionView); }).AddTo(missionView);
@ -312,4 +389,10 @@ public class MissionManager : MonoBehaviour
GameDataManager.GameData.Coin = CoinManager.Instance.OwnCoin; GameDataManager.GameData.Coin = CoinManager.Instance.OwnCoin;
} }
} }
private void GetDailyMissionCompleteReward()
{
CoinManager.Instance.AddCoinWithEffect(dailyMissionCompleteRewardCoin);
GameDataManager.GameData.Coin = CoinManager.Instance.OwnCoin;
}
} }

View File

@ -52,6 +52,49 @@ public class GameDataObserver : SingletonMonoBehaviour<GameDataObserver>
.DistinctUntilChanged() .DistinctUntilChanged()
.Publish(false) .Publish(false)
.RefCount(); .RefCount();
ShopLevelUpdate.Subscribe(x => { Debug.Log($"change:{x}"); }); #if UNITY_EDITOR
// ShopLevelUpdate.Subscribe(x => { Debug.Log($"change:{x}"); });
#endif
// デイリーミッション日付チェック
sceneCounter
.Where(x => x <= 1)
.Subscribe(x =>
{
if (gameData.ViewedShopLevel == 0)
{
return;
}
var lastSetDateUtc = DateTime.FromBinary(gameData.lastDailyMissionSetTime);
// 現時刻が最後にデイリーミッションを設定した日より前の場合無視(時間操作対策)
if (lastSetDateUtc > DateTime.UtcNow)
{
#if UNITY_EDITOR
Debug.Log($"不正な時刻 {lastSetDateUtc:s}");
#endif
return;
}
// ミッションリセットチェック(0時)
if (gameData.GetDailyMissionLimitTime().TotalSeconds > 0)
{
return;
}
#if UNITY_EDITOR
Debug.Log($"reset daily mission");
#endif
// ミッション実績リセット
gameData.dailyMissionAchievedIdArray = new int[0];
gameData.dailyMissionCompleted = false;
gameData.ResetDailyTotalCount();
// 新ミッション登録
var missionList = SpreadsheetDataManager.Instance.GetBaseDataList<MissionData>(Const.MissionDataSheet);
var targetList = missionList.Where(data =>
data.Category == MissionCategory.Daily && data.shopLevel <= gameData.ViewedShopLevel);
gameData.dailyMissionIdArray = targetList.ToList().RandomChoose(3).Select(data => data.id).ToArray();
gameData.lastDailyMissionSetTime = DateTime.UtcNow.ToBinary();
gameData.dailyLoginCount++;
GameDataManager.SaveGameData();
});
} }
} }