From 5e8f08a7b99407cdd5a75c858bcc6671d81c2f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=82=B0?= Date: Mon, 1 Sep 2025 18:01:34 +0900 Subject: [PATCH] =?UTF-8?q?CustomerPatienceUiComponent=20=EC=88=98?= =?UTF-8?q?=EC=A0=95:=20=EC=83=81=ED=83=9C=20=EC=B4=88=EA=B8=B0=ED=99=94?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80,=20=EC=8A=AC=EB=9D=BC=EC=9D=B4=EB=8D=94?= =?UTF-8?q?=EB=A5=BC=20=ED=86=B5=ED=95=9C=20RemainingPatienceTime=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=81=ED=99=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84,=20=EA=B4=80=EB=A0=A8=20Prefab=20=EB=B0=8F=20?= =?UTF-8?q?=EB=B8=94=EB=9E=99=EB=B3=B4=EB=93=9C=20Key=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AI/Customer/Subtree/OrderSubtree.asset | 4 +- .../_Addressables/Prefabs/CustomerNpc.prefab | 350 +++++++++++++++++- .../AI/Common/Decorator/TimeLimiter.cs | 3 +- .../Customer/Decorator/CustomerTimeLimiter.cs | 3 +- .../Interfaces/ICustomerBlackboard.cs | 3 +- .../Ui/OrderUi/CustomerPatienceUiComponent.cs | 78 +++- 6 files changed, 425 insertions(+), 16 deletions(-) diff --git a/Assets/_DDD/_Addressables/AI/Customer/Subtree/OrderSubtree.asset b/Assets/_DDD/_Addressables/AI/Customer/Subtree/OrderSubtree.asset index dfc57475d..38908aa26 100644 --- a/Assets/_DDD/_Addressables/AI/Customer/Subtree/OrderSubtree.asset +++ b/Assets/_DDD/_Addressables/AI/Customer/Subtree/OrderSubtree.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eb82276e36ca7c53a3674df1108655ddac7cade525c3f24b0045e24f6063cc29 -size 23457 +oid sha256:202ad7081128e8607b69e2698acfbaf2ef9ea1adf22f382fb4c19b0f6f623f72 +size 23569 diff --git a/Assets/_DDD/_Addressables/Prefabs/CustomerNpc.prefab b/Assets/_DDD/_Addressables/Prefabs/CustomerNpc.prefab index 4e2728746..ae9e28304 100644 --- a/Assets/_DDD/_Addressables/Prefabs/CustomerNpc.prefab +++ b/Assets/_DDD/_Addressables/Prefabs/CustomerNpc.prefab @@ -1,5 +1,280 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &633131044254461841 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3251801155585931500} + m_Layer: 10 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3251801155585931500 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633131044254461841} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 609795798002784246} + m_Father: {fileID: 4124712097831813607} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &6108830054777696831 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 609795798002784246} + - component: {fileID: 5096550498312619918} + - component: {fileID: 6088464776038824938} + m_Layer: 10 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &609795798002784246 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6108830054777696831} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3251801155585931500} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5096550498312619918 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6108830054777696831} + m_CullTransparentMesh: 1 +--- !u!114 &6088464776038824938 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6108830054777696831} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &6934217169991235231 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6896730674754028691} + - component: {fileID: 2778170821913614564} + - component: {fileID: 5385555677689984514} + m_Layer: 10 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6896730674754028691 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6934217169991235231} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4124712097831813607} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2778170821913614564 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6934217169991235231} + m_CullTransparentMesh: 1 +--- !u!114 &5385555677689984514 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6934217169991235231} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7478348093145584255 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4124712097831813607} + - component: {fileID: 290174062369355600} + m_Layer: 10 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4124712097831813607 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7478348093145584255} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6896730674754028691} + - {fileID: 3251801155585931500} + m_Father: {fileID: 6787772463908443990} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -122.7} + m_SizeDelta: {x: 80, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &290174062369355600 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7478348093145584255} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6088464776038824938} + m_FillRect: {fileID: 609795798002784246} + m_HandleRect: {fileID: 0} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 1 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] --- !u!1001 &6675463944788402332 PrefabInstance: m_ObjectHideFlags: 0 @@ -8,6 +283,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 1177268455256782109, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_BlockingMask.m_Bits + value: 1023 + objectReference: {fileID: 0} - target: {fileID: 2686192822530022837, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: m_IsTrigger value: 1 @@ -1686,11 +1965,11 @@ PrefabInstance: objectReference: {fileID: 11400000, guid: 90ef4d2128c770b4cb83806c33867a79, type: 2} - target: {fileID: 4246001044237372826, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: m_Layer - value: 6 + value: 10 objectReference: {fileID: 0} - target: {fileID: 4900607124439125211, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: m_Layer - value: 6 + value: 10 objectReference: {fileID: 0} - target: {fileID: 5108021082109611361, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: _availableInteractions @@ -1698,7 +1977,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5523461449651244940, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: m_Layer - value: 6 + value: 10 objectReference: {fileID: 0} - target: {fileID: 5654854357519457123, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: gravity.x @@ -1726,7 +2005,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6312111630636169229, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: m_Layer - value: 6 + value: 10 objectReference: {fileID: 0} - target: {fileID: 6336425934484470474, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: m_SortingOrder @@ -1754,7 +2033,11 @@ PrefabInstance: objectReference: {fileID: 2100000, guid: d018debe5b8bedf4c8f19cba9e4facec, type: 2} - target: {fileID: 6558328110360087691, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: m_Layer - value: 6 + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 6558328110360087691, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_IsActive + value: 0 objectReference: {fileID: 0} - target: {fileID: 6826437533270866908, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: externalBehavior @@ -1799,7 +2082,10 @@ PrefabInstance: m_RemovedComponents: - {fileID: 133104368464330048, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} m_RemovedGameObjects: [] - m_AddedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 186617915120465866, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + insertIndex: -1 + addedObject: {fileID: 4124712097831813607} m_AddedComponents: - targetCorrespondingSourceObject: {fileID: 7462519206451630147, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} insertIndex: -1 @@ -1813,6 +2099,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 7462519206451630147, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} insertIndex: -1 addedObject: {fileID: 7166420413980924482} + - targetCorrespondingSourceObject: {fileID: 7462519206451630147, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + insertIndex: -1 + addedObject: {fileID: 7529813704779128435} m_SourcePrefab: {fileID: 100100000, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} --- !u!1 &4266090516809920735 stripped GameObject: @@ -1843,6 +2132,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 784c770c13244dc0a0804056065eaf92, type: 3} m_Name: m_EditorClassIdentifier: + _blackboardSo: {fileID: 0} --- !u!114 &3825874317044733320 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2055,3 +2345,51 @@ MonoBehaviour: hitFxFadeOutDuration: 0.25 hitFxColor: {r: 1, g: 1, b: 1, a: 1} hitFxRadius: 0.5 +--- !u!114 &7529813704779128435 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4266090516809920735} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e509fdc10cff4d3487080f126f32544f, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: _targetOrderType + Entry: 7 + Data: 0|System.Collections.Generic.HashSet`1[[DDD.Restaurant.RestaurantOrderType, + Assembly-CSharp]], System.Core + - Name: + Entry: 12 + Data: 2 + - Name: + Entry: 3 + Data: 4 + - Name: + Entry: 3 + Data: 2 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + _currentOrderType: 0 + _prevOrderType: 0 + _patienceSlider: {fileID: 0} +--- !u!224 &6787772463908443990 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 186617915120465866, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + m_PrefabInstance: {fileID: 6675463944788402332} + m_PrefabAsset: {fileID: 0} diff --git a/Assets/_DDD/_Scripts/Restaurant/Character/AI/Common/Decorator/TimeLimiter.cs b/Assets/_DDD/_Scripts/Restaurant/Character/AI/Common/Decorator/TimeLimiter.cs index 4a4a5bd03..332990eb1 100644 --- a/Assets/_DDD/_Scripts/Restaurant/Character/AI/Common/Decorator/TimeLimiter.cs +++ b/Assets/_DDD/_Scripts/Restaurant/Character/AI/Common/Decorator/TimeLimiter.cs @@ -248,7 +248,8 @@ public class SharedTimeLimiter : DecoratorNode [Tooltip("하단 블랙보드 키에 현재 시간을 저장할 지")] [SerializeField] protected bool _isBlackboardWriteEnabled = false; - [SerializeField] protected T _blackboardKey; + [SerializeField] protected T _remainTimeblackboardKey; + [SerializeField] protected T _maxTimeblackboardKey; public SharedVariable TimeLimit { diff --git a/Assets/_DDD/_Scripts/Restaurant/Character/AI/Customer/Decorator/CustomerTimeLimiter.cs b/Assets/_DDD/_Scripts/Restaurant/Character/AI/Customer/Decorator/CustomerTimeLimiter.cs index b4a56660e..94d38de25 100644 --- a/Assets/_DDD/_Scripts/Restaurant/Character/AI/Customer/Decorator/CustomerTimeLimiter.cs +++ b/Assets/_DDD/_Scripts/Restaurant/Character/AI/Customer/Decorator/CustomerTimeLimiter.cs @@ -14,13 +14,14 @@ public override void OnStart() { Debug.LogError($"[{GetType().Name}] 블랙보드를 찾을 수 없습니다. 게임오브젝트 해시코드: {gameObject.GetHashCode()}"); } + _blackboard.SetBlackboardValue(_maxTimeblackboardKey, TimeLimit.Value); } public override TaskStatus OnUpdate() { if (_isBlackboardWriteEnabled && _blackboard != null) { - _blackboard.SetBlackboardValue(_blackboardKey, Time.time - _startTime); + _blackboard.SetBlackboardValue(_remainTimeblackboardKey, TimeLimit.Value - (Time.time - _startTime)); } return base.OnUpdate(); diff --git a/Assets/_DDD/_Scripts/Restaurant/Character/Interfaces/ICustomerBlackboard.cs b/Assets/_DDD/_Scripts/Restaurant/Character/Interfaces/ICustomerBlackboard.cs index 768c70b7f..e88fc8167 100644 --- a/Assets/_DDD/_Scripts/Restaurant/Character/Interfaces/ICustomerBlackboard.cs +++ b/Assets/_DDD/_Scripts/Restaurant/Character/Interfaces/ICustomerBlackboard.cs @@ -13,7 +13,8 @@ public enum RestaurantCustomerBlackboardKey CurrentTargetGameObject, SatisfactionLevel, CumulativeOrderCount, - Remaining + MaxPatienceTime, + RemainingPatienceTime } public interface ICustomerBlackboard diff --git a/Assets/_DDD/_Scripts/Restaurant/Ui/OrderUi/CustomerPatienceUiComponent.cs b/Assets/_DDD/_Scripts/Restaurant/Ui/OrderUi/CustomerPatienceUiComponent.cs index 2a4b38eaf..cdc6560c2 100644 --- a/Assets/_DDD/_Scripts/Restaurant/Ui/OrderUi/CustomerPatienceUiComponent.cs +++ b/Assets/_DDD/_Scripts/Restaurant/Ui/OrderUi/CustomerPatienceUiComponent.cs @@ -1,26 +1,94 @@ using System.Collections.Generic; +using Sirenix.OdinInspector; +using Sirenix.Serialization; using UnityEngine; +using UnityEngine.UI; namespace DDD.Restaurant { - public class CustomerPatienceUiComponent : MonoBehaviour + public class CustomerPatienceUiComponent : SerializedMonoBehaviour { private IAISharedBlackboard _blackboard; - [SerializeField] HashSet _targetOrderType; - [SerializeField] RestaurantOrderType _currentOrderType; + [OdinSerialize] private HashSet _targetOrderType = new(); + [SerializeField] private RestaurantOrderType _currentOrderType; + [SerializeField] private RestaurantOrderType _prevOrderType; + private bool _initialized; + private IInteractionSubsystemObject _subsystem; + + [SerializeField] private Slider _patienceSlider; private void Start() { - if (!TryGetComponent(out _blackboard)) + var canvas = GetComponentInChildren(); + canvas.worldCamera = Camera.main; + + _patienceSlider = GetComponentInChildren(); + if (_patienceSlider == null) { - Debug.LogWarning($"[{GetType().Name}] 블랙보드가 존재하지 않음 오브젝트 해시코드 {gameObject.GetHashCode()}"); + Debug.LogWarning($"[{GetType().Name}] 슬라이더가 존재하지 않음 오브젝트 해시코드: {gameObject.GetHashCode()}"); return; } + if (!TryGetComponent(out _blackboard)) + { + Debug.LogWarning($"[{GetType().Name}] 블랙보드가 존재하지 않음 오브젝트 해시코드: {gameObject.GetHashCode()}"); + return; + } + + var targetObject = _blackboard.GetBlackboardValue(RestaurantCustomerBlackboardKey.CurrentTargetGameObject); + if (targetObject == null) + { + Debug.LogWarning($"[{GetType().Name}] 타겟 오브젝트가 존재하지 않음 오브젝트 해시코드: {gameObject.GetHashCode()}"); + return; + } + + if (!targetObject.TryGetComponent(out var subsystemOwner)) + { + Debug.LogWarning($"[{GetType().Name}] 서브시스템 오너가 존재하지 않음 오브젝트 해시코드: {gameObject.GetHashCode()}"); + return; + } + subsystemOwner.TryGetSubsystemObject(out _subsystem); + + if (_subsystem == null) + { + Debug.LogWarning($"[{GetType().Name}] RestaurantOrderType 서브시스템이 존재하지 않음 오브젝트 해시코드: {gameObject.GetHashCode()}"); + return; + } + + _currentOrderType = _subsystem.GetInteractionSubsystemType(); + + _initialized = true; + _patienceSlider.enabled = false; } private void Update() { + if (!_initialized) return; + _currentOrderType = _subsystem.GetInteractionSubsystemType(); + if (!_targetOrderType.Contains(_currentOrderType)) + { + _patienceSlider.enabled = false; + return; + } + + if (_currentOrderType != _prevOrderType) + { + SetPatience(); + } + + _patienceSlider.value = _blackboard.GetBlackboardValue(RestaurantCustomerBlackboardKey.RemainingPatienceTime); + if (_patienceSlider.value <= 0) + { + _patienceSlider.enabled = false; + } + } + + private void SetPatience() + { + _prevOrderType = _currentOrderType; + _patienceSlider.maxValue = _blackboard.GetBlackboardValue(RestaurantCustomerBlackboardKey.MaxPatienceTime); + _patienceSlider.value = _patienceSlider.maxValue; + _patienceSlider.enabled = true; } } } \ No newline at end of file