トッピング演出実装
This commit is contained in:
parent
7eabfad5d1
commit
22c7f48170
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
@ -146,8 +149,15 @@ public class Corn : MonoBehaviour
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CornPop()
|
private void CornPop()
|
||||||
|
{
|
||||||
|
if (topping)
|
||||||
|
{
|
||||||
|
cornSkin.GetComponent<SpriteRenderer>().sprite = toppingSprite;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
cornSkin.ChangeSkin(condition.Value);
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 =>
|
||||||
{
|
{
|
||||||
|
|
@ -166,6 +167,7 @@ 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 98be9fc96d3a48ce9aa0d4cc0d79648b
|
||||||
|
timeCreated: 1654153686
|
||||||
Loading…
Reference in New Issue