ミニゲーム報酬表示改善

This commit is contained in:
kimura 2022-08-31 13:09:42 +09:00
parent ae1d93913f
commit 5c180fb212
2 changed files with 86 additions and 30 deletions

View File

@ -116,10 +116,9 @@ namespace MyGame.Scenes.MiniGame.Scripts
var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList<ShopCustomizeData>(Const.ShopCustomizeDataSheet);
var sortedPlaceList = placeList.Where(data => data.itemId == 0).OrderBy(data => data.NeedScore).ToList();
// 最新のスコアで獲得可能な範囲の報酬を取得
var achievedList = sortedPlaceList
.Where(data => data.NeedScore > prevPlaceScore)
.Where(data => data.NeedScore <= placeScoreData.Score);
var prevNeedScore = sortedPlaceList.LastOrDefault(data => data.NeedScore <= prevPlaceScore)?.NeedScore ?? 0;
var progressList = new List<(string name, Transform prefab, int needScore, bool isRecipe)>();
foreach (var placeData in achievedList)
@ -131,36 +130,58 @@ namespace MyGame.Scenes.MiniGame.Scripts
{
continue;
}
var shopData = shopDataList.FirstOrDefault(data => data.itemId == placeData.recipeId && data.Category == ItemCategory.Recipe);
if (shopData is null)
{
continue;
}
gameData.MyRecipes = new List<int>(gameData.MyRecipes){placeData.recipeId}.ToArray();
gameData.DailyRecipeGetCount++;
var shopData = shopDataList.First(data => data.itemId == placeData.recipeId && data.Category == ItemCategory.Recipe);
// progressList.Add((shopData.Name, shopData.GetPrefab(), placeData.NeedScore, true));
progressList.Add((shopData.Name, recipeMalaImagePrefab, placeData.NeedScore, true));
}
else if (placeData.customizeId != 0)
{
var customizeData = customizeDataList.First(data => data.id == placeData.customizeId);
if (gameData.ShopCustomizeMyItems.Contains(placeData.customizeId))
{
continue;
}
var customizeData = customizeDataList.FirstOrDefault(data => data.id == placeData.customizeId);
if (customizeData is null)
{
continue;
}
ShopCustomize.GetItem(customizeData);
progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), placeData.NeedScore, false));
}
}
// 前回獲得時の必要スコアを取得
var prevNeedScore = sortedPlaceList.LastOrDefault(data => data.NeedScore < progressList[0].needScore)?.NeedScore ?? 0;
var nextAchievement = sortedPlaceList.FirstOrDefault(data => data.NeedScore > placeScoreData.Score);
if (nextAchievement != null)
foreach (var placeData in sortedPlaceList.Where(data => data.NeedScore > placeScoreData.Score))
{
if (nextAchievement.recipeId != 0 && !gameData.MyRecipes.Contains(nextAchievement.recipeId))
if (placeData.recipeId != 0 && !gameData.MyRecipes.Contains(placeData.recipeId))
{
var shopData = shopDataList.First(data => data.itemId == nextAchievement.recipeId && data.Category == ItemCategory.Recipe);
// progressList.Add((shopData.Name, shopData.GetPrefab(), nextAchievement.NeedScore, true));
progressList.Add((shopData.Name, recipeMalaImagePrefab, nextAchievement.NeedScore, true));
var shopData = shopDataList.FirstOrDefault(data => data.itemId == placeData.recipeId && data.Category == ItemCategory.Recipe);
if (shopData is null)
{
continue;
}
// progressList.Add((shopData.Name, shopData.GetPrefab(), placeData.NeedScore, true));
progressList.Add((shopData.Name, recipeMalaImagePrefab, placeData.NeedScore, true));
}
else if (nextAchievement.customizeId != 0)
else if (placeData.customizeId != 0)
{
var customizeData = customizeDataList.First(data => data.id == nextAchievement.customizeId);
progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), nextAchievement.NeedScore, false));
var customizeData = customizeDataList.FirstOrDefault(data => data.id == placeData.customizeId);
if (customizeData is null)
{
continue;
}
progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), placeData.NeedScore, false));
}
}
GameDataManager.SaveGameData();
// view
@ -171,15 +192,26 @@ namespace MyGame.Scenes.MiniGame.Scripts
meterObject.SetActive(progressList.Count > 0);
var basePlaceScore = prevNeedScore;
/*
*
*
* 0
*/
var prevScore = 0;
if (basePlaceScore < prevPlaceScore && prevPlaceScore < progressList[0].needScore)
{
prevScore = prevPlaceScore - basePlaceScore;
}
var nextItemSubject = new Subject<Unit>().AddTo(this);
progressList.ToObservable()
.Zip(nextItemSubject.StartWith(Unit.Default).Take(progressList.Count), (x, _) => x)
.ForEachAsync(x =>
{
SetSilhouette(x.prefab, x.isRecipe);
var prevScore = prevPlaceScore > basePlaceScore ? prevPlaceScore - basePlaceScore : 0;
var needScore = x.needScore == basePlaceScore ? 1 : x.needScore - basePlaceScore;
var newScore = x.needScore == basePlaceScore ? 1 : placeScoreData.Score - basePlaceScore;
// オフセット計算
var needScore = x.needScore <= basePlaceScore ? 1 : x.needScore - basePlaceScore;
var newScore = x.needScore <= basePlaceScore ? 1 : placeScoreData.Score - basePlaceScore;
basePlaceScore = x.needScore;
SetProgress((float)prevScore / needScore, false).ToObservable()
.Delay(TimeSpan.FromSeconds(waitProgress))
@ -195,6 +227,8 @@ namespace MyGame.Scenes.MiniGame.Scripts
}
ShopItemExchangeView.ShowDialog(x.name, x.prefab, x.isRecipe, () => nextItemSubject.OnNext(Unit.Default));
}).AddTo(this);
// 初回のみ0以外の値が入るため・・・
prevScore = 0;
})
.SelectMany(nextItemSubject)
.Delay(TimeSpan.FromSeconds(waitButtonActive))

