agv 개발

This commit is contained in:
logonkhi
2025-06-20 17:37:20 +09:00
parent 45c420e54e
commit f79372b4de
31 changed files with 1374 additions and 373 deletions

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 32fc15a19aea4e944a5ebe70369dc9f1
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,123 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1373625414374435398
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 302300799186228596}
- component: {fileID: 3334192809676350191}
- component: {fileID: 3820258601269832329}
- component: {fileID: 363746616583149630}
- component: {fileID: 5360656424770899642}
m_Layer: 0
m_Name: AGV
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &302300799186228596
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1373625414374435398}
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!114 &3334192809676350191
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1373625414374435398}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 80f19a8fc3a570b46b06e92624a35168, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!33 &3820258601269832329
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1373625414374435398}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &363746616583149630
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1373625414374435398}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!65 &5360656424770899642
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1373625414374435398}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 3fcd49146913c384a83fb6b66d12a6be
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,485 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &209588111703964022
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6308980257678838100}
- component: {fileID: 8580156107207182552}
- component: {fileID: 3482114677775640430}
- component: {fileID: 5925304901667948221}
- component: {fileID: 4476381635256212251}
m_Layer: 5
m_Name: CloseButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6308980257678838100
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 209588111703964022}
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: 4802890858156259540}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -2, y: -2}
m_SizeDelta: {x: 15, y: 15}
m_Pivot: {x: 1, y: 1}
--- !u!222 &8580156107207182552
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 209588111703964022}
m_CullTransparentMesh: 1
--- !u!114 &3482114677775640430
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 209588111703964022}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 2a6f4806a91ca284d8e69a90e2a2b624, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &5925304901667948221
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 209588111703964022}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 3482114677775640430}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!114 &4476381635256212251
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 209588111703964022}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2480dc463c63bf945a9488183ffe66d0, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &1267781917027001920
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7383335062191980062}
- component: {fileID: 499287599624952086}
- component: {fileID: 7043762944741046396}
m_Layer: 5
m_Name: shadow
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7383335062191980062
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1267781917027001920}
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: 4802890858156259540}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 10, y: 10}
m_Pivot: {x: 0, y: 1}
--- !u!222 &499287599624952086
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1267781917027001920}
m_CullTransparentMesh: 1
--- !u!114 &7043762944741046396
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1267781917027001920}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 887145076, guid: 4cf3568ca3f55f64cb11447d139d7a3d, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &4884066667293879814
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2993317773174661490}
- component: {fileID: 3985546264066459972}
- component: {fileID: 240088877097151846}
m_Layer: 5
m_Name: bg
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2993317773174661490
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4884066667293879814}
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: 4802890858156259540}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!222 &3985546264066459972
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4884066667293879814}
m_CullTransparentMesh: 1
--- !u!114 &240088877097151846
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4884066667293879814}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: -27720893, guid: e5829cbc100001646956a9c3ed4e33c5, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &4907041631117111019
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4802890858156259540}
- component: {fileID: 7623125061856383678}
- component: {fileID: 3914245719037572856}
m_Layer: 5
m_Name: InfoWindow
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4802890858156259540
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4907041631117111019}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7383335062191980062}
- {fileID: 2993317773174661490}
- {fileID: 6308980257678838100}
- {fileID: 6685372230643413407}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 100, y: 150}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7623125061856383678
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4907041631117111019}
m_CullTransparentMesh: 1
--- !u!114 &3914245719037572856
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4907041631117111019}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 620e52b408949c340adef1110323cb7c, type: 3}
m_Name:
m_EditorClassIdentifier:
infoText: {fileID: 4202672738064507978}
closeButton: {fileID: 5925304901667948221}
worldOffset: {x: 0, y: 1.5, z: 0}
--- !u!1 &7346391167643616437
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6685372230643413407}
- component: {fileID: 9166711732528497215}
- component: {fileID: 4202672738064507978}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6685372230643413407
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7346391167643616437}
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: 4802890858156259540}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -7.5}
m_SizeDelta: {x: -10, y: -25}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9166711732528497215
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7346391167643616437}
m_CullTransparentMesh: 1
--- !u!114 &4202672738064507978
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7346391167643616437}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: New Text
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2}
m_sharedMaterial: {fileID: 4860575619018115804, guid: 08cebd004d97ca742ac80400f37f4eed, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4278190080
m_fontColor: {r: 0, g: 0, b: 0, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 10
m_fontSizeBase: 10
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 4
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 036e56b4c097fc8409ffced10ff53562
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -119,6 +119,50 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &27812497
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 27812499}
- component: {fileID: 27812498}
m_Layer: 0
m_Name: AGVManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &27812498
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 27812497}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e3a4e2d3e90ee0d4387588358f34e018, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &27812499
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 27812497}
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!1 &88083290
GameObject:
m_ObjectHideFlags: 0
@@ -572,6 +616,7 @@ RectTransform:
- {fileID: 1379798063}
- {fileID: 945196059}
- {fileID: 1506231961}
- {fileID: 1865387592}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -589,6 +634,7 @@ GameObject:
m_Component:
- component: {fileID: 632541407}
- component: {fileID: 632541408}
- component: {fileID: 632541409}
m_Layer: 0
m_Name: AppMain
m_TagString: Untagged
@@ -623,6 +669,18 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: ccb57283566667d45924328b93aeb7f4, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &632541409
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 632541406}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 621ed7b485f821040890dfe3f6211461, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &769109585
PrefabInstance:
m_ObjectHideFlags: 0
@@ -810,8 +868,7 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1567574161}
m_Children: []
m_Father: {fileID: 1561871830}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
@@ -1206,250 +1263,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1561871829}
m_CullTransparentMesh: 1
--- !u!1 &1567574160
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1567574161}
- component: {fileID: 1567574163}
- component: {fileID: 1567574162}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1567574161
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1567574160}
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: 1101428665}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1567574162
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1567574160}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: X
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!222 &1567574163
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1567574160}
m_CullTransparentMesh: 1
--- !u!1 &1573195671
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1573195675}
- component: {fileID: 1573195674}
- component: {fileID: 1573195673}
- component: {fileID: 1573195672}
m_Layer: 0
m_Name: Cube
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!65 &1573195672
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1573195671}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &1573195673
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1573195671}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &1573195674
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1573195671}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &1573195675
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1573195671}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -1.194, 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!1001 &1840728471
PrefabInstance:
m_ObjectHideFlags: 0
@@ -1775,6 +1588,108 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
--- !u!224 &1865387592 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
m_PrefabInstance: {fileID: 2046556551915540031}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &2046556551915540031
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 483439351}
m_Modifications:
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_Pivot.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_Pivot.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_AnchorMax.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_AnchorMax.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_AnchorMin.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_AnchorMin.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_SizeDelta.x
value: 100
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_SizeDelta.y
value: 150
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4802890858156259540, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4907041631117111019, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
propertyPath: m_Name
value: InfoWindow
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 036e56b4c097fc8409ffced10ff53562, type: 3}
--- !u!1001 &8261569461642068635
PrefabInstance:
m_ObjectHideFlags: 0
@@ -1884,7 +1799,7 @@ SceneRoots:
- {fileID: 410087041}
- {fileID: 832575519}
- {fileID: 632541407}
- {fileID: 27812499}
- {fileID: 483439351}
- {fileID: 88083293}
- {fileID: 1840728471}
- {fileID: 1573195675}

