トッピング演出実装
This commit is contained in:
parent
7eabfad5d1
commit
22c7f48170
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<CornCondition> Condition => condition;
|
||||
private readonly ReactiveProperty<CornCondition> condition = new ReactiveProperty<CornCondition>(CornCondition.Seed);
|
||||
|
|
@ -146,8 +149,15 @@ public class Corn : MonoBehaviour
|
|||
}
|
||||
|
||||
private void CornPop()
|
||||
{
|
||||
if (topping)
|
||||
{
|
||||
cornSkin.GetComponent<SpriteRenderer>().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<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 bool isHot;
|
||||
private bool isCompleted;
|
||||
private Sprite toppingSprite;
|
||||
private readonly List<IObservable<CornCondition>> cornConditions = new List<IObservable<CornCondition>>();
|
||||
private readonly Subject<(CornCondition cond, Vector3 pos)> cornSpilledSubject = new Subject<(CornCondition, Vector3)>();
|
||||
private readonly ReactiveProperty<int> missCount = new ReactiveProperty<int>();
|
||||
|
|
@ -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 =>
|
||||
{
|
||||
|
|
@ -166,6 +167,7 @@ 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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