View File

@ -23,11 +23,11 @@ namespace MyGame.Scenes.MiniGame.Scripts
private ScrollGamePlaceData[] sortedPlaceDataListByNeedScore;
public IObservable<Unit> OnClick => selectButton.OnClickAsObservable().TakeUntilDestroy(this);
public void SetStageHiScore(int num) => stageHiScore.text = $"{LocalizationManager.GetTranslation("UI/HiScore")}{num}";
public void SetTotalScore(int num)
public void SetTotalScore(int newScore)
{
totalScore.text = $"{LocalizationManager.GetTranslation("UI/TotalScore")}{num}";
achievementObject.SetActive(num < sortedPlaceDataListByNeedScore.Max(data => data.NeedScore));
UpdateAchievement(num);
totalScore.text = $"{LocalizationManager.GetTranslation("UI/TotalScore")}{newScore}";
var hasUpdate = UpdateAchievement();
achievementObject.SetActive(hasUpdate);
}
public void SetPlaceData(ScrollGamePlaceData[] placeDataList)
@ -40,23 +40,45 @@ namespace MyGame.Scenes.MiniGame.Scripts
itemText.text = $"{LocalizationManager.GetTranslation("UI/EarnItem")}{shopData.Name}";
}
private void UpdateAchievement(int score)
private bool UpdateAchievement()
{
var placeData = GetCurrentAchievement(sortedPlaceDataListByNeedScore, score, true);
var placeData = GetCurrentAchievement(sortedPlaceDataListByNeedScore, true);
if (placeData is null)
{
return;
return false;
}
SetAchievement(placeData);
return true;
}
private static ScrollGamePlaceData GetCurrentAchievement(ScrollGamePlaceData[] placeDataList, int score, bool sorted = false)
private static ScrollGamePlaceData GetCurrentAchievement(IEnumerable<ScrollGamePlaceData> placeDataList, bool sorted = false)
{
if (sorted)
if (!sorted)
{
return placeDataList.FirstOrDefault(data => data.itemId == 0 && data.NeedScore > score);
placeDataList = placeDataList.OrderBy(data => data.NeedScore);
}
return placeDataList.OrderBy(data => data.NeedScore).FirstOrDefault(data => data.itemId == 0 && data.NeedScore > score);
var productDataList = SpreadsheetDataManager.Instance.GetBaseDataList<ProductData>(Const.ProductDataSheet);
var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList<ShopCustomizeData>(Const.ShopCustomizeDataSheet);
foreach (var placeData in placeDataList)
{
if (placeData.recipeId != 0 && !GameDataManager.GameData.MyRecipes.Contains(placeData.recipeId))
{
if (productDataList.Exists(data => data.id == placeData.recipeId))
{
return placeData;
}
}
if (placeData.customizeId != 0 && !GameDataManager.GameData.ShopCustomizeMyItems.Contains(placeData.customizeId))
{
if (customizeDataList.Exists(data => data.id == placeData.customizeId))
{
return placeData;
}
}
}
return null;
}
private void SetAchievement(ScrollGamePlaceData placeData)
@ -67,7 +89,7 @@ namespace MyGame.Scenes.MiniGame.Scripts
var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList<ShopCustomizeData>(Const.ShopCustomizeDataSheet);
if (placeData.recipeId != 0)
{
var productData = productDataList.FirstOrDefault(data => data.id == placeData.recipeId);
var productData = productDataList.First(data => data.id == placeData.recipeId);
SetAchievementText(productData.Name, placeData.NeedScore);
var rt = recipeObject.transform;
rt.DestroyAllChildrens();
@ -75,7 +97,7 @@ namespace MyGame.Scenes.MiniGame.Scripts
}
else if (placeData.customizeId != 0)
{
var customizeData = customizeDataList.FirstOrDefault(data => data.id == placeData.customizeId);
var customizeData = customizeDataList.First(data => data.id == placeData.customizeId);
SetAchievementText(customizeData.Name, placeData.NeedScore);
var ct = customizeObject.transform;
ct.DestroyAllChildrens();