View File

@@ -1,55 +1,59 @@
using System.Collections.Generic;
using System;
using UnityEngine;
using UVC.Core;
using UVC.Data;
using UVC.Log;
using UVC.network;
using UVC.Network;
using UVC.Tests;
using UVC.UI.Modal;
using UVC.UI.Tooltip;
namespace SampleProject
{
public class AppMain : MonoBehaviour
public class AppMain : SingletonApp<AppMain>
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
async void Start()
{
Canvas rootCanvas = GameObject.FindFirstObjectByType<Canvas>();
public Action Initialized;
private MQTTPipeLine mqttPipeLine;
public MQTTPipeLine MQTTPipeLine => mqttPipeLine;
/// <summary>
/// 초기 화 메서드입니다.
/// Awake 메서드에서 호출되며, MonoBehaviour가 생성될 때 한 번만 실행됩니다.
/// </summary>
protected override void Init()
{
Canvas rootCanvas = GameObject.FindFirstObjectByType<Canvas>();
if (rootCanvas != null && !TooltipManager.Instance.IsInitialized) TooltipManager.Instance.Initialize(rootCanvas.transform, rootCanvas);
SetNetworkInfo();
if (Initialized != null)
{
Initialized.Invoke();
}
}
void Start()
{
//Tester.RunAllTests();
}
//URLList.Add("baseinfo", "http://localhost:8888/baseinfo/00:00");
//URLList.Add("AGV", "http://localhost:8888/AGV/00:00");
//URLList.Add("STOCKER_STACK", "http://localhost:8888/STOCKER_STACK/00:00");
//URLList.Add("CARRIER", "http://localhost:8888/CARRIER/00:00");
//URLList.Add("EQUIPMENT", "http://localhost:8888/EQUIPMENT/00:00");
//URLList.Add("PORT", "http://localhost:8888/PORT/00:00");
//URLList.Add("RACK", "http://localhost:8888/RACK/00:00");
//URLList.Add("TWIN_FORK", "http://localhost:8888/TWIN_FORK/00:00");
//URLList.Add("HVC_PLC", "http://localhost:8888/HVC_PLC/00:00");
//URLList.Add("HVC_CRANE", "http://localhost:8888/HVC_CRANE/00:00");
//URLList.Add("ALARM", "http://localhost:8888/ALARM/00:00");
//URLList.Add("Dashboard", "http://localhost:8888/Dashboard/00:00");
//URLList.Add("SIMULATION_RANK", "http://localhost:8888/SIMULATION_RANK/00:00");
private void SetNetworkInfo()
{
URLList.Add("baseinfo", "http://localhost:8888/baseinfo/00:00");
URLList.Add("AGV", "http://localhost:8888/AGV/00:00");
URLList.Add("STOCKER_STACK", "http://localhost:8888/STOCKER_STACK/00:00");
URLList.Add("CARRIER", "http://localhost:8888/CARRIER/00:00");
URLList.Add("EQUIPMENT", "http://localhost:8888/EQUIPMENT/00:00");
URLList.Add("PORT", "http://localhost:8888/PORT/00:00");
URLList.Add("RACK", "http://localhost:8888/RACK/00:00");
URLList.Add("TWIN_FORK", "http://localhost:8888/TWIN_FORK/00:00");
URLList.Add("HVC_PLC", "http://localhost:8888/HVC_PLC/00:00");
URLList.Add("HVC_CRANE", "http://localhost:8888/HVC_CRANE/00:00");
URLList.Add("ALARM", "http://localhost:8888/ALARM/00:00");
URLList.Add("Dashboard", "http://localhost:8888/Dashboard/00:00");
URLList.Add("SIMULATION_RANK", "http://localhost:8888/SIMULATION_RANK/00:00");
//Dictionary<string, string> headers = new Dictionary<string, string>();
//headers.Add("Content-Encoding", "gzip");
//string result = await HttpRequester.RequestPost<string>("http://localhost:8888/AGV/00:00", (string)null, headers);
//ULog.Debug($"AGV Result: {result}");
//MQTTService mqttService = new MQTTService("localhost", 1883);
//mqttService.AddTopicHandler("AGV", (topic, message) =>
//{
// ULog.Debug($"Received message on topic {topic}: {message}");
//});
//mqttService.Connect();
mqttPipeLine = new MQTTPipeLine("localhost", 1883);
mqttPipeLine.AddTopic("AGV");
mqttPipeLine.Execute();
}
}

View File

@@ -2,7 +2,7 @@
{
public static class Constants
{
public static string MQTT_DOMAIN = "localshot";
public static string MQTT_DOMAIN = "localhost";
public static int MQTT_PORT = 1883;
}
}

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UVC.Core;
namespace SampleProject
{
public class SceneMain: SingletonScene<SceneMain>
{
public Action Initialized;
/// <summary>
/// 초기 화 메서드입니다.
/// Awake 메서드에서 호출되며, MonoBehaviour가 생성될 때 한 번만 실행됩니다.
/// </summary>
protected override void Init()
{
AppMain.Instance.Initialized += OnAppInitialized;
}
private void OnAppInitialized()
{
if (Initialized != null)
{
Initialized.Invoke();
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 621ed7b485f821040890dfe3f6211461

View File

@@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using UnityEngine;
using UVC.Extention;
using UVC.Log;
@@ -470,7 +471,7 @@ namespace UVC.Data
changedProperies.Clear();
foreach (var keyValue in (DataObject)other)
{
if (!this.ContainsKey(keyValue.Key) || !this[keyValue.Key].Equals(keyValue.Value))
if (!this.ContainsKey(keyValue.Key) || this[keyValue.Key] != keyValue.Value)
{
this[keyValue.Key] = keyValue.Value;
changedProperies.Add(keyValue.Key);

View File

@@ -18,6 +18,49 @@ namespace UVC.Data
/// 해당 메시지를 지정된 데이터 매퍼를 통해 변환한 후 핸들러에게 전달합니다.
/// 여러 MQTT 토픽을 동시에 관리하고 각각에 대한 처리 방식을 개별적으로 설정할 수 있습니다.
/// </remarks>
/// <example>
/// <code>
/// // 1. 데이터 구조를 정의하는 DataMask 생성
/// var dataMask = new DataMask();
/// dataMask["deviceId"] = "";
/// dataMask["temperature"] = 0.0;
/// dataMask["humidity"] = 0.0;
/// dataMask["timestamp"] = DateTime.Now;
///
/// // 2. DataMapper 생성
/// var dataMapper = new DataMapper(dataMask);
///
/// // 3. 데이터 처리 핸들러 정의
/// Action<IDataObject?> dataHandler = (data) =>
/// {
/// if (data != null)
/// {
/// // 데이터 처리 로직
/// Console.WriteLine($"Received data: {data.ToJson()}");
/// }
/// };
///
/// // 4. MQTTPipeLineInfo 생성 및 설정
/// var pipelineInfo = new MQTTPipeLineInfo("sensor/+/data")
/// .setDataMapper(dataMapper)
/// .setHandler(dataHandler);
///
/// // 5. MQTTPipeLine 인스턴스 생성
/// var mqttPipeline = new MQTTPipeLine("mqtt.eclipseprojects.io", 1883);
///
/// // 6. 파이프라인 정보 추가
/// mqttPipeline.Add(pipelineInfo);
///
/// // 7. 파이프라인 실행
/// mqttPipeline.Execute();
///
/// // ... 애플리케이션 로직 수행 ...
///
/// // 8. 파이프라인 중지 및 리소스 해제
/// mqttPipeline.Stop();
/// mqttPipeline.Dispose();
/// </code>
/// </example>
public class MQTTPipeLine
{
@@ -40,6 +83,8 @@ namespace UVC.Data
/// </summary>
public int port;
private List<string> topics = new List<string>();
/// <summary>
/// 토픽별 파이프라인 정보를 저장하는 딕셔너리
/// </summary>
@@ -61,10 +106,24 @@ namespace UVC.Data
{
this.domain = string.IsNullOrEmpty(domain) ? Constants.MQTT_DOMAIN : domain;
this.port = port;
mqtt = new MQTTService(Constants.MQTT_DOMAIN, Constants.MQTT_PORT);
mqtt = new MQTTService(this.domain, this.port);
infoList = new Dictionary<string, MQTTPipeLineInfo>();
}
/// <summary>
/// 컬렉션에 주제가 없으면 추가합니다.
/// </summary>
/// <remarks>이 메서드는 컬렉션에 중복된 주제가 추가되지 않도록 합니다. 지정된 주제가 이미 있으면
/// 컬렉션은 변경되지 않습니다.</remarks>
/// <param name="topic">컬렉션에 추가할 주제입니다. null이거나 비어 있을 수 없습니다.</param>
public void AddTopic(string topic)
{
if (!topics.Contains(topic))
{
topics.Add(topic);
}
}
/// <summary>
/// 토픽에 대한 파이프라인 정보를 추가합니다.
/// </summary>
@@ -103,7 +162,7 @@ namespace UVC.Data
{
if (!UseMockup)
{
foreach (var topic in infoList.Keys)
foreach (var topic in topics)
{
mqtt.AddTopicHandler(topic, OnTopicMessage);
}

View File

@@ -14,6 +14,12 @@ namespace UVC.Data
/// </remarks>
/// <example>
/// <code>
/// var dataMask = new DataMask();
/// dataMask["deviceId"] = "";
/// dataMask["temperature"] = 0.0;
/// dataMask["humidity"] = 0.0;
/// dataMask["timestamp"] = DateTime.Now;
///
/// var pipelineInfo = new MQTTPipeLineInfo("device/status")
/// .setDataMapper(new DataMapper(dataMask))
/// .setHandler(data => Console.WriteLine(data));

View File

@@ -14,6 +14,7 @@ namespace UVC.Data
/// URL을 저장하는 내부 Dictionary 컬렉션
/// </summary>
private static Dictionary<string, string> urls = new Dictionary<string, string>();
public static IReadOnlyDictionary<string, string> Urls => urls;
/// <summary>
/// 지정된 키와 URL을 컬렉션에 추가합니다. 키가 이미 존재하면 URL을 업데이트합니다.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 389dc5701e61e5b49b6504ff46501a0c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UVC.Data;
namespace UVC.Factory
{
public class AGV: FactoryObject
{
private void Start()
{
DataOrderedMask = new List<string>
{
"Name",
"Type",
"Status",
"BatteryLevel",
"Location",
"LastMaintenance"
};
}
/// <summary>
/// 내부 상태를 업데이트하고 정렬된 마스크에 정의된 특정 키에 대한 작업을 수행하여 제공된 데이터 객체를 처리합니다.
// </summary>
/// <remarks>이 메서드는 초기화되지 않은 경우 내부 데이터 상태를 업데이트하고, 제공된
/// <see cref="DataOrderedMask"/>에 정의된 키를 반복하여 제공된
/// <paramref name="newData"/> 객체의 일치하는 항목에 대한 작업을 수행합니다. <paramref name="newData"/>에 처리에 필요한 키가 포함되어 있는지
/// 확인합니다.</remarks>
/// <param name="newData">처리할 데이터 객체입니다. null이 아니어야 하며 정렬된 마스크와 관련된 키-값 쌍을 포함해야 합니다.
protected override void ProcessData(DataObject newData)
{
if (data == null)
{
UpdatePositionAndRotation(newData);
data = newData;
}
else
{
UpdatePositionAndRotation(newData);
foreach (var keyValue in newData)
{
if (data.ContainsKey(keyValue.Key))
{
data[keyValue.Key] = keyValue.Value;
}
}
}
}
private void UpdatePositionAndRotation(DataObject newData)
{
if (data == null)
{
float x = newData.GetFloat("X") * .001f;
float y = newData.GetFloat("Y") * .001f;
Quaternion rotation = Quaternion.Euler(0, newData.GetFloat("DEGREE"), 0);
transform.position = new Vector3(x, 0, y);
transform.rotation = rotation;
}
else
{
float x = data.GetFloat("X") * .001f;
float y = data.GetFloat("Y") * .001f;
Quaternion rotation = Quaternion.Euler(0, data.GetFloat("DEGREE"), 0);
float x2 = newData.GetFloat("X") * .001f;
float y2 = newData.GetFloat("Y") * .001f;
Quaternion rotation2 = Quaternion.Euler(0, newData.GetFloat("DEGREE"), 0);
if (x != x2 || y != y2) transform.position = new Vector3(x, 0, y);
if (rotation != rotation2) transform.rotation = rotation;
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 80f19a8fc3a570b46b06e92624a35168

View File

@@ -0,0 +1,160 @@
#nullable enable
using Cysharp.Threading.Tasks;
using SampleProject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using UnityEngine;
using UVC.Core;
using UVC.Data;
namespace UVC.Factory
{
public class AGVManager : SingletonScene<AGVManager>
{
private readonly string prefabPath = "Prefabs/SampleProject/Factory/AGV";
private GameObject? prefab;
private List<AGV> agvList;
/// <summary>
/// AGVManager의 초기화 메서드입니다.
/// Awake 메서드에서 호출되며, MonoBehaviour가 생성될 때 한 번만 실행됩니다.
/// </summary>
protected override void Init()
{
agvList = new List<AGV>();
SceneMain.Instance.Initialized += OnSceneInitialized;
}
private void OnSceneInitialized()
{
//데이터를 어떤 형식으로 받을지 정의합니다.
var dataMask = new DataMask();
dataMask["VHL_NAME"] = "";
dataMask["AGV_IDX"] = "";
dataMask["B_INSTALL"] = "";
dataMask["NODE_ID"] = "";
dataMask["REAL_ID"] = "";
dataMask["VHL_STATE"] = "";
dataMask["BAY_LIST"] = "";
dataMask["X"] = 0;
dataMask["Y"] = 0;
dataMask["DEGREE"] = 0.0;
dataMask["MODE"] = "";
dataMask["BATT"] = "";
dataMask["SUB_GOAL"] = "";
dataMask["FINAL_GOAL"] = "";
dataMask["JOB_ID"] = "";
dataMask["TIMESTAMP"] = DateTime.Now;
var pipelineInfo = new MQTTPipeLineInfo("AGV")
.setDataMapper(new DataMapper(dataMask))
.setHandler(OnUpdateData);
// MQTTPipeLine에 파이프라인 정보를 추가합니다.
AppMain.Instance.MQTTPipeLine.Add(pipelineInfo);
}
public void OnUpdateData(IDataObject? data)
{
OnUpdateDataAsync(data).Forget();
}
/// <summary>
/// 기존 데이터와 비교하여 변경된 부분만 전달 됩니다.
/// </summary>
/// <param name="data"></param>
public async UniTask OnUpdateDataAsync(IDataObject? data)
{
if (data == null) return;
DataArray? arr = data as DataArray;
if (arr == null || arr.Count == 0) return;
var AddedItems = arr.AddedItems;
var RemovedItems = arr.RemovedItems;
var ModifiedList = arr.ModifiedList;
foreach (var item in AddedItems.ToList())
{
AGV? agv = await CreateAGV(item);
if(agv != null)
{
agvList.Add(agv);
}
}
foreach (var item in RemovedItems.ToList())
{
AGV agv = agvList.Find(x => x.Info != null && x.Info.Name == item.GetString("VHL_NAME"));
if (agv != null)
{
Destroy(agv.gameObject);
agvList.Remove(agv);
}
}
foreach (var item in ModifiedList.ToList())
{
AGV agv = agvList.Find(x => x.Info != null && x.Info.Name == item.GetString("VHL_NAME"));
if (agv != null)
{
agv.transform.position = new Vector3(
item.GetFloat("X") * .001f,
0,
item.GetFloat("Y") * .001f
);
agv.transform.rotation = Quaternion.Euler(0, item.GetFloat("DEGREE"), 0);
}
}
}
private async UniTask<AGV?> CreateAGV(DataObject data)
{
if(prefab == null)
{
prefab = await Resources.LoadAsync<GameObject>(prefabPath) as GameObject;
if (prefab == null)
{
Debug.LogError($"Prefab not found at path: {prefabPath}");
return null;
}
}
GameObject prefabInstance = Instantiate(prefab, transform);
Debug.Log($"AGVManager: prefabInstance == null {prefabInstance == null}");
if (prefabInstance == null)
{
Debug.LogError("Failed to instantiate AGV prefab.");
return null;
}
var agv = prefabInstance.GetComponent<AGV>();
agv.Info = new FactoryObjectInfo(
data.GetString("VHL_NAME"),
data.GetString("NODE_ID"),
"",
"",
data.GetString("MODE")
);
agv.transform.position = new Vector3(
data.GetFloat("X") * .001f,
0,
data.GetFloat("Y") * .001f
);
agv.transform.rotation = Quaternion.Euler(0, data.GetFloat("DEGREE"), 0);
return agv;
}
protected override void OnDestroy()
{
base.OnDestroy();
AppMain.Instance.MQTTPipeLine.Remove("AGV");
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: e3a4e2d3e90ee0d4387588358f34e018

View File

@@ -2,42 +2,39 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UVC.Extention;
using UVC.Data;
using UVC.Object3d;
using UVC.UI.Info;
namespace UVC.Object3d
namespace UVC.Factory
{
/// <summary>
///
/// </summary>
public class FactoryObject : InteractiveObject
{
// InfoWindow 인스턴스에 대한 참조
protected InfoWindow infoWindow;
protected Camera mainCamera;
protected FactoryObjectInfo? factoryObjectInfo;
public FactoryObjectInfo? FactoryObjectInfo
protected FactoryObjectInfo? info;
public FactoryObjectInfo? Info
{
get => factoryObjectInfo;
get => info;
set
{
factoryObjectInfo = value;
info = value;
if (value != null)
{
// 객체의 이름을 GameObject의 이름으로 설정합니다.
// 객체의 이름을 GameObject의 이름으로 설정합니다.
gameObject.name = value.Name;
FactoryObjectManager.Instance.RegisterFactoryObject(this);
}
}
}
protected Dictionary<string, object> data = new Dictionary<string, object>();
protected DataObject? data;
protected List<string>? dataOrderedMask;
/// <summary>
/// InfoWindow에 표시할 데이터의 순서와 항목을 지정하는 마스크입니다.
/// </summary>
/// <summary>
/// InfoWindow에 표시할 데이터의 순서와 항목을 지정하는 마스크입니다.
/// </summary>
public List<string>? DataOrderedMask
{
get => dataOrderedMask;
@@ -47,19 +44,10 @@ namespace UVC.Object3d
}
}
private void Awake()
private void OnDestroy()
{
mainCamera = Camera.main;
// 씬에 있는 InfoWindow 인스턴스를 동적으로 찾습니다.
// FindObjectOfType은 씬에서 해당 타입의 활성화된 첫 번째 객체를 반환합니다.
infoWindow = InfoWindow.Create();
if (infoWindow == null)
{
Debug.LogError("씬에서 InfoWindow 컴포넌트를 찾을 수 없습니다. InfoWindow가 씬에 존재하고 활성화되어 있는지 확인해주세요.");
enabled = false; // infoWindow가 없으면 이 스크립트를 비활성화합니다.
}
FactoryObjectManager.Instance.UnregisterFactoryObject(Info!);
}
@@ -71,9 +59,9 @@ namespace UVC.Object3d
/// 사용 가능한 모든 데이터가 표시됩니다. 정보 창은 현재
/// 변환을 기준으로 배치됩니다.</remarks>
/// <param name="eventData">포인터 클릭과 관련된 이벤트 데이터입니다.</param>
public override void OnPointerClick(PointerEventData eventData)
public override void OnPointerClick(PointerEventData eventData)
{
if(!infoWindow.IsVisible && data != null && data.Count > 0)
if (data != null && data.Count > 0)
{
Dictionary<string, object> info = new Dictionary<string, object>();
// dataOrderedMask가 설정되어 있으면 해당 순서대로 정보를 가져옵니다.
@@ -92,28 +80,44 @@ namespace UVC.Object3d
// dataOrderedMask가 설정되어 있지 않으면 모든 데이터를 사용합니다.
info = new Dictionary<string, object>(data);
}
infoWindow.Show(transform, info);
InfoWindow.Instance.Show(transform, info);
}
}
/// <summary>
/// 변경된 데이터만 업데이트합니다.
/// </summary>
/// <param name="data"></param>
public void UpdateData(IDictionary<string, object> data)
/// <param name="newData"></param>
public void UpdateData(IDataObject? newData)
{
foreach (var kvp in data)
{
if (this.data.ContainsKey(kvp.Key))
{
this.data[kvp.Key] = kvp.Value;
}
else
{
this.data.Add(kvp.Key, kvp.Value);
}
}
if(newData == null) return;
DataObject? dataObject = newData as DataObject;
if (dataObject == null || dataObject.Count == 0) return;
ProcessData(dataObject);
}
/// <summary>
/// 지정된 데이터 객체를 처리합니다. 이 메서드는 파생 클래스에서 재정의되어
/// 사용자 지정 데이터 처리 로직을 구현하도록 설계되었습니다.
/// </summary>
/// <remarks>파생 클래스는 <paramref name="newData"/> 매개변수에 대한 특정 처리 동작을 제공하기 위해
/// 이 메서드를 재정의해야 합니다.
/// 사용하기 전에 매개변수의 유효성을 검사해야 합니다.</remarks>
/// <param name="newData">처리할 데이터 객체입니다. null일 수 없습니다.</param>
protected virtual void ProcessData(DataObject newData) {}
public Vector3 GetPosition(bool world = false)
{
if (!world) return transform.position;
return transform.TransformPoint(transform.position);
}
public Vector3 GetEntrancePosition(bool world = false)
{
if (!world) return transform.position;
return transform.TransformPoint(transform.position);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: e0c4eb9b7dc850e4b8446d36ed68ce07

View File

@@ -1,4 +1,4 @@
namespace UVC.Object3d
namespace UVC.Factory
{
public class FactoryObjectInfo
{

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 60693d3d20cd32e4eb8adc209cff38db

View File

@@ -0,0 +1,106 @@
#nullable enable
using System;
using System.Collections.Generic;
using UVC.Core;
namespace UVC.Factory
{
public class FactoryObjectManager : SingletonScene<FactoryObjectManager>
{
public Dictionary<FactoryObjectInfo, FactoryObject> FactoryObjects { get; private set; } = new Dictionary<FactoryObjectInfo, FactoryObject>();
public void RegisterFactoryObject(FactoryObject factoryObject)
{
if (factoryObject == null || factoryObject.Info == null)
{
throw new ArgumentNullException(nameof(factoryObject), "FactoryObject cannot be null.");
}
if (!FactoryObjects.ContainsKey(factoryObject.Info!))
{
FactoryObjects.Add(factoryObject.Info!, factoryObject);
}
}
public void UnregisterFactoryObject(FactoryObjectInfo factoryObjectInfo)
{
if (factoryObjectInfo == null)
{
throw new ArgumentNullException(nameof(factoryObjectInfo), "factoryObjectInfo cannot be null.");
}
FactoryObjects.Remove(factoryObjectInfo);
}
public FactoryObject? GetFactoryObject(FactoryObjectInfo factoryObjectInfo)
{
if (factoryObjectInfo == null)
{
throw new ArgumentNullException(nameof(factoryObjectInfo), "factoryObjectInfo cannot be null.");
}
FactoryObjects.TryGetValue(factoryObjectInfo, out var factoryObject);
return factoryObject;
}
public FactoryObject? FindByName(string name)
{
foreach (var kvp in FactoryObjects)
{
if (kvp.Key.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
{
return kvp.Value;
}
}
return null;
}
public FactoryObject? FindById(string id)
{
foreach (var kvp in FactoryObjects)
{
if (kvp.Key.Id.Equals(id, StringComparison.OrdinalIgnoreCase))
{
return kvp.Value;
}
}
return null;
}
public FactoryObject? FindByPosition(string position)
{
foreach (var kvp in FactoryObjects)
{
if (kvp.Key.Position.Equals(position, StringComparison.OrdinalIgnoreCase))
{
return kvp.Value;
}
}
return null;
}
public List<FactoryObject> FindByArea(string area)
{
List<FactoryObject> foundObjects = new List<FactoryObject>();
foreach (var kvp in FactoryObjects)
{
if (kvp.Key.Area.Equals(area, StringComparison.OrdinalIgnoreCase))
{
foundObjects.Add(kvp.Value);
}
}
return foundObjects;
}
public List<FactoryObject> FindByFloor(string floor)
{
List<FactoryObject> foundObjects = new List<FactoryObject>();
foreach (var kvp in FactoryObjects)
{
if (kvp.Key.Floor.Equals(floor, StringComparison.OrdinalIgnoreCase))
{
foundObjects.Add(kvp.Value);
}
}
return foundObjects;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 170d63a2fc580274a92e3eb05f43dc1a

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 06c8fe736f6ab0d4787d720284f536ea

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 88a40c66f1e6dad4daa5a1339bd1a0bb

View File

@@ -12,13 +12,9 @@ namespace UVC.UI.Info
/// 3D 객체를 따라다니며 정보를 표시하는 UI 창입니다.
/// 이 컴포넌트는 World Space Canvas 내의 UI 요소에 추가되어야 합니다.
/// </summary>
public class InfoWindow : MonoBehaviour
public class InfoWindow : SingletonScene<InfoWindow>
{
[Tooltip("InfoWindow의 프리팹")]
[SerializeField]
private static GameObject infoWindowPrefab;
[Tooltip("정보 텍스트를 표시할 UI 요소")]
[SerializeField]
private TextMeshProUGUI infoText;
@@ -34,30 +30,16 @@ namespace UVC.UI.Info
// 정보 창이 따라다닐 3D 객체의 Transform
private Transform? target;
// 메인 카메라 참조
private Camera mainCamera;
/// <summary>
/// 정보 창이 현재 화면에 표시되고 있는지 여부를 반환합니다.
/// </summary>
public bool IsVisible => gameObject.activeSelf;
/// <summary>
/// 정보 창을 생성하여 반환합니다.
/// </summary>
public static InfoWindow? Create()
{
if(infoWindowPrefab == null)
{
Debug.LogError("InfoWindow 프리팹이 할당되지 않았습니다. Inspector에서 할당해주세요.");
return null;
}
return Instantiate(infoWindowPrefab).GetComponent<InfoWindow>();
}
private void Awake()
protected override void Awake()
{
mainCamera = Camera.main;
base.Awake();
// 닫기 버튼이 할당되었으면 클릭 이벤트를 연결합니다.
if (closeButton != null)
@@ -79,9 +61,6 @@ namespace UVC.UI.Info
{
// 위치 업데이트
transform.position = target.position + worldOffset;
// 항상 카메라를 바라보도록 방향 업데이트 (빌보드 효과)
transform.rotation = mainCamera.transform.rotation;
}
}

View File

@@ -1,8 +1,8 @@
using Cysharp.Threading.Tasks;
#nullable enable
using Cysharp.Threading.Tasks;
using System; // System.Type 사용을 위해 추가
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
using UVC.Log;
namespace UVC.UI.Modal
@@ -55,6 +55,8 @@ namespace UVC.UI.Modal
/// </summary>
private const string DefaultBlockerPrefabPath = "Prefabs/UI/Modal/ModalBlocker";
private static GameObject? blockerPrefabObj;
/// <summary>
/// ✨ 모달아, 열려라! ✨
/// 이 마법 주문을 외치면 화면에 새로운 알림 상자(모달)가 뿅! 하고 나타나요.
@@ -124,7 +126,10 @@ namespace UVC.UI.Modal
// --- 투명 방패(Blocker) 준비 ---
CanvasGroup blockerCanvasGroup = null;
// 📜 이야기: '투명 방패' 디자인 파일을 불러와요. Resources.LoadAsync는 비동기(기다리지 않고 다음 일 하기)로 파일을 불러오는 마법이에요.
GameObject blockerPrefabObj = await Resources.LoadAsync<GameObject>(blockerPrefabPath) as GameObject;
if (blockerPrefabObj == null)
{
blockerPrefabObj = await Resources.LoadAsync<GameObject>(blockerPrefabPath) as GameObject;
}
if (blockerPrefabObj != null)
{
// 화면에서 가장 큰 그림판(Canvas)을 찾아서 그 위에 방패를 놓을 거예요.
@@ -147,7 +152,7 @@ namespace UVC.UI.Modal
// --- 모달 창(Modal) 준비 ---
// 📜 이야기: 이제 진짜 모달 창 디자인 파일을 불러올 차례예요. 이것도 비동기로!
GameObject modalPrefabObj = await Resources.LoadAsync<GameObject>(currentContent.PrefabPath) as GameObject;
GameObject? modalPrefabObj = await Resources.LoadAsync<GameObject>(currentContent.PrefabPath) as GameObject;
if (modalPrefabObj == null)
{
ULog.Error($"[Modal] 모달 프리팹을 다음 경로에서 찾을 수 없습니다: {currentContent.PrefabPath}");
@@ -185,7 +190,8 @@ namespace UVC.UI.Modal
// 그런 상황에 대비해서, 모달 창이 파괴될 때 자동으로 "취소"된 것처럼 처리하도록 등록해둬요.
// GetCancellationTokenOnDestroy()는 "이 게임 오브젝트가 파괴되면 알려줘!"라는 신호예요.
var modalDestroyToken = currentModalInstance.GetCancellationTokenOnDestroy();
modalDestroyToken.RegisterWithoutCaptureExecutionContext(async () => {
modalDestroyToken.RegisterWithoutCaptureExecutionContext(async () =>
{
// 이 코드는 모달 인스턴스가 파괴될 때 실행돼요.
// 만약 우리가 아직 결과를 기다리고 있는(Pending) 모달이었다면,
if (Modal.activeTcs == tcs && tcs.Task.Status == UniTaskStatus.Pending)

View File

@@ -55,6 +55,8 @@ namespace UVC.UI.Tooltip
protected string tooltipPrefabPath = "Prefabs/UI/Tooltip/Tooltip";
protected GameObject tooltipPrefab;
/// <summary>
/// Resources 폴더 내의 툴팁 UI 프리팹 경로입니다.
/// 상속을 통해 다른 경로를 사용하도록 재정의할 수 있습니다.
@@ -111,9 +113,12 @@ namespace UVC.UI.Tooltip
this.tooltipPrefabPath = tooltipPrefabPath; // 사용자 지정 경로가 제공되면 업데이트
}
GameObject loadedTooltipPrefab = Resources.Load<GameObject>(this.tooltipPrefabPath);
if (tooltipPrefab == null)
{
tooltipPrefab = Resources.Load<GameObject>(this.tooltipPrefabPath);
}
if (loadedTooltipPrefab == null)
if (tooltipPrefab == null)
{
Debug.LogError($"TooltipManager 초기화 실패: Resources 폴더에서 '{this.tooltipPrefabPath}' 경로의 프리팹을 로드할 수 없습니다.");
return;
@@ -123,7 +128,7 @@ namespace UVC.UI.Tooltip
_rootCanvas = rootCanvas;
// 툴팁 인스턴스 생성 및 초기화
_activeTooltipInstance = GameObject.Instantiate(loadedTooltipPrefab, _defaultParentTransform);
_activeTooltipInstance = GameObject.Instantiate(tooltipPrefab, _defaultParentTransform);
_tooltipTextElement = _activeTooltipInstance.GetComponentInChildren<TextMeshProUGUI>();
_tooltipRectTransform = _activeTooltipInstance.GetComponent<RectTransform>();

View File

@@ -22,7 +22,7 @@ namespace UVC.Util
public static GameObject GetGameObjectFromPrefabPath(this string prefabPath, Transform parent = null)
{
GameObject prefab = Resources.Load(prefabPath, typeof(GameObject)) as GameObject;
return UnityEngine.Object.Instantiate(prefab);
return UnityEngine.Object.Instantiate(prefab, parent);
}
@@ -42,8 +42,7 @@ namespace UVC.Util
public static T GetComponentFromPrefabPath<T>(this string prefabPath, Transform parent = null)
{
GameObject prefab = Resources.Load(prefabPath, typeof(GameObject)) as GameObject;
GameObject go = UnityEngine.Object.Instantiate(prefab);
if (parent != null) go.transform.SetParent(parent, false);
GameObject go = UnityEngine.Object.Instantiate(prefab, parent);
return go.GetComponent<T>();
}
}