0.3.2.17 버전 업데이트

This commit is contained in:
NTG_Lenovo 2024-10-29 21:17:00 +09:00
parent 3cb6c7b52b
commit 726063fcf6
17 changed files with 3054 additions and 2770 deletions

File diff suppressed because it is too large Load Diff

View File

@ -77,6 +77,7 @@ namespace BlueWater.Npcs.Crews.Bartender
}
MyBartenderTable.CompleteMakingCocktail(_makingCocktailData);
EventManager.InvokeCocktailCompleted(_makingCocktailData, false);
ResetMission();
}
}

View File

@ -141,8 +141,6 @@ namespace BlueWater.Npcs.Customers
private int _paidAmount;
private int _foodPrice;
private int _tipAmount;
private bool _isQuitting;
// State
public StateMachineController<Customer> StateMachineController { get; private set; }
@ -170,11 +168,6 @@ namespace BlueWater.Npcs.Customers
EventManager.OnGaugeResetCustomers += ResetGauge;
}
private void OnApplicationQuit()
{
_isQuitting = true;
}
private void Update()
{
StateMachineController.UpdateState(this);
@ -303,7 +296,7 @@ namespace BlueWater.Npcs.Customers
IsOrderedSucceed = currentPickupItem.Idx == OrderedCocktailData.Idx;
IsReceivedItem = true;
ServedItem(servedCocktailData);
EventManager.InvokeCocktailServedToCustomer(servedCocktailData);
EventManager.InvokeCocktailServedToCustomer(servedCocktailData, true);
EventManager.InvokeOrderResult(this, IsOrderedSucceed);
break;
default:
@ -335,6 +328,7 @@ namespace BlueWater.Npcs.Customers
IsOrderedSucceed = currentPickupItem.Idx == OrderedCocktailData.Idx;
IsReceivedItem = true;
ServedItem(servedCocktailData);
EventManager.InvokeCocktailServedToCustomer(servedCocktailData, false);
serverCrew.BalloonUi.DiscardItem();
serverCrew.ResetMission();
EventManager.InvokeOrderResult(this, IsOrderedSucceed);
@ -347,7 +341,7 @@ namespace BlueWater.Npcs.Customers
public bool CanInteractionCrew(Crew crew = null)
{
return !IsReceivedItem && CurrentTableSeat;
return IsOrderedCocktail();
}
public virtual void ShowInteractionUi()
@ -470,12 +464,17 @@ namespace BlueWater.Npcs.Customers
public void ResetGauge()
{
if (!CurrentTableSeat || IsReceivedItem) return;
if (!IsOrderedCocktail()) return;
BalloonUi.ResetGauge();
CurrentBill.ResetGauge();
}
public bool IsOrderedCocktail()
{
return CurrentTableSeat && !IsReceivedItem;
}
#endregion
}
}

View File

