From c866583f4a18b72b6d897b68d361b05e0a74c7c3 Mon Sep 17 00:00:00 2001 From: kimura Date: Wed, 7 Jul 2021 14:51:46 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=AF=E3=83=AA=E3=82=A2=E5=88=A4=E5=AE=9A?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scenes/Cooking/Scripts/CornManager.cs | 58 +++++++++++++++++-- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs index 1232bd5b..84c81432 100644 --- a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs +++ b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs @@ -1,7 +1,16 @@ using System; +using System.Collections.Generic; +using System.Linq; using UniRx; using UnityEngine; +public enum CornResult +{ + Perfect, + Good, + Failure +} + public class CornManager : MonoBehaviour { [SerializeField] private Transform cornSpawnTarget; @@ -12,10 +21,15 @@ public class CornManager : MonoBehaviour [SerializeField] private float baseCornPopTime = 5f; [SerializeField] private float cornBurntDuration = 5f; - private Corn[] cornArray; - private readonly ReactiveProperty cornGrowSpeed = new FloatReactiveProperty(0f); - private bool isHot; + public IReadOnlyReactiveProperty Result => result; + private readonly ReactiveProperty result = new ReactiveProperty(); + private Corn[] cornArray; + private bool isHot; + private List> cornConditions = new List>(); + private readonly ReactiveProperty cornGrowSpeed = new FloatReactiveProperty(0f); + private readonly CompositeDisposable compositeDisposable = new CompositeDisposable(); + // クリア判定を通知 // コーンの状態を取得する @@ -23,10 +37,23 @@ public class CornManager : MonoBehaviour private void Awake() { cornArray = new Corn[cornSpawnCount]; + result.AddTo(this); + cornGrowSpeed.AddTo(this); } public void RespawnCorn() { + compositeDisposable.Clear(); + cornConditions.Clear(); + for (int i = 0; i < cornArray.Length; i++) + { + if (cornArray[i] != null) + { + Destroy(cornArray[i].gameObject); + } + } + cornArray = new Corn[cornSpawnCount]; + for (int i = 0; i < cornSpawnCount; i++) { var corn = Instantiate(cornPrefab, cornSpawnTarget); @@ -42,7 +69,7 @@ public class CornManager : MonoBehaviour return; } corn.ChangeGrowSpeed(x); - }).AddTo(this); + }).AddTo(compositeDisposable); // コーンが弾けたとき、GrowSpeedを再設定する corn.Condition @@ -54,8 +81,29 @@ public class CornManager : MonoBehaviour { corn.ChangeGrowSpeed(0f); } - }).AddTo(this); + }).AddTo(compositeDisposable); + + cornConditions.Add(corn.Condition); } + + // すべてのコーンがSeedではなくなったら通知 + Observable.CombineLatest(cornConditions) + .FirstOrDefault(x => !x.Contains(CornCondition.Seed)) + .Subscribe(x => + { + if (x.Count(c => c == CornCondition.Simple) == x.Count) // すべてのコーンがPopped + { + result.SetValueAndForceNotify(CornResult.Perfect); + } + else if (x.Count(c => c == CornCondition.Spilled) == x.Count) // すべてのコーンが飛び出した + { + result.SetValueAndForceNotify(CornResult.Failure); + } + else + { + result.SetValueAndForceNotify(CornResult.Good); + } + }).AddTo(compositeDisposable); } public void ChangeGrowSpeed(ThermalCondition condition)