リザルト表示対応

This commit is contained in:
kimura 2022-08-15 10:54:58 +09:00
parent cbeff6aeff
commit d7c3e31beb
2 changed files with 3546 additions and 139 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,8 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using MyGame.Scenes.marketing.Scripts;
using TMPro;
using UniRx;
using UnityEngine;
@ -16,6 +18,8 @@ namespace MyGame.Scenes.MiniGame.Scripts
[SerializeField] private Button closeButton;
[SerializeField] private Button retryButton;
[SerializeField] private Image meterProgressImage;
[SerializeField] private Image maskImage;
[SerializeField] private Transform recipeMalaImagePrefab;
[SerializeField] private TextMeshProUGUI meterProgressText;
[SerializeField] private ScrollRect scrollRect;
[SerializeField] private ResultItem itemPrefab;
@ -39,6 +43,7 @@ namespace MyGame.Scenes.MiniGame.Scripts
public void ShowResult(int score, ScrollGamePlaceData[] placeList, ScrollGameStageData stageData)
{
score = 1000;
SoundManager.Instance.ChangeVolumeUniqueBGM(.3f);
var gameData = GameDataManager.GameData;
var shopDataList = SpreadsheetDataManager.Instance.GetBaseDataList<ShopData>(Const.ShopDataSheet);
@ -109,54 +114,99 @@ namespace MyGame.Scenes.MiniGame.Scripts
Shopping.AddItem(shopData, amount);
}
// レシピ獲得
var recipePlaceData = placeList
.OrderBy(data => data.NeedScore)
// .Where(data => !gameData.MyRecipes.Contains(data.recipeId))
.FirstOrDefault(data => data.recipeId != 0);
#if UNITY_EDITOR
recipePlaceData = prevPlaceScore < recipePlaceData.NeedScore ? recipePlaceData : null;
#endif
var hasRecipeData = recipePlaceData != null;
var achievedRecipe = hasRecipeData && placeScoreData.Score >= recipePlaceData.NeedScore;
if (achievedRecipe)
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)
{
if (!gameData.MyRecipes.Contains(recipePlaceData.recipeId))
// 獲得処理
if (placeData.recipeId != 0)
{
gameData.MyRecipes = new List<int>(gameData.MyRecipes){recipePlaceData.recipeId}.ToArray();
if (gameData.MyRecipes.Contains(placeData.recipeId))
{
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);
ShopCustomize.GetItem(customizeData);
progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), placeData.NeedScore, false));
}
}
var nextAchievement = sortedPlaceList.FirstOrDefault(data => data.NeedScore > placeScoreData.Score);
if (nextAchievement != null)
{
if (nextAchievement.recipeId != 0 && !gameData.MyRecipes.Contains(nextAchievement.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));
}
else if (nextAchievement.customizeId != 0)
{
var customizeData = customizeDataList.First(data => data.id == nextAchievement.customizeId);
progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), nextAchievement.NeedScore, false));
}
}
GameDataManager.SaveGameData();
// view
gameObject.SetActive(true);
titleObject.SetActive(true);
detailObject.SetActive(true);
detailObject.transform.SetLocalPositionY(hasRecipeData ? defaultDetailObjectPos.y : detailOffset);
detailObject.transform.SetLocalPositionY(progressList.Count > 0 ? defaultDetailObjectPos.y : detailOffset);
// 商品獲得済みならレシピ非表示
if (hasRecipeData)
meterObject.SetActive(progressList.Count > 0);
var basePlaceScore = prevNeedScore;
var nextItemSubject = new Subject<Unit>().AddTo(this);
progressList.ToObservable()
.Zip(nextItemSubject.StartWith(Unit.Default).Take(progressList.Count), (x, _) => x)
.ForEachAsync(x =>
{
meterObject.SetActive(true);
SetProgress((float)prevPlaceScore / recipePlaceData.NeedScore, false);
this.CallWaitForSeconds(waitProgress, () =>
SetSilhouette(x.prefab, x.isRecipe);
var prevScore = prevPlaceScore > basePlaceScore ? prevPlaceScore - basePlaceScore : 0;
var needScore = x.needScore - basePlaceScore;
var newScore = placeScoreData.Score - basePlaceScore;
SetProgress((float)prevScore / needScore, false).ToObservable()
.Delay(TimeSpan.FromSeconds(waitProgress))
.Do(_ => SoundManager.Instance.PlaySE("se_minigame_meter"))
.SelectMany(SetProgress((float)newScore / needScore, true))
.Delay(TimeSpan.FromSeconds(.1f))
.Subscribe(_ =>
{
SoundManager.Instance.PlaySE("se_minigame_meter");
SetProgress((float)placeScoreData.Score / recipePlaceData.NeedScore, true, () =>
if (placeScoreData.Score < x.needScore)
{
if (achievedRecipe)
{
ShopItemExchangeView.ShowDialog(shopDataList.FirstOrDefault(data => data.itemId == recipePlaceData.recipeId && data.Category == ItemCategory.Recipe));
nextItemSubject.OnNext(Unit.Default);
return;
}
});
});
}
this.CallWaitForSeconds(hasRecipeData ? waitProgress + waitButtonActive : waitButtonActive, () =>
ShopItemExchangeView.ShowDialog(x.name, x.prefab, x.isRecipe, () => nextItemSubject.OnNext(Unit.Default));
}).AddTo(this);
basePlaceScore = x.needScore;
})
.SelectMany(nextItemSubject)
.Delay(TimeSpan.FromSeconds(waitButtonActive))
.Subscribe(_ =>
{
closeButton.gameObject.SetActive(true);
retryButton.gameObject.SetActive(true);
});
}).AddTo(this);
if (progressList.Count == 0)
{
nextItemSubject.OnNext(Unit.Default);
}
}
public void Reset()
@ -170,12 +220,21 @@ namespace MyGame.Scenes.MiniGame.Scripts
progressValue = 0f;
}
private void SetProgress(float newValue, bool animated = true, Action onComplete = null)
private void SetSilhouette(Transform prefab, bool isRecipe)
{
maskImage.transform.parent.SetLocalScale(isRecipe ? 1f : 2f);
maskImage.sprite = prefab.GetComponent<Image>().sprite;
meterProgressImage.sprite = maskImage.sprite;
maskImage.SetNativeSize();
meterProgressImage.SetNativeSize();
}
private IEnumerator SetProgress(float newValue, bool animated = true, Action onComplete = null)
{
var prevValue = progressValue;
newValue = Mathf.Clamp01(newValue);
progressValue = newValue;
this.CallLerp(animated ? progressDuration : 0f, f =>
return MonoBehaviourExtensions.DoCallLerp(animated ? progressDuration : 0f, f =>
{
var value = Mathf.Lerp(prevValue, newValue, f.EaseOutQuadratic());
meterProgressText.text = $"{value * 100:0}%";