@ -24,18 +24,14 @@ namespace BlueWater.Players.Tycoons
private void Start()
{
EventManager.OnCocktailStarted += PickupUnfinishedCocktail;
EventManager.OnCocktailCompleted += PickupItem;
EventManager.OnCocktailDiscarded += DiscardItem;
EventManager.OnCocktailServedToCustomer += GiveItem;
EventManager.OnMakeCocktailStarted += PickupUnfinishedCocktail;
EventManager.OnMakeCocktailCompleted += PickupItem;
}
private void OnDestroy()
{
EventManager.OnCocktailStarted -= PickupUnfinishedCocktail;
EventManager.OnCocktailCompleted -= PickupItem;
EventManager.OnCocktailDiscarded -= DiscardItem;
EventManager.OnCocktailServedToCustomer -= GiveItem;
EventManager.OnMakeCocktailStarted -= PickupUnfinishedCocktail;
EventManager.OnMakeCocktailCompleted -= PickupItem;
}
[Button("컴포넌트 초기화")]
@ -49,8 +45,10 @@ namespace BlueWater.Players.Tycoons
_isUnfinishedCocktailPickedUp = true;
}
public void PickupItem(IPickup item)
public void PickupItem(IPickup item, bool isMadePlayer)
{
if (!isMadePlayer) return;
if (_isPickedUpItem)
{
Debug.Log("이미 아이템을 들고 있습니다.");
@ -64,7 +62,7 @@ namespace BlueWater.Players.Tycoons
_isPickedUpItem = true;
}
public void GiveItem(IPickup item)
public void ServedItem(IPickup item)
{
if (!_isPickedUpItem || _currentPickupItem == null)
{

View File

@ -1,4 +1,5 @@
using BlueWater.Interfaces;
using BlueWater.Items;
using BlueWater.Tycoons;
using BlueWater.Uis;
using Sirenix.OdinInspector;
@ -93,11 +94,10 @@ namespace BlueWater.Players.Tycoons
TycoonInput.OnMoveInputReceived += TycoonMovement.HandleInputMovement;
EventManager.OnDead += Die;
var balloonUi = InteractionCanvas.BalloonUi;
EventManager.OnCocktailStarted += balloonUi.PickupUnfinishedCocktail;
EventManager.OnCocktailCompleted += balloonUi.SetItemImage;
EventManager.OnCocktailDiscarded += balloonUi.DiscardItem;
EventManager.OnCocktailServedToCustomer += balloonUi.GiveItem;
EventManager.OnMakeCocktailStarted += MakeCocktailStarted;
EventManager.OnMakeCocktailCompleted += MakeCocktailCompleted;
EventManager.OnCocktailDiscarded += DiscardCocktail;
EventManager.OnCocktailServedToCustomer += ServedCocktail;
IdleStateMachine = new IdleStateMachine();
WalkingStateMachine = new WalkingStateMachine();
@ -121,11 +121,10 @@ namespace BlueWater.Players.Tycoons
TycoonInput.OnMoveInputReceived -= TycoonMovement.HandleInputMovement;
EventManager.OnDead -= Die;
var balloonUi = InteractionCanvas.BalloonUi;
EventManager.OnCocktailStarted -= balloonUi.PickupUnfinishedCocktail;
EventManager.OnCocktailCompleted -= balloonUi.SetItemImage;
EventManager.OnCocktailDiscarded -= balloonUi.DiscardItem;
EventManager.OnCocktailServedToCustomer -= balloonUi.GiveItem;
EventManager.OnMakeCocktailStarted -= MakeCocktailStarted;
EventManager.OnMakeCocktailCompleted -= MakeCocktailCompleted;
EventManager.OnCocktailDiscarded -= DiscardCocktail;
EventManager.OnCocktailServedToCustomer -= ServedCocktail;
}
#endregion
@ -172,6 +171,34 @@ namespace BlueWater.Players.Tycoons
CurrentStateMachine.EnterState(this);
}
public void MakeCocktailStarted()
{
InteractionCanvas.BalloonUi.PickupUnfinishedCocktail();
}
public void MakeCocktailCompleted(CocktailData cocktailData, bool isMadePlayer)
{
if (!isMadePlayer) return;
InteractionCanvas.BalloonUi.SetItemImage(cocktailData);
}
public void DiscardCocktail(CocktailData cocktailData, bool isDiscardedPlayer)
{
if (!isDiscardedPlayer) return;
TycoonPickupHandler.DiscardItem();
InteractionCanvas.BalloonUi.DiscardItem();
}
public void ServedCocktail(CocktailData cocktailData, bool isServedPlayer)
{
if (!isServedPlayer) return;
TycoonPickupHandler.ServedItem(cocktailData);
InteractionCanvas.BalloonUi.ServedItem();
}
#endregion
}
}

View File

