레스토랑 Serve 인터랙션 처리

This commit is contained in:
Jeonghyeon Ha 2025-09-01 17:55:26 +09:00
parent 0ee71d53d8
commit dfe19cbb4c
11 changed files with 105 additions and 20 deletions

View File

@ -167,7 +167,7 @@ MonoBehaviour:
Data: Data:
- Name: - Name:
Entry: 12 Entry: 12
Data: 2 Data: 3
- Name: - Name:
Entry: 7 Entry: 7
Data: Data:
@ -192,6 +192,18 @@ MonoBehaviour:
- Name: - Name:
Entry: 8 Entry: 8
Data: Data:
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 8
- Name: $v
Entry: 10
Data: 1
- Name:
Entry: 8
Data:
- Name: - Name:
Entry: 13 Entry: 13
Data: Data:

View File

@ -11,7 +11,7 @@ public VirtualItem(string itemId)
_itemId = itemId; _itemId = itemId;
} }
public string GetCarrierId() => _itemId; public string GetId() => _itemId;
public CarriableType GetCarriableType() => CarriableType.VirtualItem; public CarriableType GetCarriableType() => CarriableType.VirtualItem;
public GameObject GetGameObject() => null; public GameObject GetGameObject() => null;

View File

@ -12,8 +12,9 @@ public enum CarriableType
public interface ICarrier public interface ICarrier
{ {
GameObject GetCarrierGameObject(); GameObject GetCarrierGameObject();
string GetCarrierId(); string GetCurrentCarriableId();
ICarriable GetCurrentCarriable(); ICarriable GetCurrentCarriable();
bool IsCarrying();
bool CanCarryTo(ICarriable carriable); bool CanCarryTo(ICarriable carriable);
void Carry(ICarriable carriable); void Carry(ICarriable carriable);
void Use(ICarriable carriable); void Use(ICarriable carriable);
@ -21,7 +22,7 @@ public interface ICarrier
public interface ICarriable public interface ICarriable
{ {
string GetCarrierId(); string GetId();
CarriableType GetCarriableType(); CarriableType GetCarriableType();
void OnCarried(ICarrier carrier); void OnCarried(ICarrier carrier);
bool CanCarry(); bool CanCarry();
@ -40,9 +41,9 @@ public GameObject GetCarrierGameObject()
return gameObject; return gameObject;
} }
public string GetCarrierId() public string GetCurrentCarriableId()
{ {
return _currentCarriable.GetCarrierId(); return _currentCarriable.GetId();
} }
public ICarriable GetCurrentCarriable() public ICarriable GetCurrentCarriable()
@ -50,6 +51,11 @@ public ICarriable GetCurrentCarriable()
return _currentCarriable; return _currentCarriable;
} }
public bool IsCarrying()
{
return GetCurrentCarriable() != null;
}
public bool CanCarryTo(ICarriable carriable) public bool CanCarryTo(ICarriable carriable)
{ {
if (_currentCarriable != null) return false; if (_currentCarriable != null) return false;
@ -65,7 +71,7 @@ public void Carry(ICarriable carriable)
_currentCarriable.OnCarried(this); _currentCarriable.OnCarried(this);
_speechBubble ??= GetComponentInChildren<ISpeechBubble>(); _speechBubble ??= GetComponentInChildren<ISpeechBubble>();
_speechBubble?.Show(_currentCarriable.GetCarrierId()); _speechBubble?.Show(_currentCarriable.GetId());
} }
public void Use(ICarriable carriable) public void Use(ICarriable carriable)

View File

