diff --git a/popcorn/Assets/MyGame/Scenes/Cooking/Cooking.unity b/popcorn/Assets/MyGame/Scenes/Cooking/Cooking.unity index 369e3dc0..f3c0e566 100644 --- a/popcorn/Assets/MyGame/Scenes/Cooking/Cooking.unity +++ b/popcorn/Assets/MyGame/Scenes/Cooking/Cooking.unity @@ -7693,7 +7693,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &571886842 Transform: m_ObjectHideFlags: 0 @@ -24085,13 +24085,14 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 1528220821} + - component: {fileID: 1528220822} m_Layer: 0 m_Name: Directing m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!4 &1528220821 Transform: m_ObjectHideFlags: 0 @@ -24118,6 +24119,22 @@ Transform: m_Father: {fileID: 1448897407} m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1528220822 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1528220820} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 98be9fc96d3a48ce9aa0d4cc0d79648b, type: 3} + m_Name: + m_EditorClassIdentifier: + toppingAnimator: {fileID: 563805857} + popcornSprite: {fileID: 21300000, guid: 9d762a28d4a0a174b8ea92deb82d976f, type: 3} + startDuration: 0.5 + waitAction: 5 --- !u!1 &1534889131 GameObject: m_ObjectHideFlags: 0 @@ -40087,6 +40104,7 @@ MonoBehaviour: thermoMeter: {fileID: 1928679192} cornManager: {fileID: 1870432536} panColliderChanger: {fileID: 2137549896} + toppingView: {fileID: 1528220822} gameProgress: 0 resultDelay: 1.8 --- !u!4 &1870432534 diff --git a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/Corn.cs b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/Corn.cs index f7ef2f91..1c5b9577 100644 --- a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/Corn.cs +++ b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/Corn.cs @@ -38,6 +38,9 @@ public class Corn : MonoBehaviour private float cornSpillSpeed; private float cornPopSpeed; private bool isHot; + private bool topping; + private Sprite toppingSprite; + private IDisposable toppingDisposable; public IReadOnlyReactiveProperty Condition => condition; private readonly ReactiveProperty condition = new ReactiveProperty(CornCondition.Seed); @@ -147,7 +150,14 @@ public class Corn : MonoBehaviour private void CornPop() { - cornSkin.ChangeSkin(condition.Value); + if (topping) + { + cornSkin.GetComponent().sprite = toppingSprite; + } + else + { + cornSkin.ChangeSkin(condition.Value); + } rigidbody.AddForce(cornPopSpeed * Random.insideUnitCircle, ForceMode2D.Impulse); animator.SetTrigger(HashCornGrow); VibrationManager.Instance.PlayVibrationOnce(); @@ -155,18 +165,20 @@ public class Corn : MonoBehaviour private void CornBurnt() { + toppingDisposable?.Dispose(); cornSkin.ChangeSkin(condition.Value); animator.SetTrigger(HashCornBurn); var effect = Instantiate(effectBurnt, transform); this.CallWaitForSeconds(.8f, () => Destroy(effect)); } - public void SetCornProperty(float popTime, float burntDuration, float spillSpeed, float popSpeed) + public void SetCornProperty(float popTime, float burntDuration, float spillSpeed, float popSpeed, Sprite newSprite) { cornPopTime = popTime; cornBurntTime = cornPopTime + burntDuration; cornSpillSpeed = spillSpeed; cornPopSpeed = popSpeed; + toppingSprite = newSprite; } public void ChangeGrowSpeed(float speed) @@ -183,4 +195,26 @@ public class Corn : MonoBehaviour { animator.SetTrigger(HashCornWait); } + + public void SetToppingFlag() + { + switch (condition.Value) + { + case CornCondition.Seed: + topping = true; + break; + case CornCondition.Simple: + topping = true; + toppingDisposable = Observable.Timer(TimeSpan.FromSeconds(cornPopTime / 15)).Subscribe(_ => + { + cornSkin.GetComponent().sprite = toppingSprite; + }).AddTo(this); + break; + case CornCondition.Burnt: + topping = false; + break; + default: + throw new ArgumentOutOfRangeException(); + } + } } diff --git a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs index 8f13aa8f..eadce905 100644 --- a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs +++ b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CornManager.cs @@ -48,6 +48,7 @@ public class CornManager : MonoBehaviour private Corn[] cornArray; private bool isHot; private bool isCompleted; + private Sprite toppingSprite; private readonly List> cornConditions = new List>(); private readonly Subject<(CornCondition cond, Vector3 pos)> cornSpilledSubject = new Subject<(CornCondition, Vector3)>(); private readonly ReactiveProperty missCount = new ReactiveProperty(); @@ -145,7 +146,7 @@ public class CornManager : MonoBehaviour { var corn = Instantiate(cornPrefab, cornSpawnTarget); cornArray[i] = corn; - corn.SetCornProperty( CornPopParameters.CornPopTimeArray[shuffledArray[i]], CornPopParameters.CornBurntTimeArray[shuffledArray[i]], cornSpillSpeed, cornPopSpeed); + corn.SetCornProperty( CornPopParameters.CornPopTimeArray[shuffledArray[i]], CornPopParameters.CornBurntTimeArray[shuffledArray[i]], cornSpillSpeed, cornPopSpeed, toppingSprite); // 進行速度の変更時、コーン速度変更 cornGrowSpeed.TakeWhile(_ => !isCompleted).Subscribe(x => { @@ -165,7 +166,8 @@ public class CornManager : MonoBehaviour { corn.StartCornDance(); }).AddTo(compositeDisposable); - + + progress.Where(x => x >= .3f).Take(1).Subscribe(_ => corn.SetToppingFlag()).AddTo(compositeDisposable); corn.Condition .Where(_ => !isCompleted) // 結果確定後通知抑制 @@ -238,7 +240,8 @@ public class CornManager : MonoBehaviour Observable.Range(0, amount).Subscribe(__ => { var corn = Instantiate(cornPrefab, cornSpawnTarget); - corn.SetCornProperty(0f, isHot ? 0f : 3f, cornSpillSpeed, cornPopSpeed); + corn.SetCornProperty(0f, isHot ? 0f : 3f, cornSpillSpeed, cornPopSpeed, toppingSprite); + corn.SetToppingFlag(); cornGrowSpeed.TakeWhile(x => !isCompleted).Subscribe(x => { // コーンが弾けた後はRedの場合のみ焦げ進行する @@ -297,4 +300,9 @@ public class CornManager : MonoBehaviour isCompleted = true; result.SetValueAndForceNotify(resultValue); } + + public void SetTopping(Sprite newSprite) + { + toppingSprite = newSprite; + } } diff --git a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/PopcornGameManager.cs b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/PopcornGameManager.cs index 7fc4138b..76389eb1 100644 --- a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/PopcornGameManager.cs +++ b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/PopcornGameManager.cs @@ -31,6 +31,7 @@ public class PopcornGameManager : MonoBehaviour [SerializeField] private ThermoMeter thermoMeter; [SerializeField] private CornManager cornManager; [SerializeField] private PanColliderChanger panColliderChanger; + [SerializeField] private ToppingView toppingView; [Space] [SerializeField, ReadOnly] private float gameProgress; @@ -132,6 +133,7 @@ public class PopcornGameManager : MonoBehaviour gameView.SetPan(panData.GetPrefab()); thermalControl.SetPanData(panData); cornManager.SetCornsActive(true); + cornManager.SetTopping(toppingView.GetSprite()); panColliderChanger.Reset(); compositeDisposable.Clear(); cornManager.Result.SkipLatestValueOnSubscribe() @@ -160,5 +162,17 @@ public class PopcornGameManager : MonoBehaviour state.Value = GameState.Playing; }).AddTo(compositeDisposable); state.SetValueAndForceNotify(GameState.Guide); + + toppingView.ResetTopping(); + // トッピング演出トリガー + thermalControl.Condition.Where(x => x == ThermalCondition.Yellow).Take(1).Subscribe(_ => + { + toppingView.StartTopping(); + }).AddTo(compositeDisposable); + // ポップコーンが出来上がるくらいに停止 + cornManager.Progress.Where(x => x >= .7f).Subscribe(_ => + { + toppingView.StopTopping(); + }).AddTo(compositeDisposable); } } diff --git a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/ToppingView.cs b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/ToppingView.cs new file mode 100644 index 00000000..64f2725f --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/ToppingView.cs @@ -0,0 +1,63 @@ +using System; +using UniRx; +using UniRx.Triggers; +using UnityEngine; + +namespace MyGame.Scenes.Cooking.Scripts +{ + public class ToppingView : MonoBehaviour + { + [SerializeField] private Animator toppingAnimator; + [SerializeField] private Sprite popcornSprite; + [SerializeField] private float startDuration = .5f; + [SerializeField] private float waitAction = 5f; + private readonly CompositeDisposable compositeDisposable = new CompositeDisposable(); + private Vector3 defaultScale; + private void Start() + { + defaultScale = transform.localScale; + toppingAnimator.gameObject.SetActive(true); + ResetTopping(); + } + + public Sprite GetSprite() => popcornSprite; + + public void ResetTopping() + { + transform.SetLocalScale(0f); + } + + public void StartTopping() + { + transform.SetLocalScale(defaultScale.x); + toppingAnimator.Play("MaterialDirecting_AdvanceForward", 0, 0f); + compositeDisposable.Clear(); + Observable.Timer(TimeSpan.FromSeconds(startDuration)).Subscribe(l => + { + toppingAnimator.Play("material_caramel&butter"); + Observable.NextFrame().Subscribe(unit => + { + var len = toppingAnimator.GetCurrentAnimatorClipInfo(0)[0].clip.length; + Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(len + waitAction)) + .Subscribe(ll => + { + toppingAnimator.Play("material_caramel&butter", 0, 0f); + }).AddTo(compositeDisposable); + }).AddTo(compositeDisposable); + }).AddTo(compositeDisposable); + } + + public void StopTopping() + { + var state = toppingAnimator.GetCurrentAnimatorStateInfo(0); + compositeDisposable.Clear(); + this.UpdateAsObservable() + .Where(_ => state.normalizedTime >= 1f) + .Take(1) + .Subscribe(_ => + { + toppingAnimator.Play("MaterialDirecting_Return"); + }).AddTo(compositeDisposable); + } + } +} \ No newline at end of file diff --git a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/ToppingView.cs.meta b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/ToppingView.cs.meta new file mode 100644 index 00000000..4e18425c --- /dev/null +++ b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/ToppingView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 98be9fc96d3a48ce9aa0d4cc0d79648b +timeCreated: 1654153686 \ No newline at end of file