@ -120,24 +120,24 @@ namespace BlueWater
}
// 플레이어 칵테일 제조 시작 이벤트
public static Action OnCocktailStarted;
public static Action OnMakeCocktailStarted;
public static void InvokeCocktailStarted()
{
OnCocktailStarted?.Invoke();
OnMakeCocktailStarted?.Invoke();
}
// 플레이어 칵테일 제조 완성 이벤트
public static Action<CocktailData> OnCocktailCompleted;
public static void InvokeCocktailCompleted(CocktailData completedCocktail)
// 칵테일 제조 완성 이벤트 (bool값은 player가 만들었으면 true, crew가 만들었으면 false)
public static Action<CocktailData, bool> OnMakeCocktailCompleted;
public static void InvokeCocktailCompleted(CocktailData completedCocktail, bool isMadePlayer)
{
OnCocktailCompleted?.Invoke(completedCocktail);
OnMakeCocktailCompleted?.Invoke(completedCocktail, isMadePlayer);
}
// 플레이어가 들고있는 칵테일 버리기 이벤트
public static Action OnCocktailDiscarded;
public static void InvokeCocktailDiscarded()
public static Action<CocktailData, bool> OnCocktailDiscarded;
public static void InvokeCocktailDiscarded(CocktailData cocktailData, bool isDiscardedPlayer)
{
OnCocktailDiscarded?.Invoke();
OnCocktailDiscarded?.Invoke(cocktailData, isDiscardedPlayer);
}
// 플레이어가 들고있는 칵테일을 서빙테이블에 올려두는 이벤트
@ -169,10 +169,10 @@ namespace BlueWater
}
// 손님이 칵테일을 받을때 이벤트
public static Action<CocktailData> OnCocktailServedToCustomer;
public static void InvokeCocktailServedToCustomer(CocktailData servedCocktailData)
public static Action<CocktailData, bool> OnCocktailServedToCustomer;
public static void InvokeCocktailServedToCustomer(CocktailData servedCocktailData, bool isServedPlayer)
{
OnCocktailServedToCustomer?.Invoke(servedCocktailData);
OnCocktailServedToCustomer?.Invoke(servedCocktailData, isServedPlayer);
}
// 손님이 칵테일을 받을때 결과 이벤트

View File

@ -12,7 +12,7 @@ namespace BlueWater.Tycoons
// 테이블의 칵테일을 가져가는 경우
if (CurrentPickupItem != null)
{
CurrentTycoonPlayer.TycoonPickupHandler.PickupItem(CurrentPickupItem);
CurrentTycoonPlayer.TycoonPickupHandler.PickupItem(CurrentPickupItem, true);
CurrentTycoonPlayer.InteractionCanvas.BalloonUi.SetItemImage(CurrentPickupItem);
CocktailGlassImage.enabled = false;
InteractionCanvas.BalloonUi.DiscardItem();

View File

@ -1,4 +1,3 @@
using System;
using System.Collections.Generic;
using BlueWater.Items;
using BlueWater.Uis;
@ -50,8 +49,10 @@ namespace BlueWater.Tycoons
base.OnEnable();
}
private void Start()
protected override void Start()
{
base.Start();
CookGauge.enabled = false;
FireWoodQuantity.enabled = false;
FoodQuantity.enabled = false;
@ -121,7 +122,7 @@ namespace BlueWater.Tycoons
var carriedItemData = CurrentTycoonPlayer.TycoonPickupHandler.GetCurrentPickupItem();
if (carriedItemData.Idx == FireWoodIdx)
{
CurrentTycoonPlayer.TycoonPickupHandler.GiveItem(carriedItemData);
CurrentTycoonPlayer.TycoonPickupHandler.ServedItem(carriedItemData);
_currentFireWoodCount++;
}
}

View File

