diff --git a/Assets/_DDD/Restaurant/Environments/Interactables/Common/RestaurantOrder.prefab b/Assets/_DDD/Restaurant/Environments/Interactables/Common/RestaurantOrder.prefab index 24036b0a6..546d96553 100644 --- a/Assets/_DDD/Restaurant/Environments/Interactables/Common/RestaurantOrder.prefab +++ b/Assets/_DDD/Restaurant/Environments/Interactables/Common/RestaurantOrder.prefab @@ -133,7 +133,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 201f9e6d7ca7404baa9945950292a392, type: 3} m_Name: m_EditorClassIdentifier: - _interactionType: 4 + _interactionType: 2 _executionParameters: _holdTime: 0 _displayParameters: @@ -141,6 +141,7 @@ MonoBehaviour: _interactionAvailableFlows: 2 _aiInteractionPoints: - {fileID: 1664322405549350652} + autoInitialize: 1 --- !u!114 &4456475204957017828 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/_DDD/Restaurant/Environments/Props/Prop_Open.prefab b/Assets/_DDD/Restaurant/Environments/Props/Prop_Open.prefab index 17ed7f4b3..4b8b4924c 100644 --- a/Assets/_DDD/Restaurant/Environments/Props/Prop_Open.prefab +++ b/Assets/_DDD/Restaurant/Environments/Props/Prop_Open.prefab @@ -136,6 +136,7 @@ MonoBehaviour: m_EditorClassIdentifier: _interactionType: 1 _executionParameters: + _holdTime: 0.1 _holdTime: 0.5 _displayParameters: _messageKey: Test diff --git a/Assets/_DDD/_Addressables/AI/Customer/Subtree/CustomerDefault.asset b/Assets/_DDD/_Addressables/AI/Customer/Subtree/CustomerDefault.asset index f1f9e1f9b..0ea95f8d3 100644 --- a/Assets/_DDD/_Addressables/AI/Customer/Subtree/CustomerDefault.asset +++ b/Assets/_DDD/_Addressables/AI/Customer/Subtree/CustomerDefault.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd8483b8226cbda88852b05e1285b9603516dfd5842972a2e379a43cb91b9a96 -size 676 +oid sha256:a7ca4b40dc25f4a6ff14a7cbdb2a8be04431ba958038b899fd700df86c4f9618 +size 87312 diff --git a/Assets/_DDD/_Addressables/AI/Customer/Subtree/OrderSubtree.asset b/Assets/_DDD/_Addressables/AI/Customer/Subtree/OrderSubtree.asset new file mode 100644 index 000000000..8434d7b80 --- /dev/null +++ b/Assets/_DDD/_Addressables/AI/Customer/Subtree/OrderSubtree.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:817cecbbecbe8a6519225bc1d0fce376c0dfb14a240c248e3fbdc8a93f585f72 +size 20385 diff --git a/Assets/_DDD/_Addressables/AI/Customer/Subtree/OrderSubtree.asset.meta b/Assets/_DDD/_Addressables/AI/Customer/Subtree/OrderSubtree.asset.meta new file mode 100644 index 000000000..8e0fb4972 --- /dev/null +++ b/Assets/_DDD/_Addressables/AI/Customer/Subtree/OrderSubtree.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bab8aadc83d64f64b8280e6ebb957e65 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_DDD/_Addressables/Prefabs/CustomerNpc.prefab b/Assets/_DDD/_Addressables/Prefabs/CustomerNpc.prefab index 4ac33db37..80cdc789c 100644 --- a/Assets/_DDD/_Addressables/Prefabs/CustomerNpc.prefab +++ b/Assets/_DDD/_Addressables/Prefabs/CustomerNpc.prefab @@ -8,13 +8,1057 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} - propertyPath: m_Subtree - value: + - target: {fileID: 2686192822530022837, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_IsTrigger + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3540956906288785900, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Layer + value: 0 objectReference: {fileID: 0} - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} - propertyPath: m_GraphName - value: CustomerBehavior + propertyPath: m_Data.m_UniqueID + value: 2072347169 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_TaskData.Array.size + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventTaskData.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_SharedVariableData.Array.size + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_TaskData.Array.data[0].m_Version + value: 3.4 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventNodePropertiesData.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_LogicNodePropertiesData.Array.size + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_TaskData.Array.data[0].m_ObjectType + value: Opsive.BehaviorDesigner.Runtime.Tasks.Actions.StackedAction + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventTaskData.Array.data[0].m_Version + value: 3.4 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventTaskData.Array.data[0].m_ObjectType + value: Opsive.BehaviorDesigner.Runtime.Tasks.Events.Start + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_TaskData.Array.data[0].m_Values.Array.size + value: 14 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[2]' + value: 255 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[3]' + value: 255 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[4]' + value: 255 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[5]' + value: 255 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[6]' + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[10]' + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[11]' + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[12]' + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[13]' + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[14]' + value: 118 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[15]' + value: 101 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[16]' + value: 46 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[17]' + value: 66 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[18]' + value: 101 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[19]' + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[20]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[21]' + value: 118 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[22]' + value: 105 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[23]' + value: 111 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[24]' + value: 114 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[25]' + value: 68 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[26]' + value: 101 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[27]' + value: 115 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[28]' + value: 105 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[29]' + value: 103 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[30]' + value: 110 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[31]' + value: 101 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[32]' + value: 114 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[33]' + value: 46 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[34]' + value: 82 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[35]' + value: 117 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[36]' + value: 110 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[37]' + value: 116 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[38]' + value: 105 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[39]' + value: 109 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[40]' + value: 101 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[41]' + value: 46 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[42]' + value: 84 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[43]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[44]' + value: 115 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[45]' + value: 107 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[46]' + value: 115 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[47]' + value: 46 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[48]' + value: 65 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[49]' + value: 99 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[50]' + value: 116 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[51]' + value: 105 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[52]' + value: 111 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[53]' + value: 110 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[54]' + value: 115 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[55]' + value: 46 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[56]' + value: 83 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[57]' + value: 116 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[58]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[59]' + value: 114 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[60]' + value: 116 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[61]' + value: 66 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[62]' + value: 101 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[63]' + value: 104 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[64]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[65]' + value: 118 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[66]' + value: 105 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[67]' + value: 111 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[68]' + value: 114 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[69]' + value: 84 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[70]' + value: 114 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[71]' + value: 101 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[72]' + value: 101 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[74]' + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[75]' + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[76]' + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[77]' + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_Values.Array.data[79]' + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventNodePropertiesData.Array.data[0].m_Version + value: 3.4 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventTaskData.Array.data[0].m_Values.Array.size + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_LogicNodePropertiesData.Array.data[0].m_Version + value: 3.4 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_TaskData.Array.data[0].m_UnityObjects.Array.size + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventNodePropertiesData.Array.data[0].m_ObjectType + value: Opsive.GraphDesigner.Runtime.NodeProperties + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventTaskData.Array.data[0].m_Values.Array.data[0]' + value: 255 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventTaskData.Array.data[0].m_Values.Array.data[1]' + value: 255 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_LogicNodePropertiesData.Array.data[0].m_ObjectType + value: Opsive.GraphDesigner.Runtime.LogicNodeProperties + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.size + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.size + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[1]' + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[2]' + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[3]' + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[4]' + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[5]' + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[6]' + value: 73 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[7]' + value: 73 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[8]' + value: 73 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[9]' + value: 74 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[0]' + value: 2962117259717031728 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[1]' + value: 7266922542588021606 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[2]' + value: 7366259733513172608 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[3]' + value: 6380291040478046818 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[4]' + value: -8530567197348880156 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[5]' + value: -3957478287605629114 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[6]' + value: -1500117594402502404 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[7]' + value: -8367522328533733813 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[8]' + value: -2139127302081178988 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[9]' + value: -4449977117559057706 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[10]' + value: 78 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[11]' + value: 78 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[12]' + value: 78 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[13]' + value: 78 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[14]' + value: 79 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[15]' + value: 83 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_ValuePositions.Array.data[16]' + value: 83 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventTaskData.Array.data[0].m_ValuePositions.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[10]' + value: 1600038550733978463 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[11]' + value: 5078256361681572446 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[12]' + value: 2789843053411464425 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[13]' + value: 256556895345464718 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[14]' + value: 8465553906751671549 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[15]' + value: -8530567197348880156 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_TaskData.Array.data[0].m_LongValueHashes.Array.data[16]' + value: -3957478287605629114 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventTaskData.Array.data[0].m_LongValueHashes.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.size + value: 65 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.size + value: 74 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventTaskData.Array.data[0].m_LongValueHashes.Array.data[0]' + value: -5674111636788395943 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[0]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[1]' + value: 56 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[2]' + value: 52 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[3]' + value: 98 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[4]' + value: 53 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[5]' + value: 49 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[6]' + value: 102 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[7]' + value: 56 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[8]' + value: 45 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[9]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[0]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[1]' + value: 99 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[2]' + value: 100 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[3]' + value: 99 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[4]' + value: 55 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[5]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[6]' + value: 51 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[7]' + value: 102 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[8]' + value: 45 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[9]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[10]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[11]' + value: 57 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[12]' + value: 56 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[13]' + value: 45 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[14]' + value: 52 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[15]' + value: 100 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[16]' + value: 50 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[17]' + value: 57 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[18]' + value: 45 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[19]' + value: 98 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[20]' + value: 102 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[21]' + value: 51 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[22]' + value: 52 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[23]' + value: 45 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[24]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[25]' + value: 98 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[26]' + value: 51 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[27]' + value: 56 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[28]' + value: 53 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[29]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[30]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[31]' + value: 49 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[32]' + value: 100 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[33]' + value: 98 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[34]' + value: 101 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[35]' + value: 53 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[38]' + value: 112 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[39]' + value: 67 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[42]' + value: 240 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[43]' + value: 66 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[46]' + value: 220 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_Values.Array.data[47]' + value: 66 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[10]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[11]' + value: 49 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[12]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[13]' + value: 45 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[14]' + value: 52 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[15]' + value: 99 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[16]' + value: 56 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[17]' + value: 102 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[18]' + value: 45 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[19]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[20]' + value: 57 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[21]' + value: 101 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[22]' + value: 57 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[23]' + value: 45 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[24]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[25]' + value: 52 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[26]' + value: 98 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[27]' + value: 53 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[28]' + value: 97 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[29]' + value: 98 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[30]' + value: 56 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[31]' + value: 49 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[32]' + value: 52 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[33]' + value: 56 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[34]' + value: 100 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[35]' + value: 50 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[38]' + value: 112 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[39]' + value: 67 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[41]' + value: 128 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[42]' + value: 138 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[43]' + value: 67 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[46]' + value: 232 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[47]' + value: 66 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[69]' + value: 255 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[70]' + value: 255 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[71]' + value: 255 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_Values.Array.data[72]' + value: 255 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventNodePropertiesData.Array.data[0].m_ValuePositions.Array.size + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.size + value: 12 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_EventNodePropertiesData.Array.data[0].m_LongValueHashes.Array.size + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.size + value: 12 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[1]' + value: 36 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[2]' + value: 44 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[3]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[4]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[5]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[6]' + value: 64 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[1]' + value: 36 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[2]' + value: 44 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[3]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[4]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[5]' + value: 48 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[6]' + value: 64 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[7]' + value: 65 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[8]' + value: 69 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[9]' + value: 69 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[0]' + value: 5480985131265888956 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[1]' + value: -7644563576402514701 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[2]' + value: 2962117259702096269 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[3]' + value: 7257299673358305469 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[4]' + value: 2962820280256717871 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[5]' + value: 2813741625700550223 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_EventNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[6]' + value: 268198477668590510 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[0]' + value: 5480985131265888956 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[1]' + value: -7644563576402514701 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[2]' + value: 2962117259702096269 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[3]' + value: 7257299673358305469 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[4]' + value: 2962820280256717871 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[5]' + value: 2813741625700550223 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[6]' + value: 268198477668590510 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[7]' + value: 1580835718119765152 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[8]' + value: 1324498323093618261 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[9]' + value: -5519571879738437719 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[10]' + value: 71 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_ValuePositions.Array.data[11]' + value: 73 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[10]' + value: -4446844345799519105 + objectReference: {fileID: 0} + - target: {fileID: 3854744934792897056, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: 'm_Data.m_LogicNodePropertiesData.Array.data[0].m_LongValueHashes.Array.data[11]' + value: 8870558515320684346 objectReference: {fileID: 0} - target: {fileID: 3971935000603232885, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: m_LocalPosition.x @@ -64,6 +1108,34 @@ PrefabInstance: propertyPath: skeletonDataAsset value: objectReference: {fileID: 11400000, guid: 90ef4d2128c770b4cb83806c33867a79, type: 2} + - target: {fileID: 5108021082109611361, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: _availableInteractions + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 5654854357519457123, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: gravity.x + value: NaN + objectReference: {fileID: 0} + - target: {fileID: 5654854357519457123, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: gravity.y + value: NaN + objectReference: {fileID: 0} + - target: {fileID: 5654854357519457123, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: gravity.z + value: NaN + objectReference: {fileID: 0} + - target: {fileID: 5654854357519457123, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: orientation + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5654854357519457123, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: enableRotation + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5654854357519457123, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: alwaysDrawGizmos + value: 1 + objectReference: {fileID: 0} - target: {fileID: 6336425934484470474, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} propertyPath: m_Materials.Array.size value: 4 @@ -104,6 +1176,26 @@ PrefabInstance: propertyPath: m_Name value: CustomerNpc objectReference: {fileID: 0} + - target: {fileID: 7462519206451630147, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Layer + value: 16 + objectReference: {fileID: 0} + - target: {fileID: 7545136660434259176, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Constraints + value: 112 + objectReference: {fileID: 0} + - target: {fileID: 7545136660434259176, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_IsKinematic + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8155105186346135386, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: m_Layer + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8165702938223525558, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + propertyPath: graphMask.value + value: 2 + objectReference: {fileID: 0} m_RemovedComponents: - {fileID: 133104368464330048, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} m_RemovedGameObjects: [] @@ -112,6 +1204,15 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 7462519206451630147, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} insertIndex: -1 addedObject: {fileID: 6054843938321605399} + - targetCorrespondingSourceObject: {fileID: 7462519206451630147, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + insertIndex: -1 + addedObject: {fileID: 3924055170972325225} + - targetCorrespondingSourceObject: {fileID: 7462519206451630147, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + insertIndex: -1 + addedObject: {fileID: 3825874317044733320} + - targetCorrespondingSourceObject: {fileID: 7462519206451630147, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} + insertIndex: -1 + addedObject: {fileID: 1122074513716966771} m_SourcePrefab: {fileID: 100100000, guid: ceeea618d8ee23642a0e56b3f963448c, type: 3} --- !u!1 &4266090516809920735 stripped GameObject: @@ -130,3 +1231,47 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: b242c4f65b2734841840c89dfab1500b, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!114 &3924055170972325225 +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: 784c770c13244dc0a0804056065eaf92, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &3825874317044733320 +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: af69e82818254bfa9cabb2dbf9430850, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1122074513716966771 +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: 201f9e6d7ca7404baa9945950292a392, type: 3} + m_Name: + m_EditorClassIdentifier: + _interactionType: 4 + _executionParameters: + _holdTime: 0 + _displayParameters: + _messageKey: + _interactionAvailableFlows: 2 + _aiInteractionPoints: [] + autoInitialize: 1 diff --git a/Assets/_DDD/_Addressables/Prefabs/RestaurantNpc.prefab b/Assets/_DDD/_Addressables/Prefabs/RestaurantNpc.prefab index d3008f683..992df8657 100644 --- a/Assets/_DDD/_Addressables/Prefabs/RestaurantNpc.prefab +++ b/Assets/_DDD/_Addressables/Prefabs/RestaurantNpc.prefab @@ -234,10 +234,18 @@ MonoBehaviour: m_Data: m_TaskData: [] m_EventTaskData: [] - m_SharedVariableData: [] + m_SharedVariableData: + - m_ObjectType: 'Opsive.GraphDesigner.Runtime.Variables.SharedVariable`1[[UnityEngine.GameObject, + UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]' + m_ValueHashes: + m_LongValueHashes: 0d00eb254f8d1b29baa620a07799d549a996976a4a64278927dafeacd28e0b00 + m_ValuePositions: 000000000e0000000e0000000f000000 + m_Values: 53656c6647616d654f626a65637402ffffffff + m_UnityObjects: [] + m_Version: 3.4 m_DisabledEventNodesData: [] m_DisabledLogicNodesData: [] - m_UniqueID: -1885404201 + m_UniqueID: 1495981264 m_LogicNodePropertiesData: [] m_EventNodePropertiesData: [] m_GroupPropertiesData: [] diff --git a/Assets/_DDD/_Addressables/Prefabs/RestaurantPlayer.prefab b/Assets/_DDD/_Addressables/Prefabs/RestaurantPlayer.prefab index cc9051a7a..f842662b8 100644 --- a/Assets/_DDD/_Addressables/Prefabs/RestaurantPlayer.prefab +++ b/Assets/_DDD/_Addressables/Prefabs/RestaurantPlayer.prefab @@ -366,6 +366,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 5259510642736920361, guid: 3db3fc62639929c4ba6031ca4ae6600c, type: 3} insertIndex: -1 addedObject: {fileID: 8993310060139522557} + - targetCorrespondingSourceObject: {fileID: 5259510642736920361, guid: 3db3fc62639929c4ba6031ca4ae6600c, type: 3} + insertIndex: -1 + addedObject: {fileID: -6848683434426724985} - targetCorrespondingSourceObject: {fileID: 6791841979869644848, guid: 3db3fc62639929c4ba6031ca4ae6600c, type: 3} insertIndex: -1 addedObject: {fileID: 662634663174340165} @@ -423,7 +426,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 81e01dd8c1cc3404d805400eba1bb4ae, type: 3} m_Name: m_EditorClassIdentifier: - _availableInteractions: 1 + _availableInteractions: 5 _nearColliders: - {fileID: 0} - {fileID: 0} @@ -461,6 +464,36 @@ MonoBehaviour: m_EditorClassIdentifier: blockOutlineAndGlow: 1 blockOverlay: 1 +--- !u!114 &-6848683434426724985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7316134055819320434} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cdaa3305fa954c45a80c9662aa6f425, type: 3} + m_Name: + m_EditorClassIdentifier: + m_GraphName: Behavior Tree + m_Index: 0 + m_Data: + m_TaskData: [] + m_EventTaskData: [] + m_SharedVariableData: [] + m_DisabledEventNodesData: [] + m_DisabledLogicNodesData: [] + m_UniqueID: 732308450 + m_LogicNodePropertiesData: [] + m_EventNodePropertiesData: [] + m_GroupPropertiesData: [] + m_StartWhenEnabled: 1 + m_PauseWhenDisabled: 0 + m_UpdateMode: 0 + m_EvaluationType: 0 + m_MaxEvaluationCount: 1 + m_Subtree: {fileID: 0} --- !u!4 &7511707580127947132 stripped Transform: m_CorrespondingSourceObject: {fileID: 4993183601549197863, guid: 3db3fc62639929c4ba6031ca4ae6600c, type: 3} diff --git a/Assets/_DDD/_Addressables/Scenes/Restaurant.unity b/Assets/_DDD/_Addressables/Scenes/Restaurant.unity index d70733e4c..126935cf0 100644 --- a/Assets/_DDD/_Addressables/Scenes/Restaurant.unity +++ b/Assets/_DDD/_Addressables/Scenes/Restaurant.unity @@ -365,7 +365,8 @@ PrefabInstance: propertyPath: m_Name value: Prop_CustomerTable_002 objectReference: {fileID: 0} - m_RemovedComponents: [] + m_RemovedComponents: + - {fileID: 551358949302262764, guid: 0b1ba2f28535d5147bc0ddf354d0712f, type: 3} m_RemovedGameObjects: [] m_AddedGameObjects: [] m_AddedComponents: [] @@ -10722,6 +10723,92 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1771012164} m_Mesh: {fileID: 0} +--- !u!1 &1775054119 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1775054121} + - component: {fileID: 1775054120} + m_Layer: 0 + m_Name: AstarPath + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1775054120 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1775054119} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78396926cbbfc4ac3b48fc5fc34a87d1, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 1073741824 + data: + dataString: UEsDBBQAAAgIAABIIewaXtoYSgIAALMEAAALACQAZ3JhcGgxLmpzb24KACAAAAAAAAEAGAAAgD7V3rGdAQCAPtXesZ0BAIA+1d6xnQF1U8tu2zAQ/BVD56awZRuOe4ydpoc8CstAgxQ9rMm1RJgiXZKy4xj59+5SjyhNeyI0s7PP0TkRBTgQAd0KpKp88mUw/Dz9NEiENcFW7g6er52zjvCUUdQ6Uy8Yw1KOO4LewUbjN1R5EZqwFlxoVW66lCU8Z9ruWTwe1t/XMsdbNHkoWBlBZVaYK2uaMmPCUKpg3VppbMBReklwaIDHD8hTh1QeWcdzBVchIXt0t3BCd2el2ioBgWox/fMXkVKVaDwhxHKhZNkC42VC/AbELne2MnLt4IDOw0ZpFU4c+qMZmuMcajyACTcO9kVWuS0I7FLaextW+LtSLsYKqzUKbiPDEJTJuZtzD26FsW3Pkn1x8kr4TKBh5vz6F5YuW1THUcHvGBgkB9AVKy5GA2YD5A0Xp3fgyQi0vwXVVpKLdWvruDv0RdznFrR/x6zROVDmH5q1w/4JQh1YW6aE/dIejYdyr2n4r2TGaLdxsxruY9UmWmIApfm6xFqzqHfUtWQqrXkuZ0O8az30MzuQ0FPzvvAb599aJ1Be8T39Ag3V+L9iNPkgadzYCMatYtRK0rqKL+yRW3yoAk2Ib3tg4p6Ou7DG1Kfu77WVNfZ5kxkEhz5k9IjiwejT41NPhoZNeA+HkrSLKjrqTZtXSr63QjKepbNhms7mczEbXc7lBU7kdLZJp7M5yOlEDJM4hTIqKNDfKb8O7WLob+7d20AZM65Q0MEG0fxsV+ngeKNeStvzgDJbmwnyhXmoc3Rj06FB02bldfztez9Fcn5NXv8AUEsDBBQAAAgIAABIIexc6sO8cwAAAIUAAAAJACQAbWV0YS5qc29uCgAgAAAAAAABABgAAIA+1d6xnQEAgD7V3rGdAQCAPtXesZ0Bq1YqSy0qzszPU7JSMNUz1rPQUVBKL0osyCgGChiBOKWZKSB2dF5pTg6Qb2xuZG5gZGRuaZlsbmhhmaKbapJiap5kZGpumZhiapJsoBQLVFVSWZDql5ibiqwzILEkIy0zLyUzL10vKDU5sbjEHWSRUmwtAFBLAQItABQAAAgIAABIIewaXtoYSgIAALMEAAALACQAAAAAAAAAAAAAAAAAAABncmFwaDEuanNvbgoAIAAAAAAAAQAYAACAPtXesZ0BAIA+1d6xnQEAgD7V3rGdAVBLAQItABQAAAgIAABIIexc6sO8cwAAAIUAAAAJACQAAAAAAAAAAAAAAJcCAABtZXRhLmpzb24KACAAAAAAAAEAGAAAgD7V3rGdAQCAPtXesZ0BAIA+1d6xnQFQSwUGAAAAAAIAAgC4AAAAVQMAAAAA + file_cachedStartup: {fileID: 0} + cacheStartup: 0 + showNavGraphs: 1 + showUnwalkableNodes: 1 + debugMode: 4 + debugFloor: 0 + debugRoof: 1 + manualDebugFloorRoof: 0 + showSearchTree: 0 + unwalkableNodeDebugSize: 0.3 + logPathResults: 0 + maxNearestNodeDistance: 100 + scanOnStartup: 1 + fullGetNearestSearch: 0 + prioritizeGraphs: 0 + prioritizeGraphsLimit: 1 + colorSettings: + _SolidColor: {r: 0.11764706, g: 0.4, b: 0.7882353, a: 0.9} + _UnwalkableNode: {r: 1, g: 0, b: 0, a: 0.5} + _BoundsHandles: {r: 0.29, g: 0.454, b: 0.741, a: 0.9} + _ConnectionLowLerp: {r: 0, g: 1, b: 0, a: 0.5} + _ConnectionHighLerp: {r: 1, g: 0, b: 0, a: 0.5} + _MeshEdgeColor: {r: 0, g: 0, b: 0, a: 0.5} + _AreaColors: [] + tagNames: [] + heuristic: 2 + heuristicScale: 1 + threadCount: -1 + maxFrameTime: 10 + batchGraphUpdates: 0 + graphUpdateBatchingInterval: 0.2 + navmeshUpdates: + updateInterval: 0 + euclideanEmbedding: + mode: 0 + seed: 0 + pivotPointRoot: {fileID: 0} + spreadOutCount: 10 + showGraphs: 1 +--- !u!4 &1775054121 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1775054119} + serializedVersion: 2 + 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: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!4 &1784230204 stripped Transform: m_CorrespondingSourceObject: {fileID: 1061695247072719575, guid: 70f56d7d65d2e7842b5bd517ae7fe7fe, type: 3} @@ -15146,3 +15233,4 @@ SceneRoots: - {fileID: 852575416} - {fileID: 1311760301} - {fileID: 504708576} + - {fileID: 1775054121} diff --git a/Assets/_DDD/_Addressables/So/RestaurantData/DataObjects/RestaurantPlayerData.asset b/Assets/_DDD/_Addressables/So/RestaurantData/DataObjects/RestaurantPlayerData.asset index 85efaff85..890a0f723 100644 --- a/Assets/_DDD/_Addressables/So/RestaurantData/DataObjects/RestaurantPlayerData.asset +++ b/Assets/_DDD/_Addressables/So/RestaurantData/DataObjects/RestaurantPlayerData.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:49fc3b72bcb23f6bb08a7531c01cfd1fb185e04975122fd2437f751b3855ab78 -size 1994 +oid sha256:c0b7877dd04da4027a47c923d7c38dbbdb1c4aae40c4a709411f0845190e7cf7 +size 2001 diff --git a/Assets/_DDD/_Scripts/AI.meta b/Assets/_DDD/_Scripts/AI.meta new file mode 100644 index 000000000..488015a6b --- /dev/null +++ b/Assets/_DDD/_Scripts/AI.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c31792c3491f44878a9a5e8ee59504cf +timeCreated: 1755770768 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/AI/Common.meta b/Assets/_DDD/_Scripts/AI/Common.meta new file mode 100644 index 000000000..8b9f60e70 --- /dev/null +++ b/Assets/_DDD/_Scripts/AI/Common.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 49c654aa3aa94cb9928e2d161cad789a +timeCreated: 1755770768 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/AI/Common/IAISharedBlackboard.cs b/Assets/_DDD/_Scripts/AI/Common/IAISharedBlackboard.cs new file mode 100644 index 000000000..154eebd47 --- /dev/null +++ b/Assets/_DDD/_Scripts/AI/Common/IAISharedBlackboard.cs @@ -0,0 +1,15 @@ +using UnityEngine; + +namespace DDD +{ + /// + /// ๊ณต์šฉ AI ๋ธ”๋ž™๋ณด๋“œ ์ธํ„ฐํŽ˜์ด์Šค. + /// - ๋‹ค์–‘ํ•œ ์บ๋ฆญํ„ฐ AI์—์„œ ๊ณตํ†ต์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ํ˜„์žฌ ์ธํ„ฐ๋ž™์…˜ ํƒ€๊ฒŸ๋งŒ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. + /// - ํ•„์š” ์‹œ ํ‚ค-๊ฐ’ ํ™•์žฅ์„ ๊ณ ๋ คํ•˜๋˜, ํ˜„์žฌ๋Š” ์ตœ์†Œ ์š”๊ตฌ๋งŒ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. + /// + public interface IAISharedBlackboard + { + void SetCurrentInteractionTarget(GameObject targetGameObject); + GameObject GetCurrentInteractionTarget(); + } +} diff --git a/Assets/_DDD/_Scripts/AI/Common/IAISharedBlackboard.cs.meta b/Assets/_DDD/_Scripts/AI/Common/IAISharedBlackboard.cs.meta new file mode 100644 index 000000000..271230278 --- /dev/null +++ b/Assets/_DDD/_Scripts/AI/Common/IAISharedBlackboard.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 62510fba6cb047419ca463dc523ae536 +timeCreated: 1755770768 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameEvent/InteractionSubsystem.cs b/Assets/_DDD/_Scripts/GameEvent/InteractionSubsystem.cs index 0f49a032b..ac19eefae 100644 --- a/Assets/_DDD/_Scripts/GameEvent/InteractionSubsystem.cs +++ b/Assets/_DDD/_Scripts/GameEvent/InteractionSubsystem.cs @@ -13,6 +13,7 @@ public interface IInteractionSubsystemObject public interface IInteractionSubsystemObject : IInteractionSubsystemObject where T : Enum { T GetInteractionSubsystemType(); + void SetInteractionSubsystemType(T inValue); } public interface IInteractionSubsystemSolver diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI.meta new file mode 100644 index 000000000..c89e792df --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1fed3b9fae5245cdbf255f627a82a1e6 +timeCreated: 1755747969 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common.meta new file mode 100644 index 000000000..52bf270e4 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cfc8e456b2134c4a87b9fcd0d385cf1d +timeCreated: 1755767029 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions.meta new file mode 100644 index 000000000..b497afe8e --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ab824a41c52d4cca8cafb1fc96d5d8e7 +timeCreated: 1755769401 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/LookAtInteractionTarget.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/LookAtInteractionTarget.cs new file mode 100644 index 000000000..8abdaabe7 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/LookAtInteractionTarget.cs @@ -0,0 +1,140 @@ +using Opsive.BehaviorDesigner.Runtime.Tasks; +using Opsive.BehaviorDesigner.Runtime.Tasks.Actions; +using UnityEngine; + +namespace DDD +{ + /// + /// ์ธํ„ฐ๋ž™์…˜ ํƒ€๊ฒŸ์„ ๋ฐ”๋ผ๋ณด๋„๋ก ์‹œ๊ฐ(Spine/์• ๋‹ˆ๋ฉ”์ด์…˜) ์ปดํฌ๋„ŒํŠธ์— ์œ„์ž„ํ•˜๋Š” ์•ก์…˜์˜ ๊ป๋ฐ๊ธฐ/๊ณจ๊ฒฉ. + /// ์‹ค์ œ ํšŒ์ „/์ŠคํŒŒ์ธ ์ œ์–ด ๋กœ์ง์€ ๋ณ„๋„์˜ Visual ์ปดํฌ๋„ŒํŠธ(์˜ˆ: Spine/Animation Controller)์—์„œ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค. + /// + public class LookAtInteractionTarget : Action + { + [Header("Target Settings")] + [Tooltip("InteractionPoints๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์žฅ ์ ์ ˆํ•œ ์ง€์ ์„ ๋ฐ”๋ผ๋ด„")] + [SerializeField] private bool useInteractionPoints = true; + [Tooltip("ํƒ€๊ฒŸ์ด ์—†์„ ๋•Œ ์ฆ‰์‹œ ์‹คํŒจํ• ์ง€ ์—ฌ๋ถ€")] + [SerializeField] private bool failIfNoTarget = true; + + [Header("Update Settings")] + [Tooltip("ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๊ฐฑ์‹ ํ•˜์—ฌ ์ง€์†์ ์œผ๋กœ ๋ฐ”๋ผ๋ณผ์ง€ (Running ๋ฐ˜ํ™˜) ์—ฌ๋ถ€. ๋น„ํ™œ์„ฑํ™” ์‹œ 1ํšŒ๋งŒ ์‹œ๋„ํ•˜๊ณ  ์„ฑ๊ณต ์ฒ˜๋ฆฌ")] + [SerializeField] private bool continuousUpdate = true; + + // Visual ์ „์šฉ ์ปดํฌ๋„ŒํŠธ(๋‚˜์ค‘ ๊ตฌํ˜„)๋ฅผ ์œ„ํ•œ ์ตœ์†Œ ์ธํ„ฐํŽ˜์ด์Šค + // ์‹ค์ œ ๊ตฌํ˜„์€ Spine/์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ์–ด ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”. + public interface ILookAtVisual + { + // ์ดˆ๊ธฐ ์‹œ์ž‘ ์‹œ๋„. ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ณธ ์•ก์…˜์€ ์„ฑ๊ณต/์‹คํŒจ์— ๋ฏผ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. + bool TryBeginLookAt(Vector3 worldPosition); + // ๋งค ํ”„๋ ˆ์ž„ ๊ฐฑ์‹  ์‹œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. + void UpdateLookAt(Vector3 worldPosition); + // ์•ก์…˜ ์ข…๋ฃŒ ์‹œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. + void EndLookAt(); + } + + private ILookAtVisual visual; + private GameObject cachedTarget; + private bool isLooking; + private Vector3 currentLookPosition; + + public override void OnStart() + { + visual = gameObject.GetComponentInParent(); + cachedTarget = null; + isLooking = false; + } + + public override TaskStatus OnUpdate() + { + var target = GetTarget(); + if (target == null) + { + if (isLooking) + { + // ํƒ€๊ฒŸ์ด ์‚ฌ๋ผ์กŒ๋‹ค๋ฉด ์ •๋ฆฌ + visual?.EndLookAt(); + isLooking = false; + } + return failIfNoTarget ? TaskStatus.Failure : TaskStatus.Success; + } + + currentLookPosition = CalculateLookPosition(target); + + if (!isLooking) + { + visual?.TryBeginLookAt(currentLookPosition); + isLooking = true; + } + else + { + visual?.UpdateLookAt(currentLookPosition); + } + + // ์—ฐ์† ์—…๋ฐ์ดํŠธ๋ฉด Running, ์•„๋‹ˆ๋ฉด 1ํšŒ๋งŒ ์‹œ๋„ ํ›„ Success ๋ฐ˜ํ™˜ + return continuousUpdate ? TaskStatus.Running : TaskStatus.Success; + } + + public override void OnEnd() + { + if (isLooking) + { + visual?.EndLookAt(); + isLooking = false; + } + cachedTarget = null; + } + + private GameObject GetTarget() + { + // ์บ์‹œ๋œ ํƒ€๊ฒŸ์ด ์œ ํšจํ•˜๋ฉด ์žฌ์‚ฌ์šฉ + if (IsValidTarget(cachedTarget)) + return cachedTarget; + + // ๋ธ”๋ž™๋ณด๋“œ์—์„œ ํƒ€๊ฒŸ ๊ฒ€์ƒ‰ + cachedTarget = gameObject.GetComponentInParent() + ?.GetCurrentInteractionTarget(); + + if (IsValidTarget(cachedTarget)) + return cachedTarget; + + // Interactor์˜ ํฌ์ปค์Šค๋œ ํƒ€๊ฒŸ ๊ฒ€์ƒ‰ + var interactor = gameObject.GetComponentInParent(); + var focusedInteractable = interactor?.GetFocusedInteractable(); + cachedTarget = focusedInteractable?.GetInteractableGameObject(); + + return cachedTarget; + } + + private static bool IsValidTarget(GameObject target) => target != null && target; + + private Vector3 CalculateLookPosition(GameObject target) + { + if (!useInteractionPoints) + return target.transform.position; + + if (target.TryGetComponent(out var ric)) + { + var points = ric.GetInteractionPoints(); + if (points == null || points.Length == 0) + return target.transform.position; + + // ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ƒํ˜ธ์ž‘์šฉ ์ง€์  ์„ ํƒ (MoveTo์™€ ๋™์ผํ•œ ๊ธฐ์ค€) + var agentPos = transform.position; + var nearest = target.transform.position; + var minSqr = float.MaxValue; + foreach (var p in points) + { + var d = (p - agentPos).sqrMagnitude; + if (d < minSqr) + { + minSqr = d; + nearest = p; + } + } + return nearest; + } + + return target.transform.position; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/LookAtInteractionTarget.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/LookAtInteractionTarget.cs.meta new file mode 100644 index 000000000..0f840f1cf --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/LookAtInteractionTarget.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a973b52fbfe64f8981b2a1d33864d2eb +timeCreated: 1755771294 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/MoveToInteractionTarget.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/MoveToInteractionTarget.cs new file mode 100644 index 000000000..828782504 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/MoveToInteractionTarget.cs @@ -0,0 +1,173 @@ +using Opsive.BehaviorDesigner.Runtime.Tasks; +using Opsive.BehaviorDesigner.Runtime.Tasks.Actions; +using UnityEngine; + +namespace DDD +{ + /// + /// IAiMovement๋ฅผ ์ด์šฉํ•ด ์ธํ„ฐ๋ž™์…˜ ํƒ€๊ฒŸ์œผ๋กœ ์ด๋™ํ•˜๋Š” ์•ก์…˜ + /// + public class MoveToInteractionTarget : Action + { + [Header("Target Settings")] + [Tooltip("InteractionPoints๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง€์ ์œผ๋กœ ์ด๋™")] + [SerializeField] private bool useInteractionPoints = true; + [Tooltip("ํƒ€๊ฒŸ์ด ์—†์„ ๋•Œ ์ฆ‰์‹œ ์‹คํŒจํ• ์ง€ ์—ฌ๋ถ€")] + [SerializeField] private bool failIfNoTarget = true; + + [Header("Movement Settings")] + [Tooltip("๋ชฉ์ ์ง€ ๋„๋‹ฌ ๊ฑฐ๋ฆฌ")] + [SerializeField] private float stoppingDistance = 0.01f; + [Tooltip("๋ชฉ์ ์ง€ ์žฌ๊ณ„์‚ฐ ์ฃผ๊ธฐ(์ดˆ), 0 ์ดํ•˜๋ฉด ๋น„ํ™œ์„ฑํ™”")] + [SerializeField] private float repathInterval = 0.5f; + + private IAiMovement movement; + private float repathTimer; + private Vector3 currentDestination; + private bool isMoving; + private GameObject cachedTarget; + + public override void OnStart() + { + if (cachedTarget != null) return; + movement = gameObject.GetComponentInParent(); + repathTimer = 0f; + isMoving = false; + cachedTarget = null; + } + + public override TaskStatus OnUpdate() + { + if (movement == null) + return TaskStatus.Failure; + + var target = GetTarget(); + if (target == null) + return failIfNoTarget ? TaskStatus.Failure : TaskStatus.Success; + Debug.Log(target.name); + + if (ShouldUpdateDestination()) + { + currentDestination = CalculateDestination(target); + StartOrUpdateMovement(); + } + + return CheckMovementCompletion(); + } + + public override void OnEnd() + { + StopMovement(); + cachedTarget = null; + } + + private GameObject GetTarget() + { + // ์บ์‹œ๋œ ํƒ€๊ฒŸ์ด ์œ ํšจํ•˜๋ฉด ์žฌ์‚ฌ์šฉ + if (IsValidTarget(cachedTarget)) + return cachedTarget; + + // ๋ธ”๋ž™๋ณด๋“œ์—์„œ ํƒ€๊ฒŸ ๊ฒ€์ƒ‰ + cachedTarget = gameObject.GetComponentInParent() + ?.GetCurrentInteractionTarget(); + + if (IsValidTarget(cachedTarget)) + return cachedTarget; + + // Interactor์˜ ํฌ์ปค์Šค๋œ ํƒ€๊ฒŸ ๊ฒ€์ƒ‰ + var interactor = gameObject.GetComponentInParent(); + var focusedInteractable = interactor?.GetFocusedInteractable(); + cachedTarget = focusedInteractable?.GetInteractableGameObject(); + + return cachedTarget; + } + + private bool IsValidTarget(GameObject target) => + target != null && target; + + private bool ShouldUpdateDestination() + { + repathTimer -= Time.deltaTime; + return !isMoving || (repathInterval > 0f && repathTimer <= 0f); + } + + private Vector3 CalculateDestination(GameObject target) + { + repathTimer = repathInterval; + + if (!useInteractionPoints) + return target.transform.position; + + return target.TryGetComponent(out var ric) + ? GetNearestInteractionPoint(ric) + : target.transform.position; + } + + private Vector3 GetNearestInteractionPoint(RestaurantInteractionComponent ric) + { + var points = ric.GetInteractionPoints(); + if (points == null || points.Length == 0) + return ric.transform.position; + + var agentPosition = GetAgentPosition(); + var nearestPoint = ric.transform.position; + var minDistanceSqr = float.MaxValue; + + foreach (var point in points) + { + var distanceSqr = (point - agentPosition).sqrMagnitude; + if (distanceSqr < minDistanceSqr) + { + minDistanceSqr = distanceSqr; + nearestPoint = point; + } + } + + return nearestPoint; + } + + private void StartOrUpdateMovement() + { + if (!isMoving) + { + if (movement.TryMoveToPosition(currentDestination)) + { + movement.EnableMove(); + movement.PlayMove(); + isMoving = true; + } + } + else + { + movement.TryMoveToPosition(currentDestination); + } + } + + private TaskStatus CheckMovementCompletion() + { + var distanceSqr = (GetAgentPosition() - currentDestination).sqrMagnitude; + var stoppingDistanceSqr = stoppingDistance * stoppingDistance; + + if (distanceSqr <= stoppingDistanceSqr || movement.HasReachedDestination()) + { + StopMovement(); + return TaskStatus.Success; + } + + return TaskStatus.Running; + } + + private void StopMovement() + { + if (movement != null && isMoving) + { + movement.StopMove(); + movement.DisableMove(); + isMoving = false; + } + } + + private Vector3 GetAgentPosition() => + movement?.CurrentPosition ?? transform.position; + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/MoveToInteractionTarget.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/MoveToInteractionTarget.cs.meta new file mode 100644 index 000000000..92e078ee6 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Actions/MoveToInteractionTarget.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d97cd08353334cb698807d4b526d01b6 +timeCreated: 1755769413 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Decorator.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Decorator.meta new file mode 100644 index 000000000..871887e4a --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Decorator.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f96045235fcc43c880f2e0ee857b6f2e +timeCreated: 1756111444 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Decorator/TimeLimiter.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Decorator/TimeLimiter.cs new file mode 100644 index 000000000..ec725c587 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Decorator/TimeLimiter.cs @@ -0,0 +1,231 @@ +using Opsive.BehaviorDesigner.Runtime; +using Opsive.BehaviorDesigner.Runtime.Components; +using Opsive.BehaviorDesigner.Runtime.Tasks; +using Opsive.BehaviorDesigner.Runtime.Tasks.Decorators; +using Opsive.GraphDesigner.Runtime; +using Opsive.Shared.Utility; +using Unity.Burst; +using Unity.Entities; +using UnityEngine; + +namespace DDD +{ + [NodeDescription("์ž์‹ ํƒœ์Šคํฌ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค")] + public class TimeLimiter : ILogicNode, IParentNode, ITaskComponentData, IDecorator, ISavableTask + { + [Tooltip("The index of the node.")] + [SerializeField, HideInInspector] ushort _Index; + + [Tooltip("The parent index of the node. ushort.MaxValue indicates no parent.")] + [SerializeField, HideInInspector] ushort _ParentIndex; + + [Tooltip("The sibling index of the node. ushort.MaxValue indicates no sibling.")] + [SerializeField, HideInInspector] ushort _SiblingIndex; + + [Tooltip("์ตœ๋Œ€ ์‹คํ–‰ ์‹œ๊ฐ„(์ดˆ)")] + [SerializeField] float _timeLimit = 30.0f; + + [Tooltip("์‹œ๊ฐ„ ์ดˆ๊ณผ ์‹œ ๋ฐ˜ํ™˜ํ•  ์ƒํƒœ")] + [SerializeField] private TaskStatus _timeoutStatus = TaskStatus.Failure; + + private ushort _ComponentIndex; + + public ushort Index + { + get => _Index; + set => _Index = value; + } + + public ushort ParentIndex + { + get => _ParentIndex; + set => _ParentIndex = value; + } + + public ushort SiblingIndex + { + get => _SiblingIndex; + set => _SiblingIndex = value; + } + + public ushort RuntimeIndex { get; set; } + + public float TimeLimit + { + get => _timeLimit; + set => _timeLimit = value; + } + + public int MaxChildCount + { + get { return 1; } + } + + public ComponentType Tag + { + get => typeof(TimeLimiterTag); + } + + public System.Type SystemType + { + get => typeof(TimeLimiterTaskSystem); + } + + + public void AddBufferElement(World world, Entity entity) + { + DynamicBuffer buffer; + if (world.EntityManager.HasBuffer(entity)) + { + buffer = world.EntityManager.GetBuffer(entity); + } + else + { + buffer = world.EntityManager.AddBuffer(entity); + } + + buffer.Add(new TimeLimiterComponent() + { + Index = RuntimeIndex, + TimeLimit = _timeLimit, + TimeoutStatus = _timeoutStatus, + }); + _ComponentIndex = (ushort)(buffer.Length - 1); + } + + public void ClearBufferElement(World world, Entity entity) + { + if (world.EntityManager.HasBuffer(entity)) + { + var buffer = world.EntityManager.GetBuffer(entity); + buffer.Clear(); + } + } + + public MemberVisibility GetSaveReflectionType(int index) + { + return MemberVisibility.None; + } + + public object Save(World world, Entity entity) + { + var timeLimiterComponents = world.EntityManager.GetBuffer(entity); + var timeLimiterComponent = timeLimiterComponents[_ComponentIndex]; + + return timeLimiterComponent.StartTime; + } + + public void Load(object saveData, World world, Entity entity) + { + var timeLimiterComponents = world.EntityManager.GetBuffer(entity); + var timeLimiterComponent = timeLimiterComponents[_ComponentIndex]; + + timeLimiterComponent.StartTime = (float)saveData; + timeLimiterComponents[_ComponentIndex] = timeLimiterComponent; + } + } + + public struct TimeLimiterComponent : IBufferElementData + { + [Tooltip("The index of the node.")] + public ushort Index; + + [Tooltip("์ตœ๋Œ€ ์‹คํ–‰ ์‹œ๊ฐ„(์ดˆ)")] + public float TimeLimit; + + [Tooltip("์‹คํ–‰ ์‹œ์ž‘ ์‹œ๊ฐ„(์ดˆ)")] + public float StartTime; + + [Tooltip("Should the task end when the child returns failure?")] + public TaskStatus TimeoutStatus; + } + + public struct TimeLimiterTag : IComponentData, IEnableableComponent { } + + [DisableAutoCreation] + public partial struct TimeLimiterTaskSystem : ISystem + { + [BurstCompile] + private void OnUpdate(ref SystemState state) + { + var query = SystemAPI.QueryBuilder().WithAllRW().WithAllRW().WithAllRW().WithAll().Build(); + state.Dependency = new TimeLimiterJob() + { + CurrentTime = (float)SystemAPI.Time.ElapsedTime + }.ScheduleParallel(query, state.Dependency); + } + + [BurstCompile] + private partial struct TimeLimiterJob : IJobEntity + { + public float CurrentTime; + + [BurstCompile] + public void Execute(ref DynamicBuffer branchComponents, + ref DynamicBuffer taskComponents, + ref DynamicBuffer timeLimiterComponents) + { + for (int i = 0; i < timeLimiterComponents.Length; ++i) + { + var timeLimiterComponent = timeLimiterComponents[i]; + var taskComponent = taskComponents[timeLimiterComponent.Index]; + var branchComponent = branchComponents[taskComponent.BranchIndex]; + TaskComponent childTaskComponent; + + if (taskComponent.Status == TaskStatus.Queued) + { + taskComponent.Status = TaskStatus.Running; + taskComponents[taskComponent.Index] = taskComponent; + + timeLimiterComponent.StartTime = CurrentTime; + timeLimiterComponents[i] = timeLimiterComponent; + + childTaskComponent = taskComponents[taskComponent.Index + 1]; + childTaskComponent.Status = TaskStatus.Queued; + taskComponents[taskComponent.Index + 1] = childTaskComponent; + + branchComponent.NextIndex = taskComponent.Index + 1; + branchComponents[taskComponent.BranchIndex] = branchComponent; + continue; + } + else if (taskComponent.Status != TaskStatus.Running) + { + continue; + } + + if (timeLimiterComponent.StartTime >= 0f && + CurrentTime - timeLimiterComponent.StartTime >= timeLimiterComponent.TimeLimit) { + // ์‹œ๊ฐ„ ์ดˆ๊ณผ + taskComponent.Status = timeLimiterComponent.TimeoutStatus; + taskComponents[taskComponent.Index] = taskComponent; + + // ์ž์‹ ํƒœ์Šคํฌ๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ฉด ์ค‘๋‹จ + childTaskComponent = taskComponents[taskComponent.Index + 1]; + if (childTaskComponent.Status == TaskStatus.Running || + childTaskComponent.Status == TaskStatus.Queued) { + childTaskComponent.Status = timeLimiterComponent.TimeoutStatus; + taskComponents[taskComponent.Index + 1] = childTaskComponent; + } + + branchComponent.NextIndex = taskComponent.ParentIndex; + branchComponents[taskComponent.BranchIndex] = branchComponent; + continue; + } + + childTaskComponent = taskComponents[taskComponent.Index + 1]; + if (childTaskComponent.Status == TaskStatus.Queued || + childTaskComponent.Status == TaskStatus.Running) { + // The child should keep running. + continue; + } + + taskComponent.Status = childTaskComponent.Status; + taskComponents[taskComponent.Index] = taskComponent; + + branchComponent.NextIndex = taskComponent.ParentIndex; + branchComponents[taskComponent.BranchIndex] = branchComponent; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Decorator/TimeLimiter.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Decorator/TimeLimiter.cs.meta new file mode 100644 index 000000000..269fc297d --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Common/Decorator/TimeLimiter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d5da50af45c8438eb9677fd18378f9b4 +timeCreated: 1756111556 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer.meta new file mode 100644 index 000000000..20e141632 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6f1cc55df1da4604a2a7f445527710de +timeCreated: 1755765247 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions.meta new file mode 100644 index 000000000..471d824db --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6777cf4d7cf4408fafe4bc9097c32b01 +timeCreated: 1755767888 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/ContinueRestaurantOrder.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/ContinueRestaurantOrder.cs new file mode 100644 index 000000000..37397a54b --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/ContinueRestaurantOrder.cs @@ -0,0 +1,7 @@ +namespace DDD +{ + public class ContinueRestaurantOrder + { + // ์ด๋ฏธ ์žˆ๋Š” ์ธํ„ฐ๋ž™์…˜ ํƒ€๊ฒŸ์„ ๋Œ€์ƒ์œผ๋กœ ์ง„ํ–‰ํ•จ + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/ContinueRestaurantOrder.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/ContinueRestaurantOrder.cs.meta new file mode 100644 index 000000000..bf6373194 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/ContinueRestaurantOrder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d0b954edf40f4172964dbd6e4fe22b1a +timeCreated: 1755772289 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/StartRestaurantOrder.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/StartRestaurantOrder.cs new file mode 100644 index 000000000..bf6f0544b --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/StartRestaurantOrder.cs @@ -0,0 +1,70 @@ +using Opsive.BehaviorDesigner.Runtime.Tasks; +using Opsive.BehaviorDesigner.Runtime.Tasks.Actions; +using UnityEngine; + +namespace DDD +{ + public class StartRestaurantOrder : Action + { + [Tooltip("์ƒํ˜ธ์ž‘์šฉํ•  RestaurantOrderType")] + [SerializeField] private RestaurantOrderType _targetOrderType = RestaurantOrderType.Wait; + [Tooltip("์‹ค์ œ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค")] + [SerializeField] private bool _requireCanInteract = true; + [Tooltip("์„ฑ๊ณต ์‹œ ๋ธ”๋ž™๋ณด๋“œ์— ํ˜„์žฌ ์ธํ„ฐ๋ž™์…˜ ๋Œ€์ƒ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค")] + [SerializeField] private bool _registerOnBlackboard = true; + + private IInteractor _interactor; + private bool _isGetInteractor; + + public override void OnStart() + { + _isGetInteractor = gameObject.TryGetComponent(out _interactor); + if (!_isGetInteractor) + Debug.LogError($"[{GetType().Name}] IInteractor๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {gameObject.name}"); + } + + public override TaskStatus OnUpdate() + { + // TODO : ์•„๋ž˜ ํƒ€๊ฒŸ ์ฐพ๊ธฐ๊ฐ€ RestaurantOrderAvailable๊ณผ ๋™์ผํ•ด์•ผ ํ•จ, ๋™์ผํ•˜๋ฉด ์ค‘๋ณต๋  ํ•„์š” ์—†์œผ๋‹ˆ ์Šคํƒœํ‹ฑ ์œ ํ‹ธ ํ•จ์ˆ˜์ •๋„๋กœ ๋งŒ๋“ค์–ด์„œ ๊ณต์œ ํ•˜๊ธฐ. + // ๋ ˆ์Šคํ† ๋ž‘ ์ฃผ๋ฌธ ์ธํ„ฐ๋ž™์…˜ ํ›„๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด + TaskStatus targetSearchSuccess = RestaurantOrderAvailable.FindAvailableOrderInteractable(_requireCanInteract, _targetOrderType, out var + outInteractable); + if (targetSearchSuccess == TaskStatus.Failure) + { + return TaskStatus.Failure; + } + + // TODO : ์•„๋ž˜ ์ƒํ˜ธ์ž‘์šฉ ์ˆ˜ํ–‰ ๋กœ์ง์ด ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์˜ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹˜. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์˜ค๋ธŒ์ ํŠธ์— ์ธํ„ฐ๋ž™์…˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ํ๋ฆ„์œผ๋กœ NPC๊ฐ€ ์˜ค๋ธŒ์ ํŠธ์— ์ธํ„ฐ๋ž™์…˜ํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ. + // ์ƒํ˜ธ์ž‘์šฉ ์ˆ˜ํ–‰: ์•ก์…˜์ด ๋ถ™์€ ์—์ด์ „ํŠธ๋ฅผ Interactor๋กœ ์‚ฌ์šฉ + if (!_isGetInteractor || !_interactor.CanInteractTo(outInteractable)) + { + return TaskStatus.Failure; + } + + // TODO : ์ด๋ฒคํŠธ ํ†ตํ•ด์„œ ์ธํ„ฐ๋ž™์…˜. ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ๋ง ๊ฒƒ! + var interacted = outInteractable.OnInteracted(_interactor); + if (!interacted) + { + return TaskStatus.Failure; + } + + if (_registerOnBlackboard) + { + // ๊ณต์šฉ ๋ธ”๋ž™๋ณด๋“œ ์šฐ์„  + var shared = gameObject.GetComponentInChildren(); + if (shared != null) + { + shared.SetCurrentInteractionTarget(outInteractable.gameObject); + } + else + { + // ํ•˜์œ„ ํ˜ธํ™˜: ๊ณ ๊ฐ ์ „์šฉ ๋ธ”๋ž™๋ณด๋“œ ์ง€์› + var customerBb = gameObject.GetComponentInParent(); + customerBb?.SetCurrentInteractionTarget(outInteractable.gameObject); + } + } + + return TaskStatus.Success; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/StartRestaurantOrder.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/StartRestaurantOrder.cs.meta new file mode 100644 index 000000000..b24f479a5 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/StartRestaurantOrder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 84b6c26acd1e41afa6b07ed4c6caf860 +timeCreated: 1755767930 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/WaitForPlayerInteraction.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/WaitForPlayerInteraction.cs new file mode 100644 index 000000000..220788be6 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/WaitForPlayerInteraction.cs @@ -0,0 +1,102 @@ +using Opsive.BehaviorDesigner.Runtime.Tasks; +using Opsive.BehaviorDesigner.Runtime.Tasks.Actions; +using UnityEngine; + +namespace DDD +{ + //๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Œ + //์ฐจํ›„ ์ œ๋„ค๋ฆญ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ + public class WaitForPlayerInteraction : Action + { + [Tooltip("๊ธฐ๋‹ค๋ฆด ์ƒํ˜ธ์ž‘์šฉ ํƒ€์ž…")] + [SerializeField] private RestaurantMealType _targetOrderType = RestaurantMealType.WaitForOrder; + + private IInteractionSubsystemObject _interactionSubsystem; + private bool _isGetInteractionSubsystem; + + public override void OnStart() + { + // ์˜์ž๊ฐ€ ๋ณตํ•ฉ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋  ๊ฒฝ์šฐ + // GameObject interactionTarget = null; + // var shared = gameObject.GetComponentInChildren(); + // if (shared != null) + // { + // interactionTarget = shared.GetCurrentInteractionTarget(); + // } + // else + // { + // // ํ•˜์œ„ ํ˜ธํ™˜: ๊ณ ๊ฐ ์ „์šฉ ๋ธ”๋ž™๋ณด๋“œ ์ง€์› + // var customerBb = gameObject.GetComponentInParent(); + // interactionTarget = customerBb?.GetCurrentInteractionTarget(); + // } + // + // if (interactionTarget == null) + // { + // Debug.LogError($"[{GetType().Name}] interactionTarget์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {gameObject.name}"); + // return; + // } + // + // if (!interactionTarget.TryGetComponent(out var interactionComponent)) + // Debug.LogError($"[{interactionTarget.name}] {nameof(interactionComponent)}๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {gameObject.name}"); + // if (interactionComponent is IInteractionSubsystemOwner subsystemOwner) + // { + // if (!subsystemOwner.TryGetSubsystemObject(out var subsystem)) + // { + // Debug.LogError($"[{GetType().Name}] {nameof(_targetOrderType)}์˜ Subsystem์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {gameObject.name}"); + // _isGetInteractionSubsystem = false; + // return; + // } + // + // _isGetInteractionSubsystem = true; + // subsystem.SetInteractionSubsystemType(_targetOrderType); + // + // if (!gameObject.TryGetComponent(out var interactor)) + // { + // Debug.LogError($"[{GetType().Name}] IInteractor๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {gameObject.name}"); + // return; + // } + // + // interactor.CanInteractTo(interactionComponent); + // + // _interactionSubsystem = subsystem; + // } + + if (!gameObject.TryGetComponent(out var interactionComponent)) + { + Debug.LogError($"[{GetType().Name}]์—์„œ interactionComponent๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {gameObject.name}"); + return; + } + + if (interactionComponent is not IInteractionSubsystemOwner subsystemOwner) + { + Debug.LogError($"[{GetType().Name}]์—์„œ {nameof(IInteractionSubsystemOwner)}๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {gameObject.name}"); + return; + } + + if (!subsystemOwner.TryGetSubsystemObject(out _interactionSubsystem)) + { + Debug.LogError($"[{GetType().Name}]์—์„œ {nameof(IInteractionSubsystemObject)}๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {gameObject.name}"); + return; + } + + _interactionSubsystem.SetInteractionSubsystemType(_targetOrderType); + _isGetInteractionSubsystem = true; + } + + public override TaskStatus OnUpdate() + { + if (!_isGetInteractionSubsystem) return TaskStatus.Failure; + + TaskStatus result = CheckToSubsystemStatus(); + if (result == TaskStatus.Success) Debug.Log($"[{GetType().Name}] Success"); + return result; + } + + private TaskStatus CheckToSubsystemStatus() + { + return _interactionSubsystem.GetInteractionSubsystemType() == _targetOrderType + ? TaskStatus.Running + : TaskStatus.Success; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/WaitForPlayerInteraction.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/WaitForPlayerInteraction.cs.meta new file mode 100644 index 000000000..e9b41353b --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Actions/WaitForPlayerInteraction.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4bb97122045148169906d2f7b04a712e +timeCreated: 1756171540 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Conditionals.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Conditionals.meta new file mode 100644 index 000000000..0df5af835 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Conditionals.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c4f20081a3974c08b60b9efdbe1568a7 +timeCreated: 1755765256 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Conditionals/RestaurantOrderAvailable.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Conditionals/RestaurantOrderAvailable.cs new file mode 100644 index 000000000..b10254f84 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Conditionals/RestaurantOrderAvailable.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using Opsive.BehaviorDesigner.Runtime.Tasks; +using Opsive.BehaviorDesigner.Runtime.Tasks.Conditionals; +using UnityEngine; +using DDD; + +namespace DDD +{ + public class RestaurantOrderAvailable : Conditional + { + [Tooltip("๊ฒ€์‚ฌํ•  RestaurantOrderType")] + [SerializeField] private RestaurantOrderType _targetOrderType = RestaurantOrderType.Wait; + [Tooltip("์ธํ„ฐ๋ž™์…˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊นŒ์ง€ ํ™•์ธํ• ์ง€ ์„ ํƒ")] + [SerializeField] private bool _checkCanInteract = true; + + public RestaurantOrderType TargetOrderType + { + get => _targetOrderType; + set => _targetOrderType = value; + } + + public bool CheckCanInteract + { + get => _checkCanInteract; + set => _checkCanInteract = value; + } + + public override TaskStatus OnUpdate() + { + TaskStatus targetSearchSuccess = FindAvailableOrderInteractable(_checkCanInteract, _targetOrderType, out var + outInteractable); + return targetSearchSuccess; + + } + + public static TaskStatus FindAvailableOrderInteractable(bool checkCanInteract, T targetOrderType, out RestaurantInteractionComponent outInteractable) where T : Enum + { + outInteractable = null; + + var environmentState = RestaurantState.Instance?.EnvironmentState; + if (environmentState == null) + { + return TaskStatus.Failure; + } + + var interactables = environmentState.GetInteractablesByType(InteractionType.RestaurantOrder); + + foreach (var interactable in interactables) + { + // ์„œ๋ธŒ์‹œ์Šคํ…œ์—์„œ RestaurantOrderType์„ ๊ฐ€์ ธ์™€ ๋น„๊ต + outInteractable = interactable as RestaurantInteractionComponent; + if (outInteractable == null) continue; + if (!outInteractable.TryGetSubsystemObject(out var subsystem)) continue; + + if (EqualityComparer.Default.Equals(subsystem.GetInteractionSubsystemType(), targetOrderType) + ) + { + // CheckCanInteract์ด false๋ฉด ํƒ€์ž…๋งŒ ๋งž์œผ๋ฉด ์„ฑ๊ณต + if (!checkCanInteract) + { + return TaskStatus.Success; + } + + // CheckCanInteract์ด true๋ฉด ์‹ค์ œ ์ธํ„ฐ๋ž™์…˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊นŒ์ง€ ํ™•์ธ + if (interactable.CanInteract()) + { + return TaskStatus.Success; + } + } + } + + return TaskStatus.Failure; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Conditionals/RestaurantOrderAvailable.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Conditionals/RestaurantOrderAvailable.cs.meta new file mode 100644 index 000000000..04186450b --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/Conditionals/RestaurantOrderAvailable.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bef354fd7cae4273b4cb4e7ff9e270f5 +timeCreated: 1755765519 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerAiComponent.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerAiComponent.cs new file mode 100644 index 000000000..6206ce2fb --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerAiComponent.cs @@ -0,0 +1,57 @@ +using System; +using System.Threading.Tasks; +using Opsive.BehaviorDesigner.Runtime; +using Unity.Entities; +using UnityEngine; +using UnityEngine.AddressableAssets; + +namespace DDD +{ + [RequireComponent(typeof(BehaviorTree))] + [RequireComponent(typeof(RestaurantCustomerBlackboardComponent))] + public class RestaurantCustomerAiComponent : MonoBehaviour, IRestaurantCustomerAi + { + protected BehaviorTree _behaviorTree; + protected RestaurantCustomerBlackboardComponent _blackboardComponent; + + private void Awake() + { + _behaviorTree = GetComponent(); + _blackboardComponent = GetComponent(); + } + + public void InitializeAi(CustomerData inCustomerData) + { + try + { + InitializeAiInternal(inCustomerData); + } + catch (Exception e) + { + // Log + Debug.LogError(e); + throw; // TODO ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + } + } + + private async Task InitializeAiInternal(CustomerData inCustomerData) + { + var customerState = RestaurantState.Instance.CustomerState; + var subtree = customerState.GetLoadedSubtree(inCustomerData.CustomerType); + + if (subtree == null) + { + Debug.LogError( + $"[CustomerCharacter] No preloaded subtree found for CustomerType: {inCustomerData.CustomerType}. Make sure CustomerBehaviorData is loaded."); + subtree = await customerState.GetOrLoadSubtree(inCustomerData.CustomerType); + } + + _behaviorTree.Subgraph = subtree; + _blackboardComponent.InitializeWithBehaviorTree(subtree); + _blackboardComponent.SetCustomerData(inCustomerData); + // TODO : 1. Subtree - Action, Condition + // TODO : 2. Blackboard + _behaviorTree.StartBehavior(); + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerAiComponent.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerAiComponent.cs.meta new file mode 100644 index 000000000..42084712a --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerAiComponent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: af69e82818254bfa9cabb2dbf9430850 +timeCreated: 1755748000 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerBlackboardComponent.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerBlackboardComponent.cs new file mode 100644 index 000000000..98112000e --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerBlackboardComponent.cs @@ -0,0 +1,39 @@ +using Opsive.BehaviorDesigner.Runtime; +using UnityEngine; + +namespace DDD +{ + public class RestaurantCustomerBlackboardComponent : MonoBehaviour, IRestaurantCustomerBlackboard, IAISharedBlackboard + { + private Subtree _subtree; + private GameObject _currentInteractionTarget; + + public void InitializeWithBehaviorTree(Subtree subtree) + { + _subtree = subtree; + if (_subtree != null) + { + _subtree.SetVariableValue(nameof(RestaurantCustomerBlackboardKey.SelfGameObject), gameObject); + } + } + + public void SetCustomerData(CustomerData inCustomerData) + { + if (_subtree == null) return; + _subtree.SetVariableValue(nameof(RestaurantCustomerBlackboardKey.CustomerData), inCustomerData); + } + + public void SetCurrentInteractionTarget(GameObject targetGameObject) + { + _currentInteractionTarget = targetGameObject; + if (_subtree == null) return; + _subtree.SetVariableValue(nameof(RestaurantCustomerBlackboardKey.CurrentInteractionTarget), targetGameObject); + } + + public GameObject GetCurrentInteractionTarget() + { + // ์บ์‹œ ์šฐ์„  ๋ฐ˜ํ™˜. ํ•„์š” ์‹œ Subtree์—์„œ ์ง์ ‘ ์กฐํšŒํ•˜๋„๋ก ํ™•์žฅ ๊ฐ€๋Šฅ. + return _currentInteractionTarget; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerBlackboardComponent.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerBlackboardComponent.cs.meta new file mode 100644 index 000000000..f4ab0960a --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/AI/Customer/RestaurantCustomerBlackboardComponent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 784c770c13244dc0a0804056065eaf92 +timeCreated: 1755748886 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/Core/RestaurantCharacter.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/Core/RestaurantCharacter.cs index 45c56de5d..892a2bbfe 100644 --- a/Assets/_DDD/_Scripts/RestaurantCharacter/Core/RestaurantCharacter.cs +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/Core/RestaurantCharacter.cs @@ -14,10 +14,6 @@ protected virtual void Awake() { _interactionComponent = GetComponent(); _spineController = GetComponent(); - } - - protected virtual void Start() - { foreach (var typeToSolver in RestaurantInteractionEventSolvers.TypeToSolver) { var flag = typeToSolver.Key; @@ -32,6 +28,11 @@ protected virtual void Start() } } + protected virtual void Start() + { + + } + public GameObject GetInteractorGameObject() { return _interactionComponent.GetInteractorGameObject(); diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerAi.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerAi.cs new file mode 100644 index 000000000..785b8bb03 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerAi.cs @@ -0,0 +1,7 @@ +namespace DDD +{ + public interface IRestaurantCustomerAi + { + void InitializeAi(CustomerData inCustomerData); + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerAi.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerAi.cs.meta new file mode 100644 index 000000000..0aae47e45 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerAi.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 308488f2a02448d3853514eff04711fa +timeCreated: 1755748296 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerBlackboard.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerBlackboard.cs new file mode 100644 index 000000000..51859cddf --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerBlackboard.cs @@ -0,0 +1,18 @@ +using UnityEngine; + +namespace DDD +{ + public enum RestaurantCustomerBlackboardKey + { + SelfGameObject, + CustomerData, + CurrentInteractionTarget, + } + + public interface IRestaurantCustomerBlackboard + { + void SetCustomerData(CustomerData inCustomerData); + void SetCurrentInteractionTarget(GameObject targetGameObject); + GameObject GetCurrentInteractionTarget(); + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerBlackboard.cs.meta b/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerBlackboard.cs.meta new file mode 100644 index 000000000..694439b41 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/Interfaces/IRestaurantCustomerBlackboard.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a4f20d91da7045e4bc226be60254ef2b +timeCreated: 1755748894 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/Customer/CustomerCharacter.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/Customer/CustomerCharacter.cs index 652e99556..bba008853 100644 --- a/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/Customer/CustomerCharacter.cs +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/Customer/CustomerCharacter.cs @@ -2,54 +2,28 @@ using Opsive.BehaviorDesigner.Runtime; using UnityEngine; using UnityEngine.AddressableAssets; -using UnityEngine.ResourceManagement.AsyncOperations; namespace DDD { + [RequireComponent(typeof(RestaurantCustomerAiComponent))] public class CustomerCharacter : RestaurantNpcCharacter, ICustomerInitializer { private CustomerData _customerData; - - private AsyncOperationHandle _subtreeHandle; - - public async void Initialize(CustomerData customerData) + protected IRestaurantCustomerAi restaurantCustomerAi; + + protected override void Awake() + { + base.Awake(); + restaurantCustomerAi = GetComponent(); + } + + public void Initialize(CustomerData customerData) { _customerData = customerData; + restaurantCustomerAi.InitializeAi(_customerData); // ์Šคํ‚จ ์„ค์ • _spineController.SetSkin(_customerData.SpineSkinKey); - - // CustomerType์— ๋”ฐ๋ฅธ behavior tree subtree ํ• ๋‹น - await InitializeBehaviorTree(); - } - - private async Task InitializeBehaviorTree() - { - var customerData = RestaurantData.Instance.CustomerData; - - if (customerData?.CustomerBehaviorData?.TryGetValue(_customerData.CustomerType, out var subtreeReference) != true) - { - Debug.LogError($"[CustomerCharacter] No behavior data found for CustomerType: {_customerData.CustomerType}"); - return; - } - - try - { - var subtree = await AssetManager.LoadAsset(subtreeReference.AssetGUID); - if (subtree != null) - { - _behaviorTree.Subgraph = subtree; - _behaviorTree.StartBehavior(); - } - else - { - Debug.LogError($"[CustomerCharacter] Failed to load subtree for CustomerType: {_customerData.CustomerType}"); - } - } - catch (System.Exception e) - { - Debug.LogError($"[CustomerCharacter] Error loading subtree for CustomerType {_customerData.CustomerType}: {e.Message}"); - } } } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/RestaurantNpcCharacter.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/RestaurantNpcCharacter.cs index 1df86afe0..0b55d5293 100644 --- a/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/RestaurantNpcCharacter.cs +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/RestaurantNpcCharacter.cs @@ -3,16 +3,12 @@ namespace DDD { - [RequireComponent(typeof(BehaviorTree))] + [RequireComponent(typeof(RestaurantNpcMovement))] public class RestaurantNpcCharacter : RestaurantCharacter { - protected BehaviorTree _behaviorTree; - protected override void Awake() { base.Awake(); - - _behaviorTree = GetComponent(); } } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/RestaurantNpcMovement.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/RestaurantNpcMovement.cs index cd32293cb..e73acf69f 100644 --- a/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/RestaurantNpcMovement.cs +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/Npc/RestaurantNpcMovement.cs @@ -101,6 +101,7 @@ public bool HasReachedDestination() public bool IsPositionMovable(Vector3 endPosition) { + var nearestNode = AstarPath.active.GetNearest(endPosition).node; return nearestNode != null && nearestNode.Walkable; } diff --git a/Assets/_DDD/_Scripts/RestaurantCharacter/Player/RestaurantPlayerCharacter.cs b/Assets/_DDD/_Scripts/RestaurantCharacter/Player/RestaurantPlayerCharacter.cs index ea20068fb..7dad4869f 100644 --- a/Assets/_DDD/_Scripts/RestaurantCharacter/Player/RestaurantPlayerCharacter.cs +++ b/Assets/_DDD/_Scripts/RestaurantCharacter/Player/RestaurantPlayerCharacter.cs @@ -1,5 +1,8 @@ +using UnityEngine; + namespace DDD { + [RequireComponent(typeof(RestaurantPlayerMovement))] public class RestaurantPlayerCharacter : RestaurantCharacter { protected override async void Awake() diff --git a/Assets/_DDD/_Scripts/RestaurantController/Conrtollers/RestaurantRunController.cs b/Assets/_DDD/_Scripts/RestaurantController/Conrtollers/RestaurantRunController.cs index 179f4a908..6bbc05bc3 100644 --- a/Assets/_DDD/_Scripts/RestaurantController/Conrtollers/RestaurantRunController.cs +++ b/Assets/_DDD/_Scripts/RestaurantController/Conrtollers/RestaurantRunController.cs @@ -27,6 +27,9 @@ public override Task InitializeController() { _restaurantCustomerStateSo = RestaurantState.Instance.CustomerState; _restaurantRunStateSo = RestaurantState.Instance.RunState; + + _iCustomerFactory ??= new CustomerFactory(); + return Task.CompletedTask; } @@ -41,6 +44,9 @@ public override async Task OnReadyNewFlow(GameFlowState newFlowState) { if (newFlowState == GameFlowState.RunRestaurant) { + _iCustomerFactory.LoadAssets(); + await _restaurantCustomerStateSo.LoadCustomerBehaviorData(); + _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); @@ -52,6 +58,9 @@ public override Task OnExitCurrentFlow(GameFlowState exitingFlowState) { if (exitingFlowState == GameFlowState.RunRestaurant) { + _iCustomerFactory.UnloadAssets(); + _restaurantCustomerStateSo.UnloadCustomerBehaviorData(); + _cts?.Cancel(); _cts?.Dispose(); _cts = null; @@ -61,8 +70,6 @@ public override Task OnExitCurrentFlow(GameFlowState exitingFlowState) private async Task StartSpawnLoopAsync(CancellationToken token) { - _iCustomerFactory ??= new CustomerFactory(); - var currentGameLevel = GameState.Instance.LevelState.Level; _levelDataSo ??= DataManager.Instance.GetDataSo(); _customerDataSo ??= DataManager.Instance.GetDataSo(); @@ -115,7 +122,7 @@ SpawnSchedule MakeSchedule() => scheduleBuilder.Build(new SpawnScheduleBuildArgs { var rotation = Quaternion.identity; - _ = _iCustomerFactory.CreateAsync(new CustomerSpawnArgs + await _iCustomerFactory.CreateAsync(new CustomerSpawnArgs { CustomerData = customerData, Position = _restaurantRunStateSo.SpawnPoint, diff --git a/Assets/_DDD/_Scripts/RestaurantController/Conrtollers/Run/Customer/CustomerFactory.cs b/Assets/_DDD/_Scripts/RestaurantController/Conrtollers/Run/Customer/CustomerFactory.cs index d69b62862..9131469c6 100644 --- a/Assets/_DDD/_Scripts/RestaurantController/Conrtollers/Run/Customer/CustomerFactory.cs +++ b/Assets/_DDD/_Scripts/RestaurantController/Conrtollers/Run/Customer/CustomerFactory.cs @@ -1,11 +1,15 @@ using System.Threading.Tasks; using UnityEngine; +using UnityEngine.AddressableAssets; +using UnityEngine.ResourceManagement.AsyncOperations; namespace DDD { public interface ICustomerFactory { Task CreateAsync(CustomerSpawnArgs args); + void LoadAssets(); + void UnloadAssets(); } public interface ICustomerInitializer @@ -24,26 +28,14 @@ public struct CustomerSpawnArgs public class CustomerFactory : ICustomerFactory { private GameObject _customerPrefab; + private AsyncOperationHandle _customerPrefabHandle; public async Task CreateAsync(CustomerSpawnArgs args) { if (!_customerPrefab) { - var customerDataAsset = RestaurantData.Instance ? RestaurantData.Instance.CustomerData : null; - if (customerDataAsset == null || customerDataAsset.CustomerPrefab == null) - { - Debug.LogError("[CustomerFactory] RestaurantCustomerData or its CustomerPrefab reference is not set or not loaded."); - return null; - } - - var handle = customerDataAsset.CustomerPrefab.LoadAssetAsync(); - await handle.Task; - if (handle.Result == null) - { - Debug.LogError("[CustomerFactory] Failed to load customer prefab from AssetReference."); - return null; - } - _customerPrefab = handle.Result; + Debug.LogError("[CustomerFactory] Customer prefab is not loaded. Call LoadAssets() first."); + await LoadCustomerAsset(); } var newCustomer = Object.Instantiate(_customerPrefab, args.Position, args.Rotation, args.Parent); @@ -54,5 +46,47 @@ public async Task CreateAsync(CustomerSpawnArgs args) } return newCustomer; } + + public async void LoadAssets() + { + await LoadCustomerAsset(); + } + + private async Task LoadCustomerAsset() + { + if (_customerPrefab != null) + { + return; + } + + var customerDataAsset = RestaurantData.Instance ? RestaurantData.Instance.CustomerData : null; + if (customerDataAsset == null || customerDataAsset.CustomerPrefab == null) + { + Debug.LogError("[CustomerFactory] RestaurantCustomerData or its CustomerPrefab reference is not set."); + return; + } + + _customerPrefabHandle = customerDataAsset.CustomerPrefab.LoadAssetAsync(); + await _customerPrefabHandle.Task; + + if (_customerPrefabHandle.Result == null) + { + Debug.LogError("[CustomerFactory] Failed to load customer prefab from AssetReference."); + return; + } + + _customerPrefab = _customerPrefabHandle.Result; + Debug.Log("[CustomerFactory] Customer prefab loaded successfully."); + } + + public void UnloadAssets() + { + if (_customerPrefabHandle.IsValid()) + { + Addressables.Release(_customerPrefabHandle); + } + _customerPrefab = null; + Debug.Log("[CustomerFactory] Customer prefab unloaded."); + } } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteractionSubsystem.cs b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteractionSubsystem.cs index 3fe6d674e..0c7dd033c 100644 --- a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteractionSubsystem.cs +++ b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteractionSubsystem.cs @@ -19,17 +19,22 @@ public RestaurantManagementType GetInteractionSubsystemType() return _managementType; } - public virtual void InitializeSubsystem() + public void SetInteractionSubsystemType(RestaurantManagementType inValue) + { + _managementType = inValue; + } + + public void InitializeSubsystem() { } - public virtual bool CanInteract() + public bool CanInteract() { return true; } - public virtual bool OnInteracted(IInteractor interactor, ScriptableObject payloadSo = null) + public bool OnInteracted(IInteractor interactor, ScriptableObject payloadSo = null) { return true; } diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantMealInteractionSubsystem.cs b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantMealInteractionSubsystem.cs new file mode 100644 index 000000000..d018dc86b --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantMealInteractionSubsystem.cs @@ -0,0 +1,62 @@ +using System; +using UnityEngine; + +namespace DDD +{ + public enum RestaurantMealType : uint + { + None = 0u, + WaitForOrder = 1u, + WaitForServe = 1u << 1 + } + public class RestaurantMealInteractionSubsystem : MonoBehaviour, IInteractionSubsystemObject + { + private RestaurantMealType _currentRestaurantMealType; + private void Awake() + { + _currentRestaurantMealType = RestaurantMealType.None; + } + public RestaurantMealType GetInteractionSubsystemType() + { + return _currentRestaurantMealType; + } + + public void SetInteractionSubsystemType(RestaurantMealType inValue) + { + _currentRestaurantMealType = inValue; + } + + public void InitializeSubsystem() + { + _currentRestaurantMealType = RestaurantMealType.None; + } + + public bool CanInteract() + { + return _currentRestaurantMealType != RestaurantMealType.None; + } + + public bool OnInteracted(IInteractor interactor, ScriptableObject payloadSo = null) + { + var prev = _currentRestaurantMealType; + _currentRestaurantMealType = GetNextState(prev); + return true; + } + + public ScriptableObject GetPayload() + { + return null; + } + + private RestaurantMealType GetNextState(RestaurantMealType state) + { + switch (state) + { + case RestaurantMealType.None : return RestaurantMealType.WaitForOrder; + case RestaurantMealType.WaitForOrder : return RestaurantMealType.WaitForServe; + case RestaurantMealType.WaitForServe : return RestaurantMealType.None; + default: return RestaurantMealType.None; + } + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantMealInteractionSubsystem.cs.meta b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantMealInteractionSubsystem.cs.meta new file mode 100644 index 000000000..16a96ce29 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantMealInteractionSubsystem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 31d5c600061a4f05b19824e068e0c2af +timeCreated: 1756176676 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantOrderInteractionSubsystem.cs b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantOrderInteractionSubsystem.cs index 518e84eaa..fd6260925 100644 --- a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantOrderInteractionSubsystem.cs +++ b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantOrderInteractionSubsystem.cs @@ -3,13 +3,14 @@ namespace DDD { - [Flags] public enum RestaurantOrderType : uint { Wait = 0u, Reserved = 1u, Order = 1u << 1, Serve = 1u << 2, + Busy = 1u << 3, + Dirty = 1u << 4, } public class RestaurantOrderInteractionSubsystem : MonoBehaviour, IInteractionSubsystemObject @@ -24,20 +25,18 @@ private void Start() public bool CanInteract() { - if (GetInteractionSubsystemType() == RestaurantOrderType.Wait) - { - return true; - } - return false; + //if (GetInteractionSubsystemType() == RestaurantOrderType.Wait) + //{ + // return true; + //} + return true; } public bool OnInteracted(IInteractor interactor, ScriptableObject payloadSo = null) { - if (GetInteractionSubsystemType() == RestaurantOrderType.Wait) - { - // DO WAIT CUSTOMER - } - + // ๊ฐ„๋‹จํ•œ ์ƒํƒœ ์ „์ด: ํ˜„์žฌ ์ƒํƒœ์—์„œ ๋‹ค์Œ ์ƒํƒœ๋กœ ์ด๋™ + var prev = currentRestaurantOrderType; + currentRestaurantOrderType = GetNextState(prev); return true; } @@ -48,12 +47,31 @@ public ScriptableObject GetPayload() public void InitializeSubsystem() { - + currentRestaurantOrderType = orderType; } public RestaurantOrderType GetInteractionSubsystemType() { return currentRestaurantOrderType; } + + public void SetInteractionSubsystemType(RestaurantOrderType inValue) + { + currentRestaurantOrderType = inValue; + } + + private RestaurantOrderType GetNextState(RestaurantOrderType state) + { + switch (state) + { + case RestaurantOrderType.Wait: return RestaurantOrderType.Reserved; + case RestaurantOrderType.Reserved: return RestaurantOrderType.Order; + case RestaurantOrderType.Order: return RestaurantOrderType.Serve; + case RestaurantOrderType.Serve: return RestaurantOrderType.Busy; + case RestaurantOrderType.Busy: return RestaurantOrderType.Dirty; + case RestaurantOrderType.Dirty: return RestaurantOrderType.Wait; + default: return RestaurantOrderType.Wait; + } + } } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionComponent.cs b/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionComponent.cs index 0970a8410..a7059d6dc 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionComponent.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionComponent.cs @@ -12,7 +12,8 @@ public static class RestaurantInteractionSubsystems public static Dictionary TypeToSubsystem = new() { {InteractionType.RestaurantOrder, typeof(RestaurantOrderInteractionSubsystem)}, - {InteractionType.RestaurantManagement, typeof(RestaurantManagementInteractionSubsystem)} + {InteractionType.RestaurantManagement, typeof(RestaurantManagementInteractionSubsystem)}, + {InteractionType.RestaurantMeal, typeof(RestaurantMealInteractionSubsystem)} }; } @@ -27,12 +28,35 @@ public class RestaurantInteractionComponent : MonoBehaviour, IInteractable, IInt [SerializeField] protected GameFlowState _interactionAvailableFlows; [SerializeField] private Transform[] _aiInteractionPoints; [SerializeField] private bool autoInitialize = true; + private bool _isInitialized = false; private Dictionary _subsystems = new(); + private void OnEnable() + { + // Register this interactable to environment state + var environmentState = RestaurantState.Instance?.EnvironmentState; + environmentState?.RegisterInteractable(this); + + if (autoInitialize && !_isInitialized) + { + InitializeInteraction(_interactionType); + } + } + + private void OnDisable() + { + var environmentState = RestaurantState.Instance?.EnvironmentState; + environmentState?.UnregisterInteractable(this); + } + private void Start() { - if (autoInitialize) + // ๋ณด์ˆ˜์ ์œผ๋กœ Start์—์„œ๋„ ๋“ฑ๋ก ์‹œ๋„ (OnEnable ์‹œ์ ์— EnvironmentState๊ฐ€ ์—†์—ˆ์„ ๊ฒฝ์šฐ ๋Œ€๋น„) + var environmentState = RestaurantState.Instance?.EnvironmentState; + environmentState?.RegisterInteractable(this); + + if (autoInitialize && !_isInitialized) { InitializeInteraction(_interactionType); } @@ -92,6 +116,7 @@ public GameObject GetInteractableGameObject() public virtual void InitializeInteraction(InteractionType interactionType) { _interactionType = interactionType; + _isInitialized = true; InitializeSubsystems(); } diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionEvents.cs b/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionEvents.cs index 87047ccae..bcf28a65b 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionEvents.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionEvents.cs @@ -15,6 +15,7 @@ public static class RestaurantInteractionEventSolvers { {InteractionType.RestaurantManagement, typeof(RestaurantManagementSolver)}, {InteractionType.RestaurantOrder, typeof(RestaurantOrderSolver)}, + {InteractionType.RestaurantMeal, typeof(RestaurantMealSolver)}, {InteractionType.RestaurantCook, typeof(RestaurantCookSolver)} }; } diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver.cs index 89a985f8f..92e3ce5c5 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver.cs @@ -3,19 +3,17 @@ namespace DDD { - public static class RestaurantManagementSolvers + public class RestaurantManagementSolver : RestaurantSubsystemSolver { - public static Dictionary TypeToManagementSolver = new() + + private Dictionary _typeToManagementSolver = new() { { RestaurantManagementType.OpenRestaurantMenu, typeof(RestaurantManagementSolver_Menu) }, { RestaurantManagementType.StartRestaurant, typeof(RestaurantManagementSolver_Start) }, }; - } - public class RestaurantManagementSolver : RestaurantSubsystemSolver - { protected override Dictionary GetSubsystemSolverTypeMappings() { - return RestaurantManagementSolvers.TypeToManagementSolver; + return _typeToManagementSolver; } } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals.meta new file mode 100644 index 000000000..00588c64d --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 601164c0231c43fca9349170e1e0ccec +timeCreated: 1756176395 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver.cs new file mode 100644 index 000000000..cd4b2a565 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace DDD +{ + public class RestaurantMealSolver : RestaurantSubsystemSolver + { + private Dictionary _typeToMealSolver = new() + { + { RestaurantMealType.WaitForOrder, typeof(RestaurantMealSolver_WaitForOrder) }, + { RestaurantMealType.WaitForServe, typeof(RestaurantMealSolver_WaitForServe) } + }; + protected override Dictionary GetSubsystemSolverTypeMappings() + { + return _typeToMealSolver; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver.cs.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver.cs.meta new file mode 100644 index 000000000..f0fbded31 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 391c551614be4f21a2e700f44569e92a +timeCreated: 1756176491 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForOrder.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForOrder.cs new file mode 100644 index 000000000..59236cb16 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForOrder.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +namespace DDD +{ + public class RestaurantMealSolver_WaitForOrder : MonoBehaviour, IInteractionSubsystemSolver + { + public bool ExecuteInteractionSubsystem(IInteractor interactor, IInteractable interactable, ScriptableObject causerPayload = null, ScriptableObject targetPayloadSo = null) + { + return true; + } + + public bool CanExecuteInteractionSubsystem(IInteractor interactor = null, IInteractable interactable = null, + ScriptableObject causerPayload = null, ScriptableObject targetPayloadSo = null) + { + + return true; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForOrder.cs.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForOrder.cs.meta new file mode 100644 index 000000000..b77d17fa1 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForOrder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cff2611181194e4a92576bdbcead4fad +timeCreated: 1756181225 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForServe.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForServe.cs new file mode 100644 index 000000000..86851c9f0 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForServe.cs @@ -0,0 +1,18 @@ +using UnityEngine; + +namespace DDD +{ + public class RestaurantMealSolver_WaitForServe : MonoBehaviour, IInteractionSubsystemSolver + { + public bool ExecuteInteractionSubsystem(IInteractor interactor, IInteractable interactable, ScriptableObject causerPayload = null, ScriptableObject targetPayloadSo = null) + { + return true; + } + + public bool CanExecuteInteractionSubsystem(IInteractor interactor = null, IInteractable interactable = null, + ScriptableObject causerPayload = null, ScriptableObject targetPayloadSo = null) + { + return true; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForServe.cs.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForServe.cs.meta new file mode 100644 index 000000000..4174d79c1 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantMeals/RestaurantMealSolver_WaitForServe.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e9292616267b4299a3d2e0d29c84f69b +timeCreated: 1756181667 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrderSolver.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver.cs similarity index 69% rename from Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrderSolver.cs rename to Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver.cs index 7f4019448..71d8149fa 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrderSolver.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver.cs @@ -5,22 +5,20 @@ namespace DDD { - public static class RestaurantOrderSolvers + public class RestaurantOrderSolver : RestaurantSubsystemSolver { - public static Dictionary TypeToOrderSolver = new() + private Dictionary _typeToOrderSolver = new() { { RestaurantOrderType.Wait, typeof(RestaurantOrderSolver_Wait) }, { RestaurantOrderType.Reserved, typeof(RestaurantOrderSolver_Reserved) }, { RestaurantOrderType.Order, typeof(RestaurantOrderSolver_Order) }, - { RestaurantOrderType.Serve, typeof(RestaurantOrderSolver_Serve) } + { RestaurantOrderType.Serve, typeof(RestaurantOrderSolver_Serve) }, + { RestaurantOrderType.Busy, typeof(RestaurantOrderSolver_Busy) }, + { RestaurantOrderType.Dirty, typeof(RestaurantOrderSolver_Dirty) } }; - } - - public class RestaurantOrderSolver : RestaurantSubsystemSolver - { protected override Dictionary GetSubsystemSolverTypeMappings() { - return RestaurantOrderSolvers.TypeToOrderSolver; + return _typeToOrderSolver; } } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrderSolver.cs.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver.cs.meta similarity index 100% rename from Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrderSolver.cs.meta rename to Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver.cs.meta diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Busy.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Busy.cs new file mode 100644 index 000000000..a53ef8b77 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Busy.cs @@ -0,0 +1,21 @@ +using UnityEngine; + +namespace DDD.RestaurantOrders +{ + public class RestaurantOrderSolver_Busy : MonoBehaviour, IInteractionSubsystemSolver + { + public bool ExecuteInteractionSubsystem(IInteractor interactor, IInteractable interactable, + ScriptableObject causerPayload = null, ScriptableObject targetPayloadSo = null) + { + // TODO : DO SOMETHING!!! + return true; + } + + public bool CanExecuteInteractionSubsystem(IInteractor interactor = null, IInteractable interactable = null, + ScriptableObject causerPayload = null, ScriptableObject targetPayloadSo = null) + { + // TODO : DO SOMETHING!!! + return true; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Busy.cs.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Busy.cs.meta new file mode 100644 index 000000000..c51efc3cf --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Busy.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c185b3957ffe47088703be10e709ff66 +timeCreated: 1755761370 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Dirty.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Dirty.cs new file mode 100644 index 000000000..8819bfe60 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Dirty.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +namespace DDD.RestaurantOrders +{ + public class RestaurantOrderSolver_Dirty : MonoBehaviour, IInteractionSubsystemSolver + { + public bool ExecuteInteractionSubsystem(IInteractor interactor, IInteractable interactable, ScriptableObject causerPayload = null, ScriptableObject targetPayloadSo = null) + { + // TODO : DO SOMETHING!!! + return true; + } + + public bool CanExecuteInteractionSubsystem(IInteractor interactor = null, IInteractable interactable = null, + ScriptableObject causerPayload = null, ScriptableObject targetPayloadSo = null) + { + return true; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Dirty.cs.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Dirty.cs.meta new file mode 100644 index 000000000..07cdfe4f7 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Dirty.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b97bc6ce36df4e05a4d329f11daef43f +timeCreated: 1755761294 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Reserved.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Reserved.cs index 7965b8303..5f6fa57dd 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Reserved.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Reserved.cs @@ -12,7 +12,8 @@ public bool ExecuteInteractionSubsystem(IInteractor interactor, IInteractable in public bool CanExecuteInteractionSubsystem(IInteractor interactor = null, IInteractable interactable = null, ScriptableObject causerPayload = null, ScriptableObject targetPayloadSo = null) { - return true; + // Interactable's CurrentInteractor is me? => Can execute + return false; } } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Wait.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Wait.cs index 2596959bd..c1f980df2 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Wait.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrders/RestaurantOrderSolver_Wait.cs @@ -1,3 +1,4 @@ +using Opsive.BehaviorDesigner.Runtime.Tasks; using UnityEngine; namespace DDD.RestaurantOrders @@ -6,7 +7,12 @@ public class RestaurantOrderSolver_Wait : MonoBehaviour, IInteractionSubsystemSo { public bool ExecuteInteractionSubsystem(IInteractor interactor, IInteractable interactable, ScriptableObject causerPayload = null, ScriptableObject targetPayloadSo = null) { + if (CanExecuteInteractionSubsystem(interactor, interactable, causerPayload, targetPayloadSo) == false) return false; // TODO : DO SOMETHING!!! + /* TODO + * OnInteracted์—์„œ ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๋Œ€์‹ , ์—ฌ๊ธฐ์„œ ์ง์ ‘ ๋ฐ”๊ฟ”์ฃผ๊ณ , ํ˜„์žฌ ๋‚˜์—๊ฒŒ ์ ์œ ๋˜์–ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๋ ค์ฃผ๊ธฐ? ๊ทธ๋ฆฌ๊ณ  CanInteractTo์—์„œ ์ด๊ฒŒ ์ผ์น˜ํ•ด์•ผ๋งŒ ์ฐธ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ? + * ํ•„์š”ํ•˜๋‹ค๋ฉด IInteractable ์ธํ„ฐํŽ˜์ด์Šค์— CurrentInteractor๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ• ์ˆ˜๋„? + */ return true; } diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantSubsystemSolver.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantSubsystemSolver.cs index af3ce4124..34e190d8b 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantSubsystemSolver.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantSubsystemSolver.cs @@ -10,7 +10,7 @@ public abstract class RestaurantSubsystemSolver : MonoBehaviour, IInteraction protected abstract Dictionary GetSubsystemSolverTypeMappings(); - private void Start() + private void Awake() { foreach (var subsystemSolverType in GetSubsystemSolverTypeMappings()) { diff --git a/Assets/_DDD/_Scripts/RestaurantState/FlowStates/RestaurantCustomerState.cs b/Assets/_DDD/_Scripts/RestaurantState/FlowStates/RestaurantCustomerState.cs index 0c326a38b..b18f09bbe 100644 --- a/Assets/_DDD/_Scripts/RestaurantState/FlowStates/RestaurantCustomerState.cs +++ b/Assets/_DDD/_Scripts/RestaurantState/FlowStates/RestaurantCustomerState.cs @@ -1,9 +1,106 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Opsive.BehaviorDesigner.Runtime; using Sirenix.OdinInspector; using UnityEngine; +using UnityEngine.AddressableAssets; +using UnityEngine.ResourceManagement.AsyncOperations; namespace DDD { public class RestaurantCustomerState : ScriptableObject { + private Dictionary _loadedSubtrees = new Dictionary(); + private Dictionary> _subtreeHandles = new Dictionary>(); + + public async Task LoadCustomerBehaviorData() + { + var customerData = RestaurantData.Instance?.CustomerData; + if (customerData?.CustomerBehaviorData == null) + { + Debug.LogError("[RestaurantCustomerState] RestaurantCustomerData or CustomerBehaviorData is null"); + return; + } + + var loadTasks = new List(); + foreach (var behaviorPair in customerData.CustomerBehaviorData) + { + var customerType = behaviorPair.Key; + var subtreeReference = behaviorPair.Value; + + if (_loadedSubtrees.ContainsKey(customerType)) + continue; // Already loaded + + loadTasks.Add(LoadSubtreeAsync(customerType, subtreeReference)); + } + + await Task.WhenAll(loadTasks); + Debug.Log($"[RestaurantCustomerState] Loaded {_loadedSubtrees.Count} customer behavior subtrees"); + } + + private async Task LoadSubtreeAsync(CustomerType customerType, AssetReference subtreeReference) + { + var handle = Addressables.LoadAssetAsync(subtreeReference); + _subtreeHandles[customerType] = handle; + + await handle.Task; + + if (handle.Result != null) + { + _loadedSubtrees[customerType] = handle.Result; + Debug.Log($"[RestaurantCustomerState] Loaded subtree for {customerType}"); + } + else + { + Debug.LogError($"[RestaurantCustomerState] Failed to load subtree for {customerType}"); + } + } + + public void UnloadCustomerBehaviorData() + { + foreach (var handle in _subtreeHandles.Values) + { + if (handle.IsValid()) + { + Addressables.Release(handle); + } + } + + _loadedSubtrees.Clear(); + _subtreeHandles.Clear(); + Debug.Log("[RestaurantCustomerState] Unloaded all customer behavior subtrees"); + } + + public Subtree GetLoadedSubtree(CustomerType customerType) + { + _loadedSubtrees.TryGetValue(customerType, out var subtree); + return subtree; + } + + public async Task GetOrLoadSubtree(CustomerType customerType) + { + if (IsSubtreeLoaded(customerType)) + { + return GetLoadedSubtree(customerType); + } + else + { + var customerData = RestaurantData.Instance?.CustomerData; + if (customerData?.CustomerBehaviorData == null || + !customerData.CustomerBehaviorData.TryGetValue(customerType, out var subtreeReference)) + { + Debug.LogError($"[RestaurantCustomerState] No behavior data found for {customerType}"); + return null; + } + + await LoadSubtreeAsync(customerType, subtreeReference); + return GetLoadedSubtree(customerType); + } + } + + public bool IsSubtreeLoaded(CustomerType customerType) + { + return _loadedSubtrees.ContainsKey(customerType); + } } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantState/FlowStates/RestaurantEnvironmentState.cs b/Assets/_DDD/_Scripts/RestaurantState/FlowStates/RestaurantEnvironmentState.cs index 75313179a..afb94720d 100644 --- a/Assets/_DDD/_Scripts/RestaurantState/FlowStates/RestaurantEnvironmentState.cs +++ b/Assets/_DDD/_Scripts/RestaurantState/FlowStates/RestaurantEnvironmentState.cs @@ -21,5 +21,54 @@ public class RestaurantEnvironmentState : ScriptableObject { public List Props = new List(); public List Objects = new List(); + + // ์ธํ„ฐ๋ž™์…˜ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด(IInteractable)๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ (๋Ÿฐํƒ€์ž„ ์ „์šฉ) + private readonly List _registeredInteractables = new List(); + + /// + /// ์ธํ„ฐ๋ž™์…˜ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค + /// + public void RegisterInteractable(IInteractable interactable) + { + if (interactable == null) return; + if (_registeredInteractables.Contains(interactable)) return; + _registeredInteractables.Add(interactable); + } + + /// + /// ์ธํ„ฐ๋ž™์…˜ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค + /// + public void UnregisterInteractable(IInteractable interactable) + { + if (interactable == null) return; + _registeredInteractables.Remove(interactable); + } + + /// + /// ํŠน์ • InteractionType์— ํ•ด๋‹นํ•˜๋Š” ์ธํ„ฐ๋ž™์…˜ ๊ฐ์ฒด๋“ค์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค + /// + public List GetInteractablesByType(InteractionType interactionType) + { + var result = new List(); + // null ๋˜๋Š” Destroyed ์˜ค๋ธŒ์ ํŠธ ์ •๋ฆฌ + _registeredInteractables.RemoveAll(item => item == null || (item as UnityEngine.Object) == null); + foreach (var interactable in _registeredInteractables) + { + if (interactable.GetInteractionType() == interactionType) + { + result.Add(interactable); + } + } + return result; + } + + /// + /// ๋ชจ๋“  ๋“ฑ๋ก๋œ ์ธํ„ฐ๋ž™์…˜ ๊ฐ์ฒด๋“ค์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค + /// + public List GetAllInteractables() + { + _registeredInteractables.RemoveAll(item => item == null || (item as UnityEngine.Object) == null); + return new List(_registeredInteractables); + } } } \ No newline at end of file diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index ed8485fa0..b1d747c7b 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f86abe14bf9fc4c7c93dfa96efd110ef0f56c3fb96a952c57e06a723fc87c352 +oid sha256:5d69f9ac4352f59df16943fd905dd7351328f295b2a8e4f74e8346f7bd4dc1bc size 1075 diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index 04c98086f..63e0e52b4 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:79fb0bf613721f4ea379a4d4434fa621933ea25eeb09ee4cb3878ca462a07077 -size 623 +oid sha256:411a0243cb87e0bcd8781e3198ba1f82af7279c14555e3b2db93884f5b7ea700 +size 636