トッピング演出実装

This commit is contained in:
kimura 2022-06-02 18:10:11 +09:00
parent 7eabfad5d1
commit 22c7f48170
6 changed files with 147 additions and 7 deletions

View File

@ -7693,7 +7693,7 @@ GameObject:
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
m_StaticEditorFlags: 0 m_StaticEditorFlags: 0
m_IsActive: 1 m_IsActive: 0
--- !u!4 &571886842 --- !u!4 &571886842
Transform: Transform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -24085,13 +24085,14 @@ GameObject:
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 1528220821} - component: {fileID: 1528220821}
- component: {fileID: 1528220822}
m_Layer: 0 m_Layer: 0
m_Name: Directing m_Name: Directing
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
m_StaticEditorFlags: 0 m_StaticEditorFlags: 0
m_IsActive: 0 m_IsActive: 1
--- !u!4 &1528220821 --- !u!4 &1528220821
Transform: Transform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -24118,6 +24119,22 @@ Transform:
m_Father: {fileID: 1448897407} m_Father: {fileID: 1448897407}
m_RootOrder: 5 m_RootOrder: 5
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 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 --- !u!1 &1534889131
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -40087,6 +40104,7 @@ MonoBehaviour:
thermoMeter: {fileID: 1928679192} thermoMeter: {fileID: 1928679192}
cornManager: {fileID: 1870432536} cornManager: {fileID: 1870432536}
panColliderChanger: {fileID: 2137549896} panColliderChanger: {fileID: 2137549896}
toppingView: {fileID: 1528220822}
gameProgress: 0 gameProgress: 0
resultDelay: 1.8 resultDelay: 1.8
--- !u!4 &1870432534 --- !u!4 &1870432534

View File

@ -38,6 +38,9 @@ public class Corn : MonoBehaviour
private float cornSpillSpeed; private float cornSpillSpeed;
private float cornPopSpeed; private float cornPopSpeed;
private bool isHot; private bool isHot;
private bool topping;
private Sprite toppingSprite;
private IDisposable toppingDisposable;
public IReadOnlyReactiveProperty<CornCondition> Condition => condition; public IReadOnlyReactiveProperty<CornCondition> Condition => condition;
private readonly ReactiveProperty<CornCondition> condition = new ReactiveProperty<CornCondition>(CornCondition.Seed); private readonly ReactiveProperty<CornCondition> condition = new ReactiveProperty<CornCondition>(CornCondition.Seed);
@ -147,7 +150,14 @@ public class Corn : MonoBehaviour
private void CornPop() private void CornPop()
{ {
cornSkin.ChangeSkin(condition.Value); if (topping)
{
cornSkin.GetComponent<SpriteRenderer>().sprite = toppingSprite;
}
else
{
cornSkin.ChangeSkin(condition.Value);
}
rigidbody.AddForce(cornPopSpeed * Random.insideUnitCircle, ForceMode2D.Impulse); rigidbody.AddForce(cornPopSpeed * Random.insideUnitCircle, ForceMode2D.Impulse);
animator.SetTrigger(HashCornGrow); animator.SetTrigger(HashCornGrow);
VibrationManager.Instance.PlayVibrationOnce(); VibrationManager.Instance.PlayVibrationOnce();
@ -155,18 +165,20 @@ public class Corn : MonoBehaviour
private void CornBurnt() private void CornBurnt()
{ {
toppingDisposable?.Dispose();
cornSkin.ChangeSkin(condition.Value); cornSkin.ChangeSkin(condition.Value);
animator.SetTrigger(HashCornBurn); animator.SetTrigger(HashCornBurn);
var effect = Instantiate(effectBurnt, transform); var effect = Instantiate(effectBurnt, transform);
this.CallWaitForSeconds(.8f, () => Destroy(effect)); 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; cornPopTime = popTime;
cornBurntTime = cornPopTime + burntDuration; cornBurntTime = cornPopTime + burntDuration;
cornSpillSpeed = spillSpeed; cornSpillSpeed = spillSpeed;
cornPopSpeed = popSpeed; cornPopSpeed = popSpeed;
toppingSprite = newSprite;
} }
public void ChangeGrowSpeed(float speed) public void ChangeGrowSpeed(float speed)
@ -183,4 +195,26 @@ public class Corn : MonoBehaviour
{ {
animator.SetTrigger(HashCornWait); 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<SpriteRenderer>().sprite = toppingSprite;
}).AddTo(this);
break;
case CornCondition.Burnt:
topping = false;
break;
default:
throw new ArgumentOutOfRangeException();
}
}
} }