@ -64,7 +64,7 @@ namespace BlueWater.Tycoons
// 테이블의 칵테일을 가져가는 경우
if (CurrentPickupItem != null)
{
CurrentTycoonPlayer.TycoonPickupHandler.PickupItem(CurrentPickupItem);
CurrentTycoonPlayer.TycoonPickupHandler.PickupItem(CurrentPickupItem, true);
CurrentTycoonPlayer.InteractionCanvas.BalloonUi.SetItemImage(CurrentPickupItem);
CocktailGlassImage.enabled = false;
InteractionCanvas.BalloonUi.DiscardItem();

View File

@ -1,10 +1,15 @@
using BlueWater.Items;
namespace BlueWater.Tycoons
{
public class TrashCan : InteractionFurniture
{
public override void Interaction()
{
EventManager.InvokeCocktailDiscarded();
var discardCocktailDataIdx = CurrentTycoonPlayer.TycoonPickupHandler.GetCurrentPickupItem().Idx;
var discardCocktailData = ItemManager.Instance.CocktailDataSo.GetDataByIdx(discardCocktailDataIdx);
EventManager.InvokeCocktailDiscarded(discardCocktailData, true);
}
public override bool CanInteraction()

View File

@ -131,17 +131,26 @@ namespace BlueWater.Tycoons
private IEnumerator FindBartenderCrewCoroutine(Customer orderedCustomer)
{
var waitTime = new WaitForSeconds(2f);
var tycoonIngredientController = TycoonManager.Instance.TycoonIngredientController;
var tycoonManager = TycoonManager.Instance;
var tycoonIngredientController = tycoonManager.TycoonIngredientController;
var orderedCocktailData = orderedCustomer.OrderedCocktailData;
yield return new WaitForSeconds(0.5f);
while (true)
{
var orderedCount = tycoonManager.CustomerController.OrderedCocktailCount(orderedCocktailData.Idx);
if (!tycoonManager.TycoonStageController.CanMakingCocktail(orderedCocktailData.Idx, orderedCount))
{
yield return waitTime;
continue;
}
foreach (var element in BartenderCrews)
{
if (element.MyBartenderTable.CurrentPickupItem != null || element.IsOnMission) continue;
var orderedCocktailIngredients = orderedCustomer.OrderedCocktailData.ValidIngredients;
var orderedCocktailIngredients = orderedCocktailData.ValidIngredients;
if (!tycoonIngredientController.IsMakingCocktail(orderedCocktailIngredients)) break;
if (orderedCustomer.IsReceivedItem || orderedCustomer.IsMatchedServer) yield break;

View File

@ -1,6 +1,8 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using BlueWater.Interfaces;
using BlueWater.Items;
using BlueWater.Npcs.Customers;
using BlueWater.Utility;
using Sirenix.OdinInspector;
@ -132,5 +134,10 @@ namespace BlueWater.Tycoons
return null;
}
public int OrderedCocktailCount(string cocktailDataIdx)
{
return InstanceCustomers.Count(element => element.IsOrderedCocktail() && element.OrderedCocktailData.Idx == cocktailDataIdx);
}
}
}

View File

@ -54,10 +54,10 @@ namespace BlueWater
private Transform _spawnLocation;
[SerializeField]
private Vector3 _pushDirection;
private Vector3 _pushDirection = new(-3f, -1f, 0f);
[SerializeField]
private float _pushPower;
private float _pushPower = 50;
[Title("Liquid / Garnish")]
[SerializeField, Required, Tooltip("원액 프리팹")]
@ -67,10 +67,10 @@ namespace BlueWater
private Garnish _garnishObject;
[SerializeField, Tooltip("초당 생성되는 액체 수(ml)")]
private int _liquidsPerSecond = 80;
private int _liquidsPerSecond = 100;
[SerializeField]
private int _maxLiquidCount = 400;
private int _maxLiquidCount = 300;
[SerializeField, Range(0f, 1f), Tooltip("목표 색상으로 변경되는데 걸리는 시간")]
private float _colorLerpSpeed = 0.5f;
@ -78,6 +78,10 @@ namespace BlueWater
[SerializeField, Range(1f, 5f), Tooltip("목표 색상 * 밝기")]
private float _colorIntensity = 2f;
[Title("도착 지점")]
[SerializeField, Tooltip("도착 지점의 Lerp값")]
private Vector2 _reachedLerpPosition = new(-10.5f, 4f);
[Title("오브젝트 풀링")]
[SerializeField, Tooltip("오브젝트 풀링 최대 개수")]
private int _objectPoolCount = 1000;
@ -90,10 +94,10 @@ namespace BlueWater
private Sprite _playerBalloonImage;
[SerializeField]
private float _moveToPlayerDuration = 0.5f;
private float _moveToPlayerDuration = 0.2f;
[SerializeField]
private float _moveToCenterDuration = 0.2f;
private float _moveToCenterDuration = 0.15f;
[SerializeField]
private Vector3 _centerPosition = new(-300f, 0f, 0f);
@ -124,6 +128,7 @@ namespace BlueWater
private Color _targetColor;
private Camera _overlayCamera;
private TycoonPlayer _tycoonPlayer;
private Vector2 _originalReachedPosition;
private Vector3 _lastPlayerPosition;
private Vector3 _originalPanelScale;
private Coroutine _movePanelToPlayerInstance;
@ -158,6 +163,7 @@ namespace BlueWater
_instanceMaterial = Instantiate(_liquidRenderer.material);
_liquidRenderer.material = _instanceMaterial;
_originalReachedPosition = _reachedCollider.transform.position;
_originalPanelScale = _liquidPanel.transform.localScale;
_instanceMaterial.SetFloat(LiquidAmountHash, 0f);
_timeInterval = 1f / _liquidsPerSecond;
@ -312,8 +318,10 @@ namespace BlueWater
HidePanel();
}
public void ReleaseAllObject(CocktailData cocktailData)
public void ReleaseAllObject(CocktailData cocktailData, bool isServedPlayer)
{
if (!isServedPlayer) return;
// 리스트 삭제는 뒤에서부터 해야 오류가 없음
for (var i = _activeLiquidDatas.Count - 1; i >= 0; i--)
{
@ -341,6 +349,7 @@ namespace BlueWater
_isCompleted = false;
_currentMixedColor = barrel.GetLiquidData().Color;
_instanceMaterial.SetColor(LiquidColorHash, _currentMixedColor * _colorIntensity);
_reachedCollider.transform.position = _originalReachedPosition;
EventManager.InvokeCocktailStarted();
}
@ -474,7 +483,7 @@ namespace BlueWater
yield return new WaitForSeconds(1f);
HidePanel();
EventManager.InvokeCocktailCompleted(matchingCocktail);
EventManager.InvokeCocktailCompleted(matchingCocktail, true);
}
/// <summary>
@ -508,6 +517,9 @@ namespace BlueWater
_liquidReachedTime = Time.time;
SetCurrentAmount(++_currentLiquidAmount);
var liquidAmount = Mathf.Clamp(_currentLiquidAmount / _maxLiquidCount, 0f, 1f);
var reachedColliderPositionY = Mathf.Lerp(_reachedLerpPosition.x, _reachedLerpPosition.y, liquidAmount);
_reachedCollider.transform.position = new Vector3(_reachedCollider.transform.position.x,
reachedColliderPositionY, _reachedCollider.transform.position.z);
_instanceMaterial.SetFloat(LiquidAmountHash, liquidAmount);
_targetColor = MixColorsByTime();

View File

@ -1,7 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using BlueWater.Npcs.Customers;
using BlueWater.Items;
using BlueWater.Utility;
using Sirenix.OdinInspector;
using UnityEngine;
@ -13,8 +13,7 @@ namespace BlueWater.Tycoons
[field: SerializeField, Required]
public StageDataSo StageDataSo { get; private set; }
[SerializeField]
private List<CustomerVisitInfo> _dailyCustomerVisitInfos;
public Dictionary<string, int> InstanceCocktailDatas { get; private set; } = new();
private bool _isClosedTime;
private TycoonManager _tycoonManager;
@ -24,20 +23,23 @@ namespace BlueWater.Tycoons
private void Start()
{
_tycoonManager = TycoonManager.Instance;
_dailyCustomerVisitInfos = new List<CustomerVisitInfo>();
EventManager.OnInitializedPlayerInput += StartStage;
EventManager.OnMakeCocktailCompleted += AddInstanceCocktail;
EventManager.OnCocktailServedToCustomer += RemoveInstanceCocktail;
EventManager.OnCocktailDiscarded += RemoveInstanceCocktail;
}
private void OnDestroy()
{
EventManager.OnInitializedPlayerInput -= StartStage;
EventManager.OnMakeCocktailCompleted -= AddInstanceCocktail;
EventManager.OnCocktailServedToCustomer -= RemoveInstanceCocktail;
EventManager.OnCocktailDiscarded -= RemoveInstanceCocktail;
}
private void StartStage()
{
_dailyCustomerVisitInfos.Clear();
Utils.StartUniqueCoroutine(this, ref _startStageCoroutineInstance, StartStageCoroutine());
EventManager.InvokeTycoonGameStarted();
@ -65,14 +67,38 @@ namespace BlueWater.Tycoons
}
}
public void RegisterCustomerVisitInfo(CustomerVisitInfo customerVisitInfo)
public void AddInstanceCocktail(CocktailData cocktailData, bool isMadePlayer)
{
Utils.RegisterList(_dailyCustomerVisitInfos, customerVisitInfo);
var idx = cocktailData.Idx;
if (!InstanceCocktailDatas.TryAdd(idx, 1))
{
InstanceCocktailDatas[idx]++;
}
}
public void UnregisterCustomerVisitInfo(CustomerVisitInfo customerVisitInfo)
public void RemoveInstanceCocktail(CocktailData cocktailData, bool isRemovedPlayer)
{
Utils.UnregisterList(_dailyCustomerVisitInfos, customerVisitInfo);
var idx = cocktailData.Idx;
if (InstanceCocktailDatas.ContainsKey(idx))
{
InstanceCocktailDatas[idx]--;
}
}
public bool CanMakingCocktail(string cocktailDataIdx, int orderedCount)
{
if (!InstanceCocktailDatas.TryGetValue(cocktailDataIdx, out var instanceCount)) return true;
return instanceCount < orderedCount;
}
private void PrintInstanceCocktailDatas()
{
foreach (var element in InstanceCocktailDatas)
{
print($"key : {element.Key}, Value : {element.Value}");
}
print("\n");
}
}
}