@ -2,6 +2,7 @@
namespace DDD.Restaurant namespace DDD.Restaurant
{ {
[RequireComponent(typeof(CharacterCarrier))]
[RequireComponent(typeof(PlayerMovement))] [RequireComponent(typeof(PlayerMovement))]
public class PlayerCharacter : RestaurantCharacter public class PlayerCharacter : RestaurantCharacter
{ {

View File

@ -21,6 +21,8 @@ public class RestaurantOrderObjectState
public string RecipeId; public string RecipeId;
public string FoodId; public string FoodId;
public string ServedFoodId;
} }
public interface IRestaurantOrderObject public interface IRestaurantOrderObject

View File

@ -16,6 +16,7 @@ public string MenuId
public class RestaurantOrderEvent : IEvent public class RestaurantOrderEvent : IEvent
{ {
public RestaurantOrderObjectState OrderObjectState; public RestaurantOrderObjectState OrderObjectState;
public RestaurantOrderType OrderPhase;
} }
public class RestaurantOrderSolver_Order : RestaurantOrderSolverBase public class RestaurantOrderSolver_Order : RestaurantOrderSolverBase
@ -53,8 +54,11 @@ public override bool ExecuteInteractionSubsystem(IInteractor interactor, IIntera
RestaurantOrderMenuPayload orderPayload = ScriptableObject.CreateInstance<RestaurantOrderMenuPayload>(); RestaurantOrderMenuPayload orderPayload = ScriptableObject.CreateInstance<RestaurantOrderMenuPayload>();
orderPayload.MenuId = recipeMenu; orderPayload.MenuId = recipeMenu;
RestaurantOrderEvent evt = new RestaurantOrderEvent(); RestaurantOrderEvent evt = new RestaurantOrderEvent
evt.OrderObjectState = orderObject?.GetOrderObjectState(); {
OrderObjectState = orderObject?.GetOrderObjectState()
, OrderPhase = RestaurantOrderType.Order
};
EventBus.Broadcast(evt); EventBus.Broadcast(evt);
return base.ExecuteInteractionSubsystem(interactor, interactable, payload); return base.ExecuteInteractionSubsystem(interactor, interactable, payload);

View File

@ -6,11 +6,40 @@ public class RestaurantOrderSolver_Serve : RestaurantOrderSolverBase
{ {
public override bool ExecuteInteractionSubsystem(IInteractor interactor, IInteractable interactable, ScriptableObject payload = null) public override bool ExecuteInteractionSubsystem(IInteractor interactor, IInteractable interactable, ScriptableObject payload = null)
{ {
return base.ExecuteInteractionSubsystem(interactor, interactable, payload); var carrier = interactor?.GetInteractorGameObject()?.GetComponent<ICarrier>();
if(carrier == null) return false;
var orderObject = GetRestaurantOrderObject(interactable);
if(orderObject == null) return false;
if(carrier.GetCurrentCarriable() == null) return false;
string carriedFoodId = carrier.GetCurrentCarriableId();
orderObject.GetOrderObjectState().ServedFoodId = carriedFoodId;
bool result = base.ExecuteInteractionSubsystem(interactor, interactable, payload);
// ExecuteInteractionSubsystem 이후에 음식 제거 - 미리 제거하면 CanExecute 통과 못 함
carrier.Use(carrier.GetCurrentCarriable());
// OnFoodServed (Consume Bill Hud item)
RestaurantOrderEvent evt = new RestaurantOrderEvent
{
OrderObjectState = orderObject?.GetOrderObjectState()
, OrderPhase = RestaurantOrderType.Serve
};
EventBus.Broadcast(evt);
return result;
} }
public override bool CanExecuteInteractionSubsystem(IInteractor interactor = null, IInteractable interactable = null, ScriptableObject payload = null) public override bool CanExecuteInteractionSubsystem(IInteractor interactor = null, IInteractable interactable = null, ScriptableObject payload = null)
{ {
// Does interactor carry any food?
var carrier = interactor?.GetInteractorGameObject()?.GetComponent<ICarrier>();
if (carrier != null)
{
return carrier.IsCarrying();
}
return false; return false;
} }
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;
@ -8,6 +9,7 @@ public class BillHud : MonoBehaviour, IEventHandler<RestaurantOrderEvent>
{ {
[SerializeField] private RectTransform _billItemsLayoutTransform; [SerializeField] private RectTransform _billItemsLayoutTransform;
[SerializeField] private GameObject _billItemPrefab; [SerializeField] private GameObject _billItemPrefab;
private readonly Dictionary<GameObject, GameObject> _billItemMap = new();
private void Start() private void Start()
{ {
@ -18,9 +20,24 @@ private void Start()
public void HandleEvent(RestaurantOrderEvent evt) public void HandleEvent(RestaurantOrderEvent evt)
{ {
if (evt.OrderPhase == RestaurantOrderType.Order)
{
var orderState = evt.OrderObjectState;
if (orderState == null) return;
var billItem = Instantiate(_billItemPrefab, _billItemsLayoutTransform); var billItem = Instantiate(_billItemPrefab, _billItemsLayoutTransform);
var sprite = DataManager.Instance.GetSprite(evt.OrderObjectState?.FoodId); var sprite = DataManager.Instance.GetSprite(orderState.FoodId);
billItem.GetComponent<Image>().sprite = sprite; billItem.GetComponent<Image>().sprite = sprite;
_billItemMap[orderState.Customer] = billItem;
}
else if (evt.OrderPhase == RestaurantOrderType.Serve)
{
// Find bill item by customer from _billItemMap, then destroy it.
if (_billItemMap.TryGetValue(evt.OrderObjectState.Customer, out var billItem))
{
Destroy(billItem);
_billItemMap.Remove(evt.OrderObjectState.Customer);
}
}
} }
} }
} }

View File

@ -33,8 +33,7 @@ protected virtual void Initialize()
return; return;
} }
// TODO: 임시 나중에 제대로 수정할 것 var uiGameObject = Instantiate(new GameObject("PropWorldUi"), transform);
var uiGameObject = Instantiate(new GameObject("TemporaryUi"), transform);
_spriteRenderer = uiGameObject.AddComponent<SpriteRenderer>(); _spriteRenderer = uiGameObject.AddComponent<SpriteRenderer>();
UpdateSprite(); UpdateSprite();
@ -67,7 +66,7 @@ private bool GetOwnerInteractable(out IInteractable interactable)
protected virtual int GetDisplayLayer() protected virtual int GetDisplayLayer()
{ {
return LayerMask.NameToLayer("WorldUI"); return LayerMask.NameToLayer(LayerConstants.WorldUi);
} }
protected virtual Sprite GetDisplaySprite() protected virtual Sprite GetDisplaySprite()

View File

@ -37,7 +37,11 @@ protected override void UpdateSpriteTransform()
protected override Sprite GetDisplaySprite() protected override Sprite GetDisplaySprite()
{ {
if (GetCurrentInteractionType() == RestaurantOrderType.Serve && _interactionSubsystemObject != null) if (_interactionSubsystemObject == null)
return base.GetDisplaySprite();
if (GetCurrentInteractionType() == RestaurantOrderType.Serve ||
GetCurrentInteractionType() == RestaurantOrderType.Busy)
{ {
// Sprite by current restaurant order type. get from RestaurantOrderObject. // Sprite by current restaurant order type. get from RestaurantOrderObject.
if (_interactionSubsystemObject is IRestaurantOrderObject orderObject) if (_interactionSubsystemObject is IRestaurantOrderObject orderObject)
@ -76,9 +80,14 @@ protected override Vector3 GetDisplayPosition()
protected override int GetDisplayLayer() protected override int GetDisplayLayer()
{ {
if (GetCurrentInteractionType() == RestaurantOrderType.Serve) if (GetCurrentInteractionType() != RestaurantOrderType.Serve &&
GetCurrentInteractionType() != RestaurantOrderType.Busy)
{ {
return LayerMask.NameToLayer("Prop"); return LayerMask.NameToLayer(LayerConstants.Prop);
}
else
{
return LayerMask.NameToLayer(LayerConstants.WorldUi);
} }
return base.GetDisplayLayer(); return base.GetDisplayLayer();
} }

View File

@ -66,4 +66,10 @@ public static class SpriteConstants
public const string EmptyFoodSpriteKey = "EmptyFood"; public const string EmptyFoodSpriteKey = "EmptyFood";
public const string EmptyWorker = "EmptyWorker"; public const string EmptyWorker = "EmptyWorker";
} }
public static class LayerConstants
{
public const string Prop = "Prop";
public const string WorldUi = "WorldUI";
}
} }