View File

@ -48,6 +48,7 @@ public class CornManager : MonoBehaviour
private Corn[] cornArray; private Corn[] cornArray;
private bool isHot; private bool isHot;
private bool isCompleted; private bool isCompleted;
private Sprite toppingSprite;
private readonly List<IObservable<CornCondition>> cornConditions = new List<IObservable<CornCondition>>(); private readonly List<IObservable<CornCondition>> cornConditions = new List<IObservable<CornCondition>>();
private readonly Subject<(CornCondition cond, Vector3 pos)> cornSpilledSubject = new Subject<(CornCondition, Vector3)>(); private readonly Subject<(CornCondition cond, Vector3 pos)> cornSpilledSubject = new Subject<(CornCondition, Vector3)>();
private readonly ReactiveProperty<int> missCount = new ReactiveProperty<int>(); private readonly ReactiveProperty<int> missCount = new ReactiveProperty<int>();
@ -145,7 +146,7 @@ public class CornManager : MonoBehaviour
{ {
var corn = Instantiate(cornPrefab, cornSpawnTarget); var corn = Instantiate(cornPrefab, cornSpawnTarget);
cornArray[i] = corn; 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 => cornGrowSpeed.TakeWhile(_ => !isCompleted).Subscribe(x =>
{ {
@ -165,7 +166,8 @@ public class CornManager : MonoBehaviour
{ {
corn.StartCornDance(); corn.StartCornDance();
}).AddTo(compositeDisposable); }).AddTo(compositeDisposable);
progress.Where(x => x >= .3f).Take(1).Subscribe(_ => corn.SetToppingFlag()).AddTo(compositeDisposable);
corn.Condition corn.Condition
.Where(_ => !isCompleted) // 結果確定後通知抑制 .Where(_ => !isCompleted) // 結果確定後通知抑制
@ -238,7 +240,8 @@ public class CornManager : MonoBehaviour
Observable.Range(0, amount).Subscribe(__ => Observable.Range(0, amount).Subscribe(__ =>
{ {
var corn = Instantiate(cornPrefab, cornSpawnTarget); 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 => cornGrowSpeed.TakeWhile(x => !isCompleted).Subscribe(x =>
{ {
// コーンが弾けた後はRedの場合のみ焦げ進行する // コーンが弾けた後はRedの場合のみ焦げ進行する
@ -297,4 +300,9 @@ public class CornManager : MonoBehaviour
isCompleted = true; isCompleted = true;
result.SetValueAndForceNotify(resultValue); result.SetValueAndForceNotify(resultValue);
} }
public void SetTopping(Sprite newSprite)
{
toppingSprite = newSprite;
}
} }

View File

@ -31,6 +31,7 @@ public class PopcornGameManager : MonoBehaviour
[SerializeField] private ThermoMeter thermoMeter; [SerializeField] private ThermoMeter thermoMeter;
[SerializeField] private CornManager cornManager; [SerializeField] private CornManager cornManager;
[SerializeField] private PanColliderChanger panColliderChanger; [SerializeField] private PanColliderChanger panColliderChanger;
[SerializeField] private ToppingView toppingView;
[Space] [Space]
[SerializeField, ReadOnly] private float gameProgress; [SerializeField, ReadOnly] private float gameProgress;
@ -132,6 +133,7 @@ public class PopcornGameManager : MonoBehaviour
gameView.SetPan(panData.GetPrefab()); gameView.SetPan(panData.GetPrefab());
thermalControl.SetPanData(panData); thermalControl.SetPanData(panData);
cornManager.SetCornsActive(true); cornManager.SetCornsActive(true);
cornManager.SetTopping(toppingView.GetSprite());
panColliderChanger.Reset(); panColliderChanger.Reset();
compositeDisposable.Clear(); compositeDisposable.Clear();
cornManager.Result.SkipLatestValueOnSubscribe() cornManager.Result.SkipLatestValueOnSubscribe()
@ -160,5 +162,17 @@ public class PopcornGameManager : MonoBehaviour
state.Value = GameState.Playing; state.Value = GameState.Playing;
}).AddTo(compositeDisposable); }).AddTo(compositeDisposable);
state.SetValueAndForceNotify(GameState.Guide); 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);
} }
} }

View File

@ -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);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 98be9fc96d3a48ce9aa0d4cc0d79648b
timeCreated: 1654153686