View File

@ -104,7 +104,7 @@ namespace BlueWater.Uis
SetEmpty();
}
public void GiveItem(IPickup item)
public void ServedItem()
{
_isUnfinishedCocktailPickedUp = false;
HideUi();

View File

@ -508,38 +508,6 @@ MonoBehaviour:
m_Calls: []
m_ActionId: 0dbf1015-499a-43fe-b252-11c232b9a1ae
m_ActionName: 'Combat/HealthPointMax[/Keyboard/f3]'
- m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1674052485383758547}
m_TargetAssemblyTypeName: BlueWater.Players.Tycoons.TycoonInput, Assembly-CSharp
m_MethodName: OnPour
m_Mode: 0
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
m_ActionId: b02d861a-39ed-4c5e-abd0-7ce3c2a44707
m_ActionName: 'Bar/Pour[/Keyboard/e]'
- m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1674052485383758547}
m_TargetAssemblyTypeName: BlueWater.Players.Tycoons.TycoonInput, Assembly-CSharp
m_MethodName: OnCancel
m_Mode: 0
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
m_ActionId: 4752dd64-7a31-42ae-bfc9-45a01927bd07
m_ActionName: 'Bar/EscapeBar[/Keyboard/escape]'
- m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1674052485383758547}

View File

@ -141,7 +141,7 @@ Rigidbody2D:
m_Mass: 10
m_LinearDamping: 0
m_AngularDamping: 0
m_GravityScale: 3
m_GravityScale: 6
m_Material: {fileID: 6200000, guid: 98be3277bd162b947a951461d0862c30, type: 2}
m_IncludeLayers:
serializedVersion: 2
@ -165,6 +165,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: f725398f0fbd88e43b707a988c2b347a, type: 3}
m_Name:
m_EditorClassIdentifier:
_spriteRenderer: {fileID: 3772201455671009312}
_rigidbody2D: {fileID: 3470010340248184897}
SpriteRenderer: {fileID: 3772201455671009312}
Rigidbody2D: {fileID: 3470010340248184897}
_distanceThreshold: 0.5