diff --git a/popcorn/Assets/MyGame/Scenes/Cooking/Cooking.unity b/popcorn/Assets/MyGame/Scenes/Cooking/Cooking.unity index 0f4eb685..98fe4476 100644 --- a/popcorn/Assets/MyGame/Scenes/Cooking/Cooking.unity +++ b/popcorn/Assets/MyGame/Scenes/Cooking/Cooking.unity @@ -9354,6 +9354,8 @@ MonoBehaviour: cornSpawnTarget: {fileID: 1440136003} cornPrefab: {fileID: 5499754490129207122, guid: 2b790fd908bd14de4a601c21374fb55b, type: 3} + spilledCornAnimationPrefab: {fileID: 2449901118440757730, guid: 7e7fbf241bd7f461fb46363ff0c6be3e, + type: 3} cornSpawnCount: 100 maxFailedCornCount: 60 baseGrowSpeed: 1 diff --git a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs index e8ff36f5..63b606bf 100644 --- a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs +++ b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs @@ -4,6 +4,7 @@ using System.Linq; using UniRx; using UnityEngine; using UnityEngine.UI; +using Random = UnityEngine.Random; public enum CornResult { @@ -16,6 +17,7 @@ public class CornManager : MonoBehaviour { [SerializeField] private Transform cornSpawnTarget; [SerializeField] private Corn cornPrefab; + [SerializeField] private GameObject spilledCornAnimationPrefab; [SerializeField] private int cornSpawnCount = 20; [SerializeField] private int maxFailedCornCount = 10; [SerializeField, ReadOnly] private float baseGrowSpeed = 1f; @@ -28,10 +30,14 @@ public class CornManager : MonoBehaviour public IReadOnlyReactiveProperty Result => result; private readonly ReactiveProperty result = new ReactiveProperty(); + private float worldWidth; + private float worldHeight; + private static readonly float maxSpilledHeight = 4f; private Corn[] cornArray; private bool isHot; private bool isCompleted; - private List> cornConditions = new List>(); + private readonly List> cornConditions = new List>(); + private readonly Subject cornSpilledSubject = new Subject(); private readonly ReactiveProperty cornGrowSpeed = new FloatReactiveProperty(0f); private readonly CompositeDisposable compositeDisposable = new CompositeDisposable(); @@ -47,6 +53,9 @@ public class CornManager : MonoBehaviour private void Awake() { + var leftTop = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 0)); + worldWidth = leftTop.x; + worldHeight = leftTop.y; cornArray = new Corn[cornSpawnCount]; result.AddTo(this); cornGrowSpeed.AddTo(this); @@ -55,6 +64,19 @@ public class CornManager : MonoBehaviour private void Start() { + // コーン飛び出し制御 + // 5フレームごとに2回など演出の回数を制御 + cornSpilledSubject + .Where(x => x != CornCondition.Seed) // Seedは演出なし + .Where(_ => !isCompleted) // 終了後は飛び出さない + .BatchFrame(5, FrameCountType.EndOfFrame) // 指定フレーム分まとめる + .Subscribe(x => + { + foreach (var condition in x.RandomChoose(2)) + { + SpawnSpilledAnimation(condition); + } + }).AddTo(this); #if DEVELOPMENT_BUILD || UNITY_EDITOR cornCountSlider.wholeNumbers = true; cornCountSlider.value = cornSpawnCount; @@ -108,16 +130,31 @@ public class CornManager : MonoBehaviour corn.ChangeGrowSpeed(x); }).AddTo(compositeDisposable); - // コーンが弾けたとき、GrowSpeedを再設定する + corn.Condition - .Where(x => x == CornCondition.Simple) - .FirstOrDefault() - .Subscribe(_ => + .Pairwise() + .Subscribe(condition => { - // ThermalCondition.Hot以外では焦げ進行なし - if (!isHot) + switch (condition.Current) { - corn.ChangeGrowSpeed(0f); + case CornCondition.Seed: + break; + case CornCondition.Simple: + // コーンが弾けたとき、GrowSpeedを再設定する + // ThermalCondition.Hot以外では焦げ進行なし + if (!isHot) + { + corn.ChangeGrowSpeed(0f); + } + break; + case CornCondition.Burnt: + break; + case CornCondition.Spilled: + // 同時に飛び出したとき用に演出をばらつかせる + this.CallWaitForSeconds(Random.Range(0f, .5f), () => cornSpilledSubject.OnNext(condition.Previous)); + break; + default: + throw new ArgumentOutOfRangeException(nameof(condition), condition, null); } }).AddTo(compositeDisposable); @@ -178,6 +215,18 @@ public class CornManager : MonoBehaviour } } + private void SpawnSpilledAnimation(CornCondition condition) + { + // Result表示より下の範囲にランダム表示 + var position = new Vector2((Random.value * 2 - 1) * worldWidth, Mathf.Lerp(-worldHeight, maxSpilledHeight, Random.value)); + // 画面KO再生 + var animation = Instantiate(spilledCornAnimationPrefab, position, Quaternion.identity); + // KOコーンスキン変更 + animation.GetComponent().ChangeCornSkin(condition); + VibrationManager.Instance.PlayVibrationDoubleStrong(); + this.CallWaitForSeconds(1.5f, () => Destroy(animation)); + } + private void SetResult(CornResult resultValue) { cornGrowSpeed.Value = 0f;