playback 기능 추가

This commit is contained in:
logonkhi
2025-07-22 19:58:14 +09:00
parent cf97c6b61b
commit 4d29143d47
124 changed files with 15059 additions and 628 deletions

View File

Before

Width:  |  Height:  |  Size: 173 B

After

Width:  |  Height:  |  Size: 173 B

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -0,0 +1,868 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2133175076139784403
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5796655878833709733}
- component: {fileID: 484196154209350674}
- component: {fileID: 7184156021851962383}
m_Layer: 0
m_Name: selectedImage
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5796655878833709733
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2133175076139784403}
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: 2125078545845614351}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0.5, y: 0}
m_SizeDelta: {x: -3, y: -4}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &484196154209350674
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2133175076139784403}
m_CullTransparentMesh: 1
--- !u!114 &7184156021851962383
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2133175076139784403}
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: b7d31521a9c251446bd203fe7d09d878, 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 &2916604940895479352
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6418761242116767989}
- component: {fileID: 1193707551150000701}
- component: {fileID: 1024787892698960882}
m_Layer: 0
m_Name: text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6418761242116767989
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2916604940895479352}
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: 2125078545845614351}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 8, y: 0}
m_SizeDelta: {x: -38, y: 0}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &1193707551150000701
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2916604940895479352}
m_CullTransparentMesh: 1
--- !u!114 &1024787892698960882
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2916604940895479352}
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: 23 ~ 24 Hour
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: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, 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: 14
m_fontSizeBase: 14
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
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: 1
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!1 &3935166504402937896
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2886414022211784798}
- component: {fileID: 8522294738835095969}
- component: {fileID: 3454851384508751239}
- component: {fileID: 5323088521370621725}
m_Layer: 0
m_Name: downloadButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2886414022211784798
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3935166504402937896}
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: 2125078545845614351}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 30, y: 30}
m_Pivot: {x: 1, y: 0.5}
--- !u!222 &8522294738835095969
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3935166504402937896}
m_CullTransparentMesh: 1
--- !u!114 &3454851384508751239
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3935166504402937896}
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: d04f8d9db8a4a384295fab0e8eb6307b, 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 &5323088521370621725
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3935166504402937896}
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: 3454851384508751239}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &5142099578135948653
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5634356056514378184}
- component: {fileID: 1307972099341557597}
- component: {fileID: 113339388759867921}
m_Layer: 0
m_Name: loadingImage
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5634356056514378184
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5142099578135948653}
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: 2125078545845614351}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0.5, y: 0}
m_SizeDelta: {x: -3, y: -4}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1307972099341557597
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5142099578135948653}
m_CullTransparentMesh: 1
--- !u!114 &113339388759867921
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5142099578135948653}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 0.02064565, b: 0, a: 0.2}
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: e42c26fe0bafbfc4fb9da2e0fecfdbb7, type: 3}
m_Type: 3
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 0
m_FillAmount: 0
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &5257302254587163552
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4425131499129391613}
- component: {fileID: 6083050972200396223}
- component: {fileID: 5208913841818591071}
- component: {fileID: 677456697784395592}
m_Layer: 0
m_Name: stopButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4425131499129391613
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5257302254587163552}
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: 2125078545845614351}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 30, y: 30}
m_Pivot: {x: 1, y: 0.5}
--- !u!222 &6083050972200396223
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5257302254587163552}
m_CullTransparentMesh: 1
--- !u!114 &5208913841818591071
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5257302254587163552}
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: b8f01b5e3ac8c1e4db9758c0f44716c5, 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 &677456697784395592
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5257302254587163552}
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: 5208913841818591071}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &5609613257243525174
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2125078545845614351}
- component: {fileID: 1443206361432930337}
- component: {fileID: 2593060779757277299}
- component: {fileID: 6998636532636839170}
m_Layer: 0
m_Name: UIPlaybackListItem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2125078545845614351
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5609613257243525174}
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: 5634356056514378184}
- {fileID: 5796655878833709733}
- {fileID: 2886414022211784798}
- {fileID: 4425131499129391613}
- {fileID: 1758947466629551347}
- {fileID: 5052245942240762746}
- {fileID: 6418761242116767989}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 258, y: 32}
m_Pivot: {x: 0, y: 1}
--- !u!114 &1443206361432930337
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5609613257243525174}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e157d53f2eb114b4b94e5b0d1c7eeaa9, type: 3}
m_Name:
m_EditorClassIdentifier:
loadingImage: {fileID: 113339388759867921}
selectedImage: {fileID: 7184156021851962383}
downloadButton: {fileID: 5323088521370621725}
stopButton: {fileID: 677456697784395592}
deleteButton: {fileID: 1593740195264588535}
text: {fileID: 1024787892698960882}
downloadText: {fileID: 1799854006817858880}
--- !u!222 &2593060779757277299
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5609613257243525174}
m_CullTransparentMesh: 1
--- !u!225 &6998636532636839170
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5609613257243525174}
m_Enabled: 1
m_Alpha: 1
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!1 &7535657093799106716
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1758947466629551347}
- component: {fileID: 547830227119712359}
- component: {fileID: 3801952530268951881}
- component: {fileID: 1593740195264588535}
m_Layer: 0
m_Name: deleteButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1758947466629551347
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7535657093799106716}
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: 2125078545845614351}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 30, y: 30}
m_Pivot: {x: 1, y: 0.5}
--- !u!222 &547830227119712359
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7535657093799106716}
m_CullTransparentMesh: 1
--- !u!114 &3801952530268951881
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7535657093799106716}
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: 4018c8210d6abd748af6f6c0a9471e7b, 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 &1593740195264588535
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7535657093799106716}
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: 3801952530268951881}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &7702447792393672735
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5052245942240762746}
- component: {fileID: 8050799054193385437}
- component: {fileID: 1799854006817858880}
m_Layer: 0
m_Name: downloadText
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5052245942240762746
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7702447792393672735}
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: 2125078545845614351}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 95, y: -1}
m_SizeDelta: {x: -125, y: -2}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &8050799054193385437
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7702447792393672735}
m_CullTransparentMesh: 1
--- !u!114 &1799854006817858880
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7702447792393672735}
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: 00MB/22MB(0%)
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: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, 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: 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: 1
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: 5a2ac474d7140274ebf6828a73a32986
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: b433290e6b9d4d441b69c0e11fbb48a7
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 4, y: 4, z: 4, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: ef17ab8643b67aa4ba86a434f405f8b1
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 4, y: 0, z: 4, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: c72a6eec7f9887848aa5830772d552db
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 4, y: 4, z: 4, w: 4}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: a8021fa275e23ce479f1e85f35cdb52d
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 4, y: 0, z: 4, w: 4}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 4018c8210d6abd748af6f6c0a9471e7b
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: d04f8d9db8a4a384295fab0e8eb6307b
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: e42c26fe0bafbfc4fb9da2e0fecfdbb7
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 512
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: b7d31521a9c251446bd203fe7d09d878
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 4, y: 4, z: 4, w: 4}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: b8f01b5e3ac8c1e4db9758c0f44716c5
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 53cb7a6d381e31e4fb3ab38f05378abe
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 64
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: d7d629e94d507194f90f70f9b86686f2
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 12921a2649b18f74696785bfe95b9470
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 46d4910ba7714804db4387b2cde06e49
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 128
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,269 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &3247177050376678973
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3316965954832882549}
- component: {fileID: 3078805581424071851}
- component: {fileID: 3314964221659757925}
- component: {fileID: 4097232251975178814}
- component: {fileID: 5836275117983516284}
m_Layer: 5
m_Name: UILoading
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3316965954832882549
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3247177050376678973}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0, y: 0, z: 0}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 88171281312113102}
- {fileID: 2492902462340881910}
m_Father: {fileID: 0}
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 &3078805581424071851
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3247177050376678973}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0575433bbc705184a91373cc1596e713, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!222 &3314964221659757925
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3247177050376678973}
m_CullTransparentMesh: 0
--- !u!225 &4097232251975178814
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3247177050376678973}
m_Enabled: 1
m_Alpha: 1
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!223 &5836275117983516284
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3247177050376678973}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 0
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 1
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 0
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
--- !u!1 &3720191927695001841
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2492902462340881910}
- component: {fileID: 7648764534251572644}
- component: {fileID: 5537735754607583444}
m_Layer: 5
m_Name: loadingImage
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2492902462340881910
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3720191927695001841}
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: 3316965954832882549}
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: 128, y: 128}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7648764534251572644
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3720191927695001841}
m_CullTransparentMesh: 1
--- !u!114 &5537735754607583444
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3720191927695001841}
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: 46d4910ba7714804db4387b2cde06e49, type: 3}
m_Type: 3
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 0
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &4686320329165673528
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 88171281312113102}
- component: {fileID: 2684962061011688192}
- component: {fileID: 1300410749199883953}
- component: {fileID: 8281614723970529648}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &88171281312113102
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4686320329165673528}
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: 10}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3316965954832882549}
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!222 &2684962061011688192
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4686320329165673528}
m_CullTransparentMesh: 0
--- !u!114 &1300410749199883953
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4686320329165673528}
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: 0.078431375, g: 0.078431375, b: 0.078431375, a: 0.9607843}
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: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &8281614723970529648
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4686320329165673528}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 1
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 31bf9300464f1b5499c53f14d9a66997
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,482 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1023907593232336149
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1495582347662720592}
- component: {fileID: 568990472681738453}
- component: {fileID: 7140932015560849560}
m_Layer: 5
m_Name: loadingBgImage
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1495582347662720592
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1023907593232336149}
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: 3316965954832882549}
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: 200, y: 10}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &568990472681738453
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1023907593232336149}
m_CullTransparentMesh: 1
--- !u!114 &7140932015560849560
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1023907593232336149}
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: 0.7830189, g: 0.7830189, b: 0.7830189, 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: 31bf9300464f1b5499c53f14d9a66997, type: 3}
m_Type: 3
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 0
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &3247177050376678973
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3316965954832882549}
- component: {fileID: 923263126373587623}
- component: {fileID: 3314964221659757925}
- component: {fileID: 4097232251975178814}
- component: {fileID: 5959041612264278031}
m_Layer: 5
m_Name: UILoadingBar
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3316965954832882549
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3247177050376678973}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0, y: 0, z: 0}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 88171281312113102}
- {fileID: 1495582347662720592}
- {fileID: 2492902462340881910}
- {fileID: 4962509568142564414}
m_Father: {fileID: 0}
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 &923263126373587623
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3247177050376678973}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4fb7ebdfa824a214caad9f55f3398cc0, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!222 &3314964221659757925
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3247177050376678973}
m_CullTransparentMesh: 0
--- !u!225 &4097232251975178814
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3247177050376678973}
m_Enabled: 1
m_Alpha: 1
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!223 &5959041612264278031
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3247177050376678973}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 0
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 1
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 1
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 0
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
--- !u!1 &3720191927695001841
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2492902462340881910}
- component: {fileID: 7648764534251572644}
- component: {fileID: 5537735754607583444}
m_Layer: 5
m_Name: loadingImage
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2492902462340881910
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3720191927695001841}
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: 3316965954832882549}
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: 200, y: 10}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7648764534251572644
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3720191927695001841}
m_CullTransparentMesh: 1
--- !u!114 &5537735754607583444
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3720191927695001841}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 0.047946326, b: 0, 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: 31bf9300464f1b5499c53f14d9a66997, type: 3}
m_Type: 3
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 0
m_FillAmount: 0
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &4686320329165673528
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 88171281312113102}
- component: {fileID: 2684962061011688192}
- component: {fileID: 1300410749199883953}
- component: {fileID: 8281614723970529648}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &88171281312113102
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4686320329165673528}
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: 10}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3316965954832882549}
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!222 &2684962061011688192
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4686320329165673528}
m_CullTransparentMesh: 0
--- !u!114 &1300410749199883953
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4686320329165673528}
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: 0.078431375, g: 0.078431375, b: 0.078431375, a: 0.9607843}
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: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &8281614723970529648
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4686320329165673528}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 1
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &8944876319433728574
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4962509568142564414}
- component: {fileID: 827443756421767093}
- component: {fileID: 5965769881319077586}
m_Layer: 5
m_Name: message
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4962509568142564414
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8944876319433728574}
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: 3316965954832882549}
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: 15}
m_SizeDelta: {x: 200, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &827443756421767093
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8944876319433728574}
m_CullTransparentMesh: 1
--- !u!114 &5965769881319077586
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8944876319433728574}
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:
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: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, 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: 12
m_fontSizeBase: 12
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: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
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: 168aca8c14e335d4a9423c3c103667e0
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,93 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &3526452672395979179
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7039059871646261441}
- component: {fileID: 1278396481116117950}
- component: {fileID: 4336813538161482815}
- component: {fileID: 1487379697227245833}
m_Layer: 5
m_Name: UIDragger
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7039059871646261441
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3526452672395979179}
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}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 4, y: 11}
m_Pivot: {x: 0, y: 1}
--- !u!222 &1278396481116117950
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3526452672395979179}
m_CullTransparentMesh: 1
--- !u!114 &4336813538161482815
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3526452672395979179}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 31446b5c56e405741ac8a38fe5a42443, type: 3}
m_Name:
m_EditorClassIdentifier:
dragArea: {fileID: 0}
dragObject: {fileID: 0}
topOnDrag: 1
--- !u!114 &1487379697227245833
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3526452672395979179}
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: 224, y: -18, z: 16, w: -17}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 6360f4fc98f4ac2438593da79131077a, 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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: a458a60f90f95e74292928ca17721b8f
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 64
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 342176064d9f8604e8a752c0cecf4183
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 64
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 6360f4fc98f4ac2438593da79131077a
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 64
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -49,7 +49,7 @@ TextureImporter:
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteBorder: {x: 6, y: 10, z: 10, w: 6}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
@@ -127,7 +127,7 @@ TextureImporter:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
internalID: 1537655665
vertices: []
indices:
edges: []

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: c6b2729b906e71c42a5f0417601e5cd0
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 9, y: 9, z: 9, w: 9}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 64
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 311db692c780ea74f9605477fb85f448
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 126, y: 126, z: 126, w: 126}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 256
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -43,13 +43,13 @@ TextureImporter:
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteBorder: {x: 4, y: 4, z: 4, w: 4}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
@@ -69,7 +69,7 @@ TextureImporter:
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
maxTextureSize: 32
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
@@ -131,7 +131,7 @@ TextureImporter:
width: 10
height: 10
alignment: 0
pivot: {x: 0, y: 0}
pivot: {x: 0.5, y: 0.5}
border: {x: 4, y: 4, z: 4, w: 4}
customData:
outline: []
@@ -149,7 +149,7 @@ TextureImporter:
physicsShape: []
bones: []
spriteID: fe0eaa9c51e45554c9d875af89df8972
internalID: 0
internalID: 164722594
vertices: []
indices:
edges: []

View File

@@ -49,7 +49,7 @@ TextureImporter:
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteBorder: {x: 6, y: 10, z: 10, w: 6}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
@@ -127,7 +127,7 @@ TextureImporter:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
internalID: 1537655665
vertices: []
indices:
edges: []

View File

@@ -43,13 +43,13 @@ TextureImporter:
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteBorder: {x: 4, y: 4, z: 4, w: 4}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
@@ -131,7 +131,7 @@ TextureImporter:
width: 10
height: 10
alignment: 0
pivot: {x: 0, y: 0}
pivot: {x: 0.5, y: 0.5}
border: {x: 4, y: 4, z: 4, w: 4}
customData:
outline: []
@@ -149,7 +149,7 @@ TextureImporter:
physicsShape: []
bones: []
spriteID: dc5e3c8013eed1640be9600cd7909c79
internalID: 0
internalID: 79660757
vertices: []
indices:
edges: []

View File

@@ -49,7 +49,7 @@ TextureImporter:
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteBorder: {x: 6, y: 10, z: 10, w: 6}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
@@ -127,7 +127,7 @@ TextureImporter:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
internalID: 1537655665
vertices: []
indices:
edges: []

View File

@@ -43,13 +43,13 @@ TextureImporter:
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteBorder: {x: 19, y: 19, z: 19, w: 19}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
@@ -131,7 +131,7 @@ TextureImporter:
width: 40
height: 40
alignment: 0
pivot: {x: 0, y: 0}
pivot: {x: 0.5, y: 0.5}
border: {x: 19, y: 19, z: 19, w: 19}
customData:
outline: []
@@ -149,7 +149,7 @@ TextureImporter:
physicsShape: []
bones: []
spriteID: 95be9487ffa51de4c9e0c40e64a95511
internalID: 0
internalID: -1447681776
vertices: []
indices:
edges: []

View File

@@ -1296,6 +1296,10 @@ PrefabInstance:
propertyPath: m_Options.m_Options.Array.size
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8819539204293308730, guid: 12db500810bde2f42b6cc1aa17543fb5, type: 3}
propertyPath: m_text
value:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []

View File

@@ -3,6 +3,7 @@ using System;
using UnityEngine;
using UVC.Core;
using UVC.Data;
using UVC.Data.Core;
using UVC.Locale;
using UVC.Util;
@@ -16,13 +17,13 @@ namespace SampleProject
/// <summary>
/// 초기 화 메서드입니다.
/// Awake 메서드에서 호출되며, MonoBehaviour가 생성될 때 한 번만 실행됩니다.
/// 초기 화 메서드입니다.
/// Awake 메서드에서 호출되며, MonoBehaviour가 생성될 때 한 번만 실행됩니다.
/// </summary>
protected override void Init()
{
SettupConfig();
SetNetworkInfo();
SetNetworkConfig();
if (Initialized != null)
{
Initialized.Invoke();
@@ -38,12 +39,12 @@ namespace SampleProject
{
if (AppConfig.LoadConfig())
{
//기본 언어 설정
//기본 언어 설정
bool success = LocalizationManager.Instance.LoadDefaultLocalizationData(AppConfig.Config.Language);
Debug.Log($"LocalizationManager: LoadDefaultLocalizationData success: {success}");
if (!Application.isEditor && Application.platform == RuntimePlatform.WindowsPlayer)
{
//창 설정
//창 설정
if (AppConfig.Config.Window != null)
{
WindowTools.Instance.Init(AppConfig.Config.Window);
@@ -52,29 +53,76 @@ namespace SampleProject
}
}
private void SetNetworkInfo()
private void SetNetworkConfig()
{
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");
var agvDataMask = new DataMask();
agvDataMask.ObjectName = "AGV"; // AGV 객체의 이름을 설정합니다.
agvDataMask.ObjectIdKey = "VHL_NAME"; // AGV의 고유 식별자로 사용할 키를 설정합니다.
agvDataMask["VHL_NAME"] = "";
agvDataMask["AGV_IDX"] = "";
agvDataMask["B_INSTALL"] = "";
agvDataMask["NODE_ID"] = "";
agvDataMask["REAL_ID"] = "";
agvDataMask["VHL_STATE"] = "";
agvDataMask["BAY_LIST"] = "";
agvDataMask["X"] = 0;
agvDataMask["Y"] = 0;
agvDataMask["DEGREE"] = 0.0;
agvDataMask["MODE"] = "";
agvDataMask["BATT"] = "";
agvDataMask["SUB_GOAL"] = "";
agvDataMask["FINAL_GOAL"] = "";
agvDataMask["JOB_ID"] = "";
agvDataMask["TIMESTAMP"] = DateTime.Now;
DataMapperValidator.Add("AGV", new DataMapperValidator(
new DataMapper(agvDataMask)
));
// 데이터 마스크(DataMask) 정의:
// 수신할 데이터의 구조를 미리 정의합니다. 여기서 정의된 키(Key)들을 기준으로 데이터를 파싱합니다.
var alarmDataMask = new DataMask();
alarmDataMask.ObjectName = "Alarm"; // Alarm 객체의 이름을 설정합니다.
alarmDataMask.ObjectIdKey = "ID"; // Alarm의 고유 식별자로 사용할 키를 설정합니다.
alarmDataMask["ID"] = "";
alarmDataMask["ALARM_TYPE"] = "";
alarmDataMask["LEVEL"] = "";
alarmDataMask["LOGISTIC"] = "";
alarmDataMask["STATE"] = "";
alarmDataMask["MESSAGE"] = "";
alarmDataMask["CODE"] = "";
alarmDataMask["ICON"] = "";
alarmDataMask["MACHINENAME"] = "";
alarmDataMask["SHOPNAME"] = "";
alarmDataMask["TRANSPORT_EQP_NAME"] = "";
alarmDataMask["TRANSPORT_UNIT_NAME"] = "";
alarmDataMask["TRANSPORT_EQP_ID"] = "";
alarmDataMask["TRANSPORT_UNIT_ID"] = "";
alarmDataMask["CLEAR_TIME"] = DateTime.Now;
alarmDataMask["SET_TIME"] = DateTime.Now;
alarmDataMask["UPDATE_TIME"] = DateTime.Now;
alarmDataMask["TIMESTAMP"] = DateTime.Now;
// 데이터 유효성 검사기(DataValidator) 설정:
// 수신된 데이터가 유효한지 검사하는 규칙을 추가합니다.
// 여기서는 "MACHINENAME" 필드가 null이 아닌지 확인합니다.
DataValidator alarmValidator = new DataValidator();
alarmValidator.AddValidator("MACHINENAME", value => value != null);
DataMapperValidator.Add("ALARM", new DataMapperValidator(
new DataMapper(alarmDataMask),
alarmValidator
));
DataRepository.Instance.MqttReceiver.SetDomainPort("localhost", 1883);
DataRepository.Instance.MqttReceiver.AddTopic("AGV");
DataRepository.Instance.MqttReceiver.AddTopic("ALARM");
DataRepository.Instance.MqttReceiver.Start();
//10초 후 정지
//10초 후 정지
//UniTask.Delay(TimeSpan.FromSeconds(10)).ContinueWith(() =>
//{
// DataRepository.Instance.MqttReceiver.Stop();

View File

@@ -4,5 +4,6 @@
{
public static string MQTT_DOMAIN = "localhost";
public static int MQTT_PORT = 1883;
public static string PlaybackDomain = "http://localhost";
}
}

View File

@@ -1,7 +1,12 @@
using System;
using System.Threading.Tasks;
using UnityEngine;
using UVC.Core;
using UVC.Data;
using UVC.Data.Core;
using UVC.Data.Http;
using UVC.Factory.Alarm;
using UVC.Factory.Playback;
using UVC.UI.Tooltip;
namespace SampleProject
@@ -33,12 +38,36 @@ namespace SampleProject
AlarmManager.Instance.Run();
}
private void OnAppInitialized()
private async void OnAppInitialized()
{
await requestDataAsync();
if (Initialized != null)
{
Initialized.Invoke();
}
PlaybackService.Instance.OnStopPlayback += OnStopPlayback;
}
private async Task requestDataAsync()
{
var httpFetcher = DataRepository.Instance.HttpFetcher;
var splitRequest = new HttpRequestConfig(URLList.Get("baseinfo"))
.setSplitResponseByKey(true) // 응답을 키별로 분할
.AddSplitConfig("AGV", DataMapperValidator.Get("AGV")) // "AGV" 키에 대한 매퍼, Validator 설정
.AddSplitConfig("ALARM", DataMapperValidator.Get("ALARM")); // "ALARM" 키에 대한 매퍼, Validator 설정
httpFetcher.Add("baseInfo", splitRequest);
await httpFetcher.Excute("baseInfo");
//MqttReceiver 시작
DataRepository.Instance.MqttReceiver.Start();
}
private async void OnStopPlayback()
{
await requestDataAsync();
}
}
}

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using UVC.Factory.Playback;
using UVC.Log; // 필요에 따라 UVC.Log 또는 프로젝트별 로깅 시스템 사용
using UVC.UI.Commands;
using UVC.UI.Menu;
@@ -50,11 +51,7 @@ namespace SampleProject.UI.Menu
MenuItemData.CreateSeparator("file_sep_sample2"),
new MenuItemData("file_exit", "menu_file_exit", new QuitApplicationCommand())
}),
new MenuItemData("edit", "menu_edit", subMenuItems: new List<MenuItemData>
{
new MenuItemData("edit_undo", "menu_edit_undo", new DebugLogCommand("[SampleProject] 실행 취소 선택됨")),
new MenuItemData("edit_redo", "menu_edit_redo", new DebugLogCommand("[SampleProject] 다시 실행 선택됨"))
}),
new MenuItemData("Playback", "Playback", new PlaybackCommand()),
new MenuItemData("modal", "모달", subMenuItems: new List<MenuItemData>
{
new MenuItemData("alert", "Alert", new ActionCommand(async () => {

View File

@@ -28,6 +28,24 @@ namespace UVC.Data.Core
}
}
private bool createdFromPool = false;
/// <summary>
/// 객체가 풀에서 생성되었는지 여부를 나타냅니다.
/// </summary>
internal bool CreatedFromPool
{
get => createdFromPool;
set
{
createdFromPool = value;
foreach (var item in this)
{
item.CreatedFromPool = value; // 내부 DataObject도 풀에서 생성되었음을 표시합니다.
}
}
}
// 추가 된 항목 목록
protected List<DataObject> addedList = new List<DataObject>();
// 제거 된 항목 목록
@@ -376,8 +394,15 @@ namespace UVC.Data.Core
public void ReturnToPool()
{
// 포함된 DataObject들을 먼저 풀에 반환합니다.
DataArrayPool.Return(this);
if (CreatedFromPool)
{
Reset();
}
else
{
// 포함된 DataObject들을 먼저 풀에 반환합니다.
DataArrayPool.Return(this);
}
}
/// <summary>

View File

@@ -23,7 +23,7 @@ namespace UVC.Data.Core
// maxPoolSize만큼의 DataObject 인스턴스를 미리 생성하여 풀에 추가합니다.
for (int i = 0; i < _maxPoolSize; i++)
{
_pool.Enqueue(new DataArray() { IsInPool = true });
_pool.Enqueue(new DataArray() { IsInPool = true, CreatedFromPool = true });
}
}
@@ -62,7 +62,7 @@ namespace UVC.Data.Core
{
array.IsInPool = false;
}
return fromPool ? array : new DataArray();
return fromPool ? array : new DataArray() { CreatedFromPool = true };
}
/// <summary>

View File

@@ -0,0 +1,83 @@
#nullable enable
using System.Collections.Generic;
namespace UVC.Data.Core
{
/// <summary>
/// 각 분할 응답 키에 대한 데이터 매퍼 및 유효성 검사기 구성을 캡슐화합니다.
/// </summary>
public class DataMapperValidator
{
private static Dictionary<string, DataMapperValidator> _dataMapperValidators = new Dictionary<string, DataMapperValidator>();
/// <summary>
/// 컬렉션에 새 데이터 매퍼 유효성 검사기를 추가하거나 지정된 키로 기존 데이터 매퍼 유효성 검사기를 업데이트합니다.
/// </summary>
/// <remarks>지정된 키가 컬렉션에 이미 있는 경우 기존 데이터 매퍼 유효성 검사기는 새 데이터 매퍼 유효성 검사기로 대체됩니다.
/// <param name="key">데이터 매퍼 유효성 검사기와 연결된 고유 키입니다. null이거나 비어 있을 수 없습니다.</param>
/// <param name="data">추가하거나 업데이트할 <see cref="DataMapperValidator"/> 인스턴스입니다. null일 수 없습니다.</param>
public static void Add(string key, DataMapperValidator data)
{
if (!_dataMapperValidators.ContainsKey(key))
{
_dataMapperValidators.Add(key, data);
}
else
{
_dataMapperValidators[key] = data;
}
}
/// <summary>
/// 지정된 키와 연관된 유효성 검사기를 컬렉션에서 제거합니다.
/// </summary>
/// <remarks>지정된 키가 컬렉션에 없으면 메서드는 아무 작업도 수행하지 않습니다.
///</remarks>
/// <param name="key">제거할 유효성 검사기의 키입니다. <see langword="null"/>이거나 비어 있으면 안 됩니다.</param>
public static void Remove(string key)
{
if (_dataMapperValidators.ContainsKey(key))
{
_dataMapperValidators.Remove(key);
}
}
/// <summary>
/// 지정된 키와 연결된 <see cref="DataMapperValidator"/>를 검색합니다.
/// </summary>
/// <param name="key"> <see cref="DataMapperValidator"/>를 찾는 데 사용되는 키입니다. null이거나 비어 있을 수 없습니다.</param>
/// <returns> 지정된 키와 연결된 <see cref="DataMapperValidator"/> 또는 유효성 검사기를 찾을 수 없는 경우 <see langword="null"/>을 반환합니다.
///</returns>
public static DataMapperValidator? Get(string key)
{
if (_dataMapperValidators.TryGetValue(key, out var data))
{
return data;
}
return null;
}
/// <summary>
/// 이 분할 키에 대한 데이터 매퍼입니다.
/// </summary>
public DataMapper? DataMapper { get; }
/// <summary>
/// 이 분할 키에 대한 데이터 유효성 검사기입니다.
/// </summary>
public DataValidator? Validator { get; }
/// <summary>
/// DataMapperValidator 클래스의 새 인스턴스를 초기화합니다.
/// </summary>
/// <param name="dataMapper">데이터 매퍼입니다.</param>
/// <param name="validator">데이터 유효성 검사기입니다.</param>
public DataMapperValidator(DataMapper? dataMapper, DataValidator? validator = null)
{
DataMapper = dataMapper;
Validator = validator;
}
}
}

View File

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

View File

@@ -73,6 +73,31 @@ namespace UVC.Data.Core
}
}
private bool createdFromPool = false;
/// <summary>
/// 객체가 풀에서 생성되었는지 여부를 나타냅니다.
/// </summary>
internal bool CreatedFromPool
{
get => createdFromPool;
set
{
createdFromPool = value;
foreach (var item in this)
{
if (item.Value is DataObject dataObject)
{
dataObject.CreatedFromPool = value; // 내부 DataObject도 풀에 있다고 표시합니다.
}
else if (item.Value is DataArray dataArray)
{
dataArray.CreatedFromPool = value; // 내부 DataArray도 풀에 있다고 표시합니다.
}
}
}
}
/// <summary>
/// 객체의 고유 식별자를 나타내는 속성입니다. DataArray에서 데이터를 식별하는 데 사용됩니다.
/// </summary>
@@ -858,7 +883,14 @@ namespace UVC.Data.Core
public void ReturnToPool()
{
DataObjectPool.Return(this);
if (CreatedFromPool)
{
Reset();
}
else
{
DataObjectPool.Return(this);
}
}
/// <summary>

View File

@@ -49,7 +49,7 @@ namespace UVC.Data.Core
// maxPoolSize만큼의 DataObject 인스턴스를 미리 생성하여 풀에 추가합니다.
for (int i = 0; i < maxPoolSize; i++)
{
pool.Enqueue(new DataObject() { IsInPool = true });
pool.Enqueue(new DataObject() { IsInPool = true, CreatedFromPool = true });
}
}
@@ -90,7 +90,7 @@ namespace UVC.Data.Core
{
obj.IsInPool = false;
}
return fromPool ? obj : new DataObject();
return fromPool ? obj : new DataObject() { CreatedFromPool = true };
}
/// <summary>

View File

@@ -1,4 +1,5 @@
using Newtonsoft.Json;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
@@ -54,7 +55,6 @@ namespace UVC.Data
/// </summary>
private Dictionary<string, Action<IDataObject>> dataUpdateHandlers = new Dictionary<string, Action<IDataObject>>();
private HttpDataFetcher httpFetcher = new HttpDataFetcher();
public HttpDataFetcher HttpFetcher => httpFetcher;
@@ -85,7 +85,7 @@ namespace UVC.Data
dataObjects.Add(key, newData);
dataObject.MarkAllAsUpdated();
//UniTask.Post(() => NotifyDataUpdate(key, newData));
NotifyDataUpdate(key, newData);
return dataObject;
}
else
@@ -101,7 +101,7 @@ namespace UVC.Data
{
newDataObject = dataObject;
}
//UniTask.Post(() => NotifyDataUpdate(key, obj));
NotifyDataUpdate(key, obj);
return newDataObject;
}
}
@@ -155,24 +155,24 @@ namespace UVC.Data
/// 핸들러는 해당 키의 데이터가 AddData를 통해 업데이트될 때마다 호출됩니다.
/// 전달 되는 데이터 객체는 업데이트된 상태고 DataRepository에 저장된 객체이기에 pool.ReturnToPool()을 호출하면 않됩니다.
/// </remarks>
//public void AddDataUpdateHandler(string key, Action<IDataObject> handler)
//{
// if (string.IsNullOrEmpty(key))
// throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다.");
// if (handler == null)
// throw new ArgumentNullException(nameof(handler), "핸들러는 null일 수 없습니다.");
// lock (syncLock)
// {
// if (!dataUpdateHandlers.ContainsKey(key))
// {
// dataUpdateHandlers[key] = handler;
// }
// else
// {
// dataUpdateHandlers[key] += handler; // 기존 핸들러에 추가
// }
// }
//}
public void AddDataUpdateHandler(string key, Action<IDataObject> handler)
{
if (string.IsNullOrEmpty(key))
throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다.");
if (handler == null)
throw new ArgumentNullException(nameof(handler), "핸들러는 null일 수 없습니다.");
lock (syncLock)
{
if (!dataUpdateHandlers.ContainsKey(key))
{
dataUpdateHandlers[key] = handler;
}
else
{
dataUpdateHandlers[key] += handler; // 기존 핸들러에 추가
}
}
}
/// <summary>
/// 지정된 키에서 데이터 업데이트 핸들러를 제거합니다.
@@ -183,24 +183,24 @@ namespace UVC.Data
/// 지정된 키에 연결된 핸들러가 없거나, 제거하려는 핸들러가 등록되지 않은 경우 아무 작업도 수행하지 않습니다.
/// 키에 연결된 마지막 핸들러가 제거되면 해당 키는 dataUpdateHandlers 딕셔너리에서 삭제됩니다.
/// </remarks>
//public void RemoveDataUpdateHandler(string key, Action<IDataObject> handler)
//{
// if (string.IsNullOrEmpty(key))
// throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다.");
// if (handler == null)
// throw new ArgumentNullException(nameof(handler), "핸들러는 null일 수 없습니다.");
// lock (syncLock)
// {
// if (dataUpdateHandlers.ContainsKey(key))
// {
// dataUpdateHandlers[key] -= handler; // 기존 핸들러에서 제거
// if (dataUpdateHandlers[key] == null)
// {
// dataUpdateHandlers.Remove(key); // 핸들러가 없으면 제거
// }
// }
// }
//}
public void RemoveDataUpdateHandler(string key, Action<IDataObject> handler)
{
if (string.IsNullOrEmpty(key))
throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다.");
if (handler == null)
throw new ArgumentNullException(nameof(handler), "핸들러는 null일 수 없습니다.");
lock (syncLock)
{
if (dataUpdateHandlers.ContainsKey(key))
{
dataUpdateHandlers[key] -= handler; // 기존 핸들러에서 제거
if (dataUpdateHandlers[key] == null)
{
dataUpdateHandlers.Remove(key); // 핸들러가 없으면 제거
}
}
}
}
/// <summary>
/// 모든 데이터 업데이트 핸들러를 제거합니다.
@@ -210,13 +210,13 @@ namespace UVC.Data
/// 예를 들어, 씬이 변경되거나 애플리케이션이 종료될 때
/// 모든 핸들러를 정리하는 데 유용합니다.
/// </remarks>
//public void ClearDataUpdateHandlers()
//{
// lock (syncLock)
// {
// dataUpdateHandlers.Clear();
// }
//}
public void ClearDataUpdateHandlers()
{
lock (syncLock)
{
dataUpdateHandlers.Clear();
}
}
/// <summary>
/// 지정된 키의 데이터가 업데이트되었음을 알리고 등록된 핸들러들을 호출합니다.
@@ -227,20 +227,20 @@ namespace UVC.Data
/// 이 메서드는 주로 내부적으로 AddOrUpdateData 메서드에서 호출되어
/// 특정 키의 데이터가 변경되었을 때 등록된 핸들러들에게 알립니다.
/// </remarks>
//private void NotifyDataUpdate(string key, IDataObject dataObject)
//{
// if (string.IsNullOrEmpty(key))
// throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다.");
// if (dataObject == null)
// throw new ArgumentNullException(nameof(dataObject), "데이터 객체는 null일 수 없습니다.");
// lock (syncLock)
// {
// if (dataUpdateHandlers.ContainsKey(key))
// {
// dataUpdateHandlers[key]?.Invoke(dataObject);
// }
// }
//}
private void NotifyDataUpdate(string key, IDataObject dataObject)
{
if (string.IsNullOrEmpty(key))
throw new ArgumentNullException(nameof(key), "키는 null이거나 빈 문자열일 수 없습니다.");
if (dataObject == null)
throw new ArgumentNullException(nameof(dataObject), "데이터 객체는 null일 수 없습니다.");
lock (syncLock)
{
if (dataUpdateHandlers.ContainsKey(key))
{
UniTask.Post(() => dataUpdateHandlers[key]!.Invoke(dataObject));
}
}
}
/// <summary>
/// 저장소에 저장된 모든 데이터 객체의 키 목록을 반환합니다.

View File

@@ -53,7 +53,7 @@ namespace UVC.Data.Http
/// // 단일 요청 설정 및 등록
/// var singleRequest = new HttpRequestConfig("https://api.example.com/data")
/// .setDataMapper(dataMapper)
/// .setHandler(data => {
/// .setSuccessHandler(data => {
/// // 데이터 처리 로직
/// ULog.Debug($"데이터 수신: {data?.ToString() ?? "null"}");
/// });
@@ -62,16 +62,36 @@ namespace UVC.Data.Http
/// // 반복 요청 설정 및 등록
/// var repeatingRequest = new HttpRequestConfig("https://api.example.com/status")
/// .setDataMapper(dataMapper)
/// .setHandler(data => {
/// .setSuccessHandler(data => {
/// // 상태 데이터 처리
/// ULog.Debug($"상태 업데이트: {data?.ToString() ?? "null"}");
/// })
/// .setRepeat(true, 0, 5000); // 5초마다 무한 반복
/// httpFetcher.Add("statusMonitor", repeatingRequest);
///
/// // 응답 분할 요청 설정 (예: 응답이 {"AGV": [...], "ALARM": [...]} 형태)
/// // 각 키에 맞는 DataMapper와 Validator를 준비합니다.
/// var agvMask = new DataMask { ["VHL_NAME"] = "차량명" };
/// var alarmMask = new DataMask { ["MESSAGE"] = "메시지" };
/// var agvMapper = new DataMapper(agvMask);
/// var alarmMapper = new DataMapper(alarmMask);
///
/// var splitRequest = new HttpRequestConfig("https://api.example.com/baseinfo")
/// .setSplitResponseByKey(true) // 응답을 키별로 분할
/// .AddSplitConfig("AGV", agvMapper) // "AGV" 키에 대한 매퍼 설정
/// .AddSplitConfig("ALARM", alarmMapper); // "ALARM" 키에 대한 매퍼 설정
/// httpFetcher.Add("baseInfo", splitRequest);
///
/// // 요청 실행
/// await httpFetcher.Excute("dataRequest"); // 단일 실행
/// await httpFetcher.Excute("statusMonitor"); // 반복 실행 시작
/// await httpFetcher.Excute("baseInfo"); // 분할 요청 실행
///
/// // 분할된 데이터 확인
/// var agvData = DataRepository.Instance.GetData("AGV");
/// var alarmData = DataRepository.Instance.GetData("ALARM");
/// ULog.Debug($"AGV Data from Repository: {agvData}");
/// ULog.Debug($"Alarm Data from Repository: {alarmData}");
///
/// // 나중에 반복 요청 중지
/// httpFetcher.StopRepeat("statusMonitor");
@@ -245,235 +265,9 @@ namespace UVC.Data.Http
result = await HttpRequester.Request<string>(info.Url, info.Method, info.Body, info.Headers);
}
// 응답 처리 전에 다시 취소 요청 확인
if (cancellationToken.IsCancellationRequested)
{
throw new OperationCanceledException("Operation cancelled", cancellationToken);
}
result = result.Trim();
cancellationToken.ThrowIfCancellationRequested();
if (!string.IsNullOrEmpty(result))
{
try
{
HttpResponseResult responseResult = info.ResponseMask.Apply(result);
// 응답 마스크 적용 결과가 성공이 아니면 실패 핸들러 호출 후 반환
if (!responseResult.IsSuccess)
{
if (info.FailHandler != null)
{
string errorMessage = responseResult.Message!;
// UI 스레드에서 실패 핸들러 호출
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke(errorMessage);
}
return;
}
else
{
result = responseResult.Data!.Trim();
}
if (result.StartsWith("{"))
{
if (info.Validator != null)
{
if (info.Validator.SupportsStreamParsing && result.Length > info.Validator.SupportsStreamLength)
{
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(result)))
{
if (info.Validator != null && !info.Validator.IsValid(stream))
{
if (info.FailHandler != null)
{
// UI 스레드에서 실패 핸들러 호출
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke("Data is not Valid");
}
return;
}
}
}
else
{
JObject source = JObject.Parse(result);
if (info.Validator != null && !info.Validator.IsValid(source))
{
if (info.FailHandler != null)
{
// UI 스레드에서 실패 핸들러 호출
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke("Data is not Valid");
}
return;
}
}
}
if (info.DataMapper != null)
{
if (info.DataMapper.SupportsStreamParsing && result.Length > info.DataMapper.SupportsStreamLength)
{
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(result)))
{
mappedObject = info.DataMapper.MapObjectStream(stream);
}
}
else
{
JObject source = JObject.Parse(result);
mappedObject = info.DataMapper.Map(source);
}
}
else
{
mappedObject = new DataObject(result);
}
}
else if (result.StartsWith("["))
{
if (info.Validator != null)
{
if (info.Validator.SupportsStreamParsing && result.Length > info.Validator.SupportsStreamLength)
{
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(result)))
{
JArray? validSource = info.Validator.GetValidData(stream);
if (validSource == null)
{
if (info.FailHandler != null)
{
// UI 스레드에서 실패 핸들러 호출
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke("Data is not Valid");
}
return;
}
}
}
else
{
JArray source = JArray.Parse(result);
JArray? validSource = info.Validator.GetValidData(source);
if (validSource == null)
{
if (info.FailHandler != null)
{
// UI 스레드에서 실패 핸들러 호출
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke("Data is not Valid");
}
return;
}
}
}
if (info.DataMapper != null)
{
if (info.DataMapper.SupportsStreamParsing && result.Length > info.DataMapper.SupportsStreamLength)
{
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(result)))
{
if (info.Validator != null)
{
JArray? validSource = info.Validator.GetValidData(stream);
if (validSource != null)
{
mappedObject = info.DataMapper.Map(validSource);
}
}
else
{
mappedObject = info.DataMapper.MapArrayStream(stream);
}
}
}
else
{
JArray source = JArray.Parse(result);
if (info.Validator != null)
{
JArray? validSource = info.Validator.GetValidData(source);
if (validSource != null)
{
mappedObject = info.DataMapper.Map(validSource);
}
}
else
{
mappedObject = info.DataMapper.Map(source);
}
}
}
else
{
// DataMapper가 없는 경우, JArray를 IDataObject로 변환
mappedObject = new DataArray(result);
}
}
}
catch (JsonException ex)
{
ULog.Error($"JSON parsing error in ExecuteSingle for {key}: {ex.Message}\nResponse: {result}", ex);
throw; // 상위에서 처리하도록 다시 throw
}
}
// 핸들러 호출 전에 다시 취소 요청 확인
if (cancellationToken.IsCancellationRequested)
{
throw new OperationCanceledException("Operation cancelled", cancellationToken);
}
var repoObject = mappedObject;
if (mappedObject != null)
{
repoObject = DataRepository.Instance.AddOrUpdateData(key, mappedObject, info.UpdatedDataOnly);
if (repoObject == mappedObject) repoObject = mappedObject.Clone(fromPool: false);
}
// 갱신 된 데이터가 있는 경우 핸들러 호출
if (info.UpdatedDataOnly)
{
if (repoObject != null && repoObject.UpdatedCount > 0)
{
if (info.SuccessHandler != null)
{
// 로컬 변수로 복사하여 클로저에서 안전하게 사용
var handlerData = repoObject;
// UI 스레드에서 성공 핸들러 호출
await UniTask.SwitchToMainThread();
info.SuccessHandler.Invoke(handlerData);
}
return;
}
}
if (repoObject != null)
{
if (info.SuccessHandler != null)
{
// 로컬 변수로 복사하여 클로저에서 안전하게 사용
var handlerData = repoObject;
// UI 스레드에서 성공 핸들러 호출
await UniTask.SwitchToMainThread();
info.SuccessHandler.Invoke(handlerData);
}
}
else
{
if (info.FailHandler != null)
{
// UI 스레드에서 실패 핸들러 호출
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke("Data is Null");
}
}
await HttpDataProcessor.ProcessResponseAsync(key, info, result, cancellationToken);
return;
}

View File

@@ -0,0 +1,395 @@
#nullable enable
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Text;
using System.Threading;
using UVC.Data.Core;
using UVC.Log;
namespace UVC.Data.Http
{
/// <summary>
/// HTTP 응답 데이터를 처리하는 정적 클래스입니다.
/// </summary>
/// <remarks>
/// 이 클래스는 `HttpDataFetcher`로부터 데이터 처리 로직을 분리하여 재사용성을 높입니다.
/// HTTP 응답(문자열)을 입력받아, 설정된 규칙(`HttpRequestConfig`)에 따라 파싱, 유효성 검사,
/// 데이터 변환(`IDataObject`로 매핑) 및 결과 핸들러 호출까지의 과정을 담당합니다.
/// 모든 메서드는 정적(static)이므로 인스턴스 생성 없이 사용할 수 있습니다.
/// </remarks>
public static class HttpDataProcessor
{
/// <summary>
/// HTTP 응답 문자열을 비동기적으로 처리하고, 결과를 IDataObject로 변환한 후 적절한 핸들러를 호출합니다.
/// </summary>
/// <param name="key">요청을 식별하는 고유 키. 로그 및 데이터 저장소에서 사용됩니다.</param>
/// <param name="info">HTTP 요청에 대한 모든 설정(URL, 매퍼, 핸들러 등)을 담고 있는 객체입니다.</param>
/// <param name="responseContent">HTTP 요청으로부터 받은 원시 응답 문자열입니다.</param>
/// <param name="cancellationToken">비동기 작업을 취소하기 위한 토큰입니다.</param>
/// <remarks>
/// 이 메서드는 다음과 같은 순서로 응답을 처리합니다.
/// 1. 응답 문자열이 비어 있는지 확인합니다.
/// 2. `HttpResponseMask`를 적용하여 응답의 성공 여부를 판단하고 실제 데이터 부분을 추출합니다.
/// 3. 데이터가 분할 처리(Split) 대상인지, 단일 객체(Object)인지, 배열(Array)인지 확인하고 각각의 처리 메서드를 호출합니다.
/// 4. 처리된 데이터(`IDataObject`)를 `DataRepository`에 추가하거나 업데이트합니다.
/// 5. 설정에 따라 성공(`SuccessHandler`) 또는 실패(`FailHandler`) 핸들러를 메인 스레드에서 호출하여 UI 업데이트 등을 안전하게 처리할 수 있도록 합니다.
/// 6. 모든 과정에서 발생하는 예외(JSON 파싱, 작업 취소 등)를 처리하고 로그를 남깁니다.
/// </remarks>
public static async UniTask ProcessResponseAsync(string key, HttpRequestConfig info, string responseContent, CancellationToken cancellationToken)
{
// 매핑된 최종 데이터 객체를 담을 변수입니다. try-finally 블록에서 자원 해제를 위해 외부에 선언합니다.
IDataObject? mappedObject = null;
try
{
// 앞뒤 공백 제거
responseContent = responseContent.Trim();
// 응답이 비어있으면 실패로 간주하고 FailHandler를 호출합니다.
if (string.IsNullOrEmpty(responseContent))
{
// 핸들러는 UI와 상호작용할 수 있으므로 메인 스레드에서 호출합니다.
if (info.FailHandler != null)
{
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke("Response content is null or empty.");
}
return;
}
// ResponseMask를 사용해 응답이 성공적인지 확인하고, 실제 데이터 부분을 추출합니다.
// 예를 들어, 응답이 {"status":"OK", "data":{...}} 형태일 때, "status"가 "OK"인지 확인하고 "data" 부분만 가져옵니다.
HttpResponseResult responseResult = info.ResponseMask.Apply(responseContent);
if (!responseResult.IsSuccess)
{
if (info.FailHandler != null)
{
string errorMessage = responseResult.Message!;
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke(errorMessage);
}
return;
}
// 마스크를 통해 추출된 실제 데이터
responseContent = responseResult.Data!.Trim();
// 응답을 최상위 키를 기준으로 분할 처리해야 하는 경우
if (info.SplitResponseByKey && responseContent.StartsWith("{"))
{
await ProcessSplitResponse(info, responseContent, cancellationToken);
return; // 분할 처리가 완료되면 이 메서드의 나머지 로직은 실행하지 않습니다.
}
// 응답이 JSON 객체 형태인 경우 (e.g., {"id": 1, "name": "item"})
else if (responseContent.StartsWith("{"))
{
mappedObject = await ProcessObjectResponse(info, responseContent, cancellationToken);
if (mappedObject == null) return;
}
// 응답이 JSON 배열 형태인 경우 (e.g., [{"id": 1}, {"id": 2}])
else if (responseContent.StartsWith("["))
{
mappedObject = await ProcessArrayResponse(info, responseContent, cancellationToken);
if (mappedObject == null) return;
}
// 핸들러 호출 전 작업 취소 요청이 있었는지 다시 확인합니다.
cancellationToken.ThrowIfCancellationRequested();
// 매핑된 데이터를 DataRepository에 저장하거나 업데이트합니다.
var repoObject = mappedObject;
if (mappedObject != null)
{
// DataRepository는 모든 데이터를 중앙에서 관리하는 저장소입니다.
repoObject = DataRepository.Instance.AddOrUpdateData(key, mappedObject, info.UpdatedDataOnly);
// 만약 반환된 객체가 원본과 같다면, 핸들러에 전달하기 위해 복제본을 만듭니다.
if (repoObject == mappedObject) repoObject = mappedObject.Clone(fromPool: false);
}
// 'UpdatedDataOnly' 옵션이 켜져 있고, 실제로 데이터가 업데이트되었을 때만 핸들러를 호출합니다.
if (info.UpdatedDataOnly)
{
if (repoObject != null && repoObject.UpdatedCount > 0)
{
if (info.SuccessHandler != null)
{
var handlerData = repoObject;
await UniTask.SwitchToMainThread();
info.SuccessHandler.Invoke(handlerData);
}
return;
}
}
// 최종적으로 처리된 데이터가 있는 경우 성공 핸들러를 호출합니다.
if (repoObject != null)
{
if (info.SuccessHandler != null)
{
var handlerData = repoObject;
await UniTask.SwitchToMainThread();
info.SuccessHandler.Invoke(handlerData);
}
}
// 처리된 데이터가 없는 경우 실패 핸들러를 호출합니다.
else
{
if (info.FailHandler != null)
{
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke("Data is Null");
}
}
}
catch (JsonException ex)
{
// JSON 파싱 중 오류가 발생한 경우
ULog.Error($"JSON parsing error for {key}: {ex.Message}\nResponse: {responseContent}", ex);
if (info.FailHandler != null)
{
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke($"JSON parsing error: {ex.Message}");
}
}
catch (OperationCanceledException)
{
// 작업이 외부에서 취소된 경우, 예외를 다시 던져 상위 호출자에게 알립니다.
throw;
}
catch (Exception ex)
{
// 그 외 모든 예외 처리
ULog.Error($"Error processing response for {key}: {ex.Message}", ex);
if (info.FailHandler != null)
{
await UniTask.SwitchToMainThread();
info.FailHandler.Invoke($"Error processing response: {ex.Message}");
}
}
finally
{
// 매핑 과정에서 생성된 IDataObject 객체는 내부적으로 풀링될 수 있습니다.
// 처리가 끝난 객체는 다시 풀에 반환하여 메모리 할당을 줄입니다.
mappedObject?.ReturnToPool();
}
}
/// <summary>
/// 키-값 형태의 JSON 응답을 각 키별로 분할하여 처리합니다.
/// </summary>
/// <param name="info">HTTP 요청 설정 객체.</param>
/// <param name="jsonResponse">분할할 JSON 객체 문자열.</param>
/// <param name="cancellationToken">비동기 작업을 위한 취소 토큰.</param>
/// <remarks>
/// 예를 들어, `{"AGV": [...], "ALARM": [...]}` 같은 응답을 받으면,
/// "AGV"와 "ALARM"을 각각 별개의 데이터로 간주하고 처리합니다.
/// 각 키에 대해 별도의 DataMapper나 Validator를 `HttpRequestConfig`에 설정할 수 있습니다.
/// </remarks>
public static async UniTask ProcessSplitResponse(HttpRequestConfig info, string jsonResponse, CancellationToken? cancellationToken = null)
{
JObject responseObject = JObject.Parse(jsonResponse);
// JSON 객체의 모든 프로퍼티(키-값 쌍)를 순회합니다.
foreach (var property in responseObject.Properties())
{
cancellationToken?.ThrowIfCancellationRequested();
string subKey = property.Name; // "AGV", "ALARM" 등
JToken subToken = property.Value; // `[...]` 또는 `{...}`
IDataObject? subMappedObject = null;
// 현재 키(subKey)에 대한 분할 설정을 가져옵니다.
DataMapperValidator? splitConfig = null;
if (info.SplitConfigs != null) info.SplitConfigs.TryGetValue(subKey, out splitConfig);
// 분할 설정에 지정된 매퍼와 유효성 검사기를 사용합니다. 없으면 null입니다.
var subKeyDataMapper = splitConfig?.DataMapper;
var subKeyValidator = splitConfig?.Validator;
try
{
// 하위 데이터가 배열 또는 객체 형태인지에 따라 적절한 처리 메서드를 호출합니다.
if (subToken is JArray)
{
// 분할 처리 중 개별 항목의 실패가 전체 실패로 이어지지 않도록 `invokeFailHandler`를 false로 설정합니다.
subMappedObject = await ProcessArrayResponse(info, subToken.ToString(), cancellationToken, subKeyDataMapper, subKeyValidator, invokeFailHandler: false);
}
else if (subToken is JObject)
{
subMappedObject = await ProcessObjectResponse(info, subToken.ToString(), cancellationToken, subKeyDataMapper, subKeyValidator, invokeFailHandler: false);
}
// 매핑된 결과가 없으면 (예: 유효성 검사 실패) 다음 키로 넘어갑니다.
if (subMappedObject == null)
{
continue;
}
// 분할된 데이터를 `subKey`를 키로 사용하여 DataRepository에 저장합니다.
var repoObject = DataRepository.Instance.AddOrUpdateData(subKey, subMappedObject, info.UpdatedDataOnly);
// 핸들러 호출 조건(데이터가 있거나, 업데이트된 경우)을 확인합니다.
bool shouldInvokeHandler = repoObject != null && (!info.UpdatedDataOnly || repoObject.UpdatedCount > 0);
if (shouldInvokeHandler && info.SuccessHandler != null)
{
var handlerData = repoObject.Clone(fromPool: false);
await UniTask.SwitchToMainThread();
info.SuccessHandler.Invoke(handlerData);
// 다음 키 처리를 위해 다시 스레드 풀로 전환합니다.
await UniTask.SwitchToThreadPool();
}
}
finally
{
// 사용이 끝난 객체는 풀에 반환합니다.
subMappedObject?.ReturnToPool();
}
}
}
private static async UniTask<IDataObject?> ProcessObjectResponse(HttpRequestConfig info, string jsonResponse, CancellationToken? cancellationToken, DataMapper? dataMapper = null, DataValidator? validator = null, bool invokeFailHandler = true)
{
Action<string>? failHandler = invokeFailHandler ? info.FailHandler : null;
return await ProcessObjectResponse(jsonResponse, cancellationToken, dataMapper ?? info.DataMapper, validator ?? info.Validator, failHandler);
}
/// <summary>
/// 단일 JSON 객체 응답을 검증하고 매핑합니다.
/// </summary>
/// <param name="jsonResponse">처리할 JSON 객체 문자열.</param>
/// <param name="cancellationToken">취소 토큰.</param>
/// <param name="dataMapper">사용할 데이터 매퍼. null이면 원시 데이터를 반환합니다.</param>
/// <param name="validator">사용할 유효성 검사기. null이면 검사를 생략합니다.</param>
/// <param name="failHandler">실패 시 호출할 핸들러.</param>
/// <returns>매핑된 IDataObject 또는 null(실패 시).</returns>
/// <remarks>
/// 이 메서드는 먼저 `DataValidator`를 통해 데이터의 유효성을 검사하고,
/// 통과하면 `DataMapper`를 사용해 JSON을 `IDataObject`로 변환합니다.
/// 대용량 JSON의 경우 메모리 효율을 위해 스트림 기반 파싱을 지원합니다.
/// </remarks>
public static async UniTask<IDataObject?> ProcessObjectResponse(string jsonResponse, CancellationToken? cancellationToken, DataMapper? dataMapper, DataValidator? validator, Action<string>? failHandler)
{
// 유효성 검사기가 설정된 경우
if (validator != null)
{
bool isValid;
// 스트림 파싱을 지원하고 데이터가 충분히 큰 경우, 스트림으로 유효성을 검사합니다.
if (validator.SupportsStreamParsing && jsonResponse.Length > validator.SupportsStreamLength)
{
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonResponse));
isValid = validator.IsValid(stream);
}
else
{
JObject source = JObject.Parse(jsonResponse);
isValid = validator.IsValid(source);
}
// 유효성 검사에 실패하면 실패 핸들러를 호출하고 null을 반환합니다.
if (!isValid)
{
if (failHandler != null)
{
await UniTask.SwitchToMainThread();
failHandler.Invoke("Data is not Valid");
}
return null;
}
}
cancellationToken?.ThrowIfCancellationRequested();
// 데이터 매퍼가 설정된 경우
if (dataMapper != null)
{
// 스트림 파싱 지원 여부에 따라 매핑 방식을 선택합니다.
if (dataMapper.SupportsStreamParsing && jsonResponse.Length > dataMapper.SupportsStreamLength)
{
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonResponse));
return dataMapper.MapObjectStream(stream);
}
else
{
JObject source = JObject.Parse(jsonResponse);
return dataMapper.Map(source);
}
}
else
{
// 매퍼가 없으면 원시 JSON 문자열을 그대로 `DataObject`로 감싸 반환합니다.
return new DataObject(jsonResponse);
}
}
private static async UniTask<IDataObject?> ProcessArrayResponse(HttpRequestConfig info, string jsonResponse, CancellationToken? cancellationToken, DataMapper? dataMapper = null, DataValidator? validator = null, bool invokeFailHandler = true)
{
Action<string>? failHandler = invokeFailHandler ? info.FailHandler : null;
return await ProcessArrayResponse(jsonResponse, cancellationToken, dataMapper ?? info.DataMapper, validator ?? info.Validator, failHandler);
}
/// <summary>
/// JSON 배열 응답을 검증하고 매핑합니다.
/// </summary>
/// <param name="jsonResponse">처리할 JSON 배열 문자열.</param>
/// <param name="cancellationToken">취소 토큰.</param>
/// <param name="dataMapper">사용할 데이터 매퍼. null이면 원시 데이터를 반환합니다.</param>
/// <param name="validator">사용할 유효성 검사기. null이면 검사를 생략합니다.</param>
/// <param name="failHandler">실패 시 호출할 핸들러.</param>
/// <returns>매핑된 IDataObject(보통 DataArray) 또는 null(실패 시).</returns>
/// <remarks>
/// `DataValidator`를 통해 배열의 각 항목을 필터링하여 유효한 데이터만 포함하는 새 배열을 만들 수 있습니다.
/// 그 후 `DataMapper`를 통해 배열 전체를 `DataArray` 객체로 변환합니다.
/// </remarks>
public static async UniTask<IDataObject?> ProcessArrayResponse(string jsonResponse, CancellationToken? cancellationToken, DataMapper? dataMapper, DataValidator? validator, Action<string>? failHandler)
{
JArray? sourceArray;
// 유효성 검사기가 설정된 경우
if (validator != null)
{
// 스트림 파싱 지원 여부에 따라 유효한 데이터만 필터링합니다.
if (validator.SupportsStreamParsing && jsonResponse.Length > validator.SupportsStreamLength)
{
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonResponse));
sourceArray = validator.GetValidData(stream);
}
else
{
sourceArray = validator.GetValidData(JArray.Parse(jsonResponse));
}
// 유효한 데이터가 하나도 없는 경우
if (sourceArray == null || sourceArray.Count == 0)
{
if (failHandler != null)
{
await UniTask.SwitchToMainThread();
failHandler.Invoke("Data is not Valid or empty after validation");
}
return null;
}
}
else
{
// 검사기가 없으면 원본 배열을 그대로 사용합니다.
sourceArray = JArray.Parse(jsonResponse);
}
cancellationToken?.ThrowIfCancellationRequested();
// 데이터 매퍼가 설정된 경우, 필터링된 배열을 매핑합니다.
if (dataMapper != null)
{
return dataMapper.Map(sourceArray);
}
else
{
// 매퍼가 없으면 필터링된 배열을 `DataArray`로 감싸 반환합니다.
return new DataArray(sourceArray.ToString());
}
}
}
}

View File

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

View File

@@ -1,6 +1,5 @@
#nullable enable
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using UVC.Data.Core;
@@ -24,6 +23,18 @@ namespace UVC.Data.Http
/// .setFailHandler(errorData => Console.Error.WriteLine(errorData)) // 실패 핸들러 예시
/// .setRetry(5, 2000)
/// .setRepeat(true, 10, 5000);
///
/// // 응답을 키별로 분할하는 설정
/// // 응답이 {"AGV": [...], "ALARM": [...]} 형태일 때 사용
/// var splitConfig = new HttpRequestConfig("https://api.example.com/alldata")
/// .setSplitResponseByKey(true) // 이 옵션을 활성화
/// .AddSplitConfig("AGV", new DataMapper(agvMask), agvValidator)
/// .AddSplitConfig("ALARM", new DataMapper(alarmMask))
/// .setSuccessHandler(splitData => {
/// // HttpDataFetcher 구현에 따라, 분할된 각 데이터가 처리된 후 이 핸들러가 호출될 수 있습니다.
/// // 이 경우 핸들러의 IDataObject는 null일 수 있습니다.
/// Console.WriteLine("Split data processing completed.");
/// });
/// </code>
/// </example>
public class HttpRequestConfig
@@ -38,10 +49,12 @@ namespace UVC.Data.Http
private int _repeatCount = 0; // 반복 횟수, 0은 무한 반복
private int _repeatInterval = 1000; // 반복 간격 (ms)
private DataMapper? _dataMapper = null; // 데이터 매퍼
private Dictionary<string, DataMapperValidator>? _splitConfigs = null; // 분할 응답에 대한 구성
private HttpResponseMask _responseMask = new HttpResponseMask(); // response 데이터 성공 여부와 데이터를 구분하는 마스크
private int _maxRetryCount = 3;
private int _retryDelay = 1000; // 밀리초
private bool _updatedDataOnly = false; // 업데이트된 데이터만 받을 여부
private bool _splitResponseByKey = false; // 응답을 키별로 분할할지 여부
/// <summary>
/// HTTP 응답 데이터의 유효성을 검사하는 데 사용되는 검사기입니다.
@@ -139,6 +152,11 @@ namespace UVC.Data.Http
/// </remarks>
public DataValidator? Validator => _validator;
/// <summary>
/// 분할된 응답의 각 키에 대한 구성을 포함합니다.
/// </summary>
public IReadOnlyDictionary<string, DataMapperValidator>? SplitConfigs => _splitConfigs;
/// <summary>
/// HTTP 응답의 성공 여부를 확인하고, 성공 시 실제 데이터 페이로드를 추출하는 데 사용되는 <see cref="Data.HttpResponseMask"/>입니다.
/// 이 객체에 정의된 규칙에 따라 원시 응답 문자열이 처리됩니다.
@@ -160,6 +178,11 @@ namespace UVC.Data.Http
/// </summary>
public bool UpdatedDataOnly => _updatedDataOnly;
/// <summary>
/// 응답 JSON을 최상위 키를 기준으로 분할하여 각각 DataRepository에 저장할지 여부를 나타냅니다.
/// </summary>
public bool SplitResponseByKey => _splitResponseByKey;
/// <summary>
/// HttpRequestConfig 클래스의 새 인스턴스를 초기화합니다.
/// </summary>
@@ -236,6 +259,23 @@ namespace UVC.Data.Http
return this;
}
/// <summary>
/// 분할된 응답의 특정 키에 대한 구성을 추가합니다.
/// </summary>
/// <param name="key">구성할 응답의 키입니다.</param>
/// <param name="dataMapper">이 키에 사용할 데이터 매퍼입니다.</param>
/// <param name="validator">이 키에 사용할 데이터 유효성 검사기입니다.</param>
/// <returns>현재 HttpRequestConfig 인스턴스 (메서드 체이닝용)</returns>
public HttpRequestConfig AddSplitConfig(string key, DataMapperValidator? dataMapperValidator = null)
{
if (_splitConfigs == null)
{
_splitConfigs = new Dictionary<string, DataMapperValidator>();
}
if(dataMapperValidator != null)_splitConfigs[key] = dataMapperValidator;
return this;
}
/// <summary>
/// HTTP 파이프라인에 적용할 ResponseMask를 설정하고 업데이트된 파이프라인 구성을 반환합니다.
/// </summary>
@@ -319,5 +359,18 @@ namespace UVC.Data.Http
return this;
}
/// <summary>
/// 응답 JSON을 최상위 키를 기준으로 분할하여 처리할지 여부를 설정합니다.
/// true로 설정하면, 응답이 {"key1": [...], "key2": [...]} 형태일 때,
/// key1과 key2를 각각의 키로 사용하여 DataRepository에 데이터를 추가/업데이트합니다.
/// </summary>
/// <param name="split">분할 처리 여부</param>
/// <returns>현재 HttpRequestConfig 인스턴스 (메서드 체이닝용)</returns>
public HttpRequestConfig setSplitResponseByKey(bool split)
{
_splitResponseByKey = split;
return this;
}
}
}

View File

@@ -5,9 +5,9 @@ using Newtonsoft.Json.Linq;
using SampleProject.Config;
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using System.Threading;
using UVC.Data.Core;
using UVC.Data.Http;
using UVC.Log;
using UVC.Tests;
@@ -170,6 +170,7 @@ namespace UVC.Data.Mqtt
{
if (!UseMockup)
{
if (mqttWorker.IsRunning) return;
foreach (var topic in topics)
{
mqttWorker.AddListener(topic, OnTopicPacketMessage);
@@ -195,11 +196,11 @@ namespace UVC.Data.Mqtt
/// 이 메서드를 호출하기 전에 <paramref name="packets"/> 매개변수가 null이 아닌지 확인하십시오.</remarks>
/// <param name="packets">처리할 <see cref="MqttDataPacket"/> 객체 목록입니다. null일 수 없습니다.</param>
private void OnTopicPacketMessage(string topic, List<MqttDataPacket> packets)
{
{
OnTopicMessage(topic, MqttDataPacket.ToJsonFromList(packets));
}
private void OnTopicMessage(string topic, string message)
{
@@ -230,7 +231,7 @@ namespace UVC.Data.Mqtt
/// 등록된 데이터 매퍼를 통해 메시지를 변환한 후, 해당 토픽에 등록된 핸들러에게 전달합니다.
/// 'UpdatedDataOnly' 설정에 따라 데이터가 변경된 경우에만 핸들러를 호출할 수도 있습니다.
/// </remarks>
private void OnTopicMessageLogic(string topic, string message)
private async void OnTopicMessageLogic(string topic, string message)
{
// 토픽이 infoList와 readyHandlerList에 존재하고, 준비 상태가 true인 경우에만 처리합니다.
if (infoList.ContainsKey(topic))
@@ -244,37 +245,11 @@ namespace UVC.Data.Mqtt
{
if (message.StartsWith("{"))
{
JObject source = JObject.Parse(message);
if (info.Validator != null && !info.Validator.IsValid(source)) return;
if (info.DataMapper != null)
{
mappedObject = info.DataMapper.Map(source);
}
else
{
// DataMapper가 없으면 JObject를 IDataObject로 변환
mappedObject = new DataObject(source);
}
mappedObject = await HttpDataProcessor.ProcessObjectResponse(message, null, info.DataMapper, info.Validator, null);
}
else if (message.StartsWith("["))
{
JArray source = JArray.Parse(message);
if (info.Validator != null)
{
JArray? validSource = info.Validator.GetValidData(source);
// 유효성 검사 실패 시 핸들러 호출을 중단
if (validSource == null || validSource.Count == 0) return;
source = validSource;
}
if (info.DataMapper != null)
{
mappedObject = info.DataMapper.Map(source);
}
else
{
// DataMapper가 없으면 JArray를 IDataObject로 변환
mappedObject = new DataArray(source);
}
mappedObject = await HttpDataProcessor.ProcessArrayResponse(message, null, info.DataMapper, info.Validator, null);
}
if (mappedObject == null) return;
@@ -316,6 +291,7 @@ namespace UVC.Data.Mqtt
{
if (!UseMockup)
{
if (!mqttWorker.IsRunning) return;
foreach (var topic in infoList.Keys)
{
mqttWorker.RemoveListener(topic, OnTopicPacketMessage);

View File

@@ -36,6 +36,7 @@ namespace UVC.Data.Mqtt
private Thread workerThread;
private volatile bool isRunning = false;
public bool IsRunning => isRunning;
/// <summary>
/// 스레드를 안전하게 종료시키기 위한 CancellationTokenSource 입니다.

View File

@@ -6,27 +6,27 @@ using System.Collections.Generic;
namespace UVC.Data
{
/// <summary>
/// URL 주소를 키-값 쌍으로 저장하고 관리하는 클래스입니다.
/// URL 주소를 키-값 쌍으로 저장하고 관리하는 클래스입니다.
/// </summary>
public static class URLList
{
/// <summary>
/// URL을 저장하는 내부 Dictionary 컬렉션
/// URL을 저장하는 내부 Dictionary 컬렉션
/// </summary>
private static Dictionary<string, string> urls = new Dictionary<string, string>();
public static IReadOnlyDictionary<string, string> Urls => urls;
/// <summary>
/// 지정된 키와 URL을 컬렉션에 추가합니다. 키가 이미 존재하면 URL을 업데이트합니다.
/// 지정된 키와 URL을 컬렉션에 추가합니다. 키가 이미 존재하면 URL을 업데이트합니다.
/// </summary>
/// <param name="key">URL에 접근하기 위한 고유 키</param>
/// <param name="url">저장할 URL 문자열</param>
/// <param name="key">URL에 접근하기 위한 고유 키</param>
/// <param name="url">저장할 URL 문자열</param>
/// <example>
/// <code>
/// URLList.Add("google", "https://www.google.com");
/// URLList.Add("naver", "https://www.naver.com");
///
/// // 기존 키의 URL 업데이트
/// // 기존 키의 URL 업데이트
/// URLList.Add("google", "https://www.google.co.kr");
/// </code>
/// </example>
@@ -43,17 +43,17 @@ namespace UVC.Data
}
/// <summary>
/// 지정된 키에 해당하는 URL을 컬렉션에서 제거합니다.
/// 지정된 키에 해당하는 URL을 컬렉션에서 제거합니다.
/// </summary>
/// <param name="key">제거할 URL의 키</param>
/// <param name="key">제거할 URL의 키</param>
/// <example>
/// <code>
/// URLList.Add("temp", "https://www.temp.com");
///
/// // URL 제거
/// // URL 제거
/// URLList.Remove("temp");
///
/// // 존재하지 않는 키 제거 시도(아무 일도 발생하지 않음)
/// // 존재하지 않는 키 제거 시도(아무 일도 발생하지 않음)
/// URLList.Remove("nonexistent");
/// </code>
/// </example>
@@ -66,23 +66,23 @@ namespace UVC.Data
}
/// <summary>
/// 지정된 키가 컬렉션에 존재하는지 확인합니다.
/// 지정된 키가 컬렉션에 존재하는지 확인합니다.
/// </summary>
/// <param name="key">확인할 키</param>
/// <returns>키가 존재하면 true, 그렇지 않으면 false</returns>
/// <param name="key">확인할 키</param>
/// <returns>키가 존재하면 true, 그렇지 않으면 false</returns>
/// <example>
/// <code>
/// URLList.Add("github", "https://github.com");
///
/// // 키 존재 여부 확인
/// // 키 존재 여부 확인
/// if(URLList.ContainsKey("github"))
/// {
/// Console.WriteLine("GitHub URL이 존재합니다.");
/// Console.WriteLine("GitHub URL이 존재합니다.");
/// }
///
/// if(!URLList.ContainsKey("gitlab"))
/// {
/// Console.WriteLine("GitLab URL이 존재하지 않습니다.");
/// Console.WriteLine("GitLab URL이 존재하지 않습니다.");
/// }
/// </code>
/// </example>
@@ -92,26 +92,26 @@ namespace UVC.Data
}
/// <summary>
/// 지정된 키에 해당하는 URL을 반환합니다.
/// 지정된 키에 해당하는 URL을 반환합니다.
/// </summary>
/// <param name="key">가져올 URL의 키</param>
/// <returns>키에 해당하는 URL 또는 키가 존재하지 않을 경우 null</returns>
/// <param name="key">가져올 URL의 키</param>
/// <returns>키에 해당하는 URL 또는 키가 존재하지 않을 경우 null</returns>
/// <example>
/// <code>
/// URLList.Add("youtube", "https://www.youtube.com");
///
/// // URL 가져오기
/// // URL 가져오기
/// string youtubeUrl = URLList.Get("youtube");
/// if (youtubeUrl != null)
/// {
/// Console.WriteLine($"YouTube URL: {youtubeUrl}");
/// }
///
/// // 존재하지 않는 키로 URL 가져오기
/// // 존재하지 않는 키로 URL 가져오기
/// string nullUrl = URLList.Get("nonexistent");
/// if (nullUrl == null)
/// {
/// Console.WriteLine("URL이 존재하지 않습니다.");
/// Console.WriteLine("URL이 존재하지 않습니다.");
/// }
/// </code>
/// </example>
@@ -125,14 +125,14 @@ namespace UVC.Data
}
/// <summary>
/// URL에서 도메인 부분을 추출합니다.
/// URL에서 도메인 부분을 추출합니다.
/// </summary>
/// <param name="url">도메인을 추출할 URL</param>
/// <returns>추출된 도메인 또는 파싱 실패 시 null</returns>
/// <param name="url">도메인을 추출할 URL</param>
/// <returns>추출된 도메인 또는 파싱 실패 시 null</returns>
/// <example>
/// <code>
/// string domain = URLList.ExtractDomain("https://www.example.com/path/page.html");
/// Console.WriteLine(domain); // 출력: www.example.com
/// Console.WriteLine(domain); // 출력: www.example.com
/// </code>
/// </example>
public static string? ExtractDomain(string url)

View File

@@ -81,59 +81,31 @@ namespace UVC.Factory.Alarm
/// 이 메서드는 외부에서 호출되어야 알람 데이터 수신이 시작됩니다.
/// </summary>
public void Run()
{
// 1. 데이터 마스크(DataMask) 정의:
// 수신할 데이터의 구조를 미리 정의합니다. 여기서 정의된 키(Key)들을 기준으로 데이터를 파싱합니다.
var dataMask = new DataMask();
dataMask.ObjectName = "Alarm"; // Alarm 객체의 이름을 설정합니다.
dataMask.ObjectIdKey = "ID"; // Alarm의 고유 식별자로 사용할 키를 설정합니다.
dataMask["ID"] = "";
dataMask["ALARM_TYPE"] = "";
dataMask["LEVEL"] = "";
dataMask["LOGISTIC"] = "";
dataMask["STATE"] = "";
dataMask["MESSAGE"] = "";
dataMask["CODE"] = "";
dataMask["ICON"] = "";
dataMask["MACHINENAME"] = "";
dataMask["SHOPNAME"] = "";
dataMask["TRANSPORT_EQP_NAME"] = "";
dataMask["TRANSPORT_UNIT_NAME"] = "";
dataMask["TRANSPORT_EQP_ID"] = "";
dataMask["TRANSPORT_UNIT_ID"] = "";
dataMask["CLEAR_TIME"] = DateTime.Now;
dataMask["SET_TIME"] = DateTime.Now;
dataMask["UPDATE_TIME"] = DateTime.Now;
dataMask["TIMESTAMP"] = DateTime.Now;
// 2. 데이터 유효성 검사기(DataValidator) 설정:
// 수신된 데이터가 유효한지 검사하는 규칙을 추가합니다.
// 여기서는 "MACHINENAME" 필드가 null이 아닌지 확인합니다.
DataValidator validator = new DataValidator();
validator.AddValidator("MACHINENAME", value => value != null);
// 3. MQTT 파이프라인 정보(MqttSubscriptionConfig) 생성:
{
// MQTT 파이프라인 정보(MqttSubscriptionConfig) 생성:
// - "ALARM" 토픽을 구독합니다.
// - 위에서 정의한 dataMask를 사용해 수신된 JSON 데이터를 DataObject로 변환합니다.
// - validator를 사용해 데이터의 유효성을 검사합니다.
// - 유효한 데이터가 수신되면 OnUpdateData 메서드를 호출하여 처리합니다.
var pipelineInfo = new MqttSubscriptionConfig("ALARM")
.setDataMapper(new DataMapper(dataMask))
.setValidator(validator)
.setHandler(OnUpdateData);
var pipelineInfo = new MqttSubscriptionConfig("ALARM");
var dataMapperValidator = DataMapperValidator.Get("ALARM");
if (dataMapperValidator?.DataMapper != null) pipelineInfo.setDataMapper(dataMapperValidator.DataMapper);
if (dataMapperValidator?.Validator != null) pipelineInfo.setValidator(dataMapperValidator.Validator);
// 4. 생성한 파이프라인을 전역 MQTT 파이프라인에 추가하여 데이터 수신을 시작합니다.
DataRepository.Instance.MqttReceiver.Add(pipelineInfo);
}
//playback에서도 데이터를 업데이트 하기에 DataRepository에 핸들러를 추가합니다.
DataRepository.Instance.AddDataUpdateHandler("ALARM", OnUpdateData);
}
/// <summary>
/// MQTT 파이프라인으로부터 데이터가 업데이트될 때마다 호출되는 메인 핸들러입니다.
/// 수신된 알람 데이터 배열을 분석하여 추가, 수정, 제거된 알람을 각각 처리합니다.
/// </summary>
/// <param name="data">수신된 데이터 객체 (DataArray 형태여야 함)</param>
public void OnUpdateData(IDataObject? data)
public void OnUpdateData(IDataObject data)
{
if (data == null) return;

View File

@@ -112,43 +112,18 @@ namespace UVC.Factory.Component
private async void OnSceneInitializedAsync()
{
await InitializePoolAsync();
//데이터를 어떤 형식으로 받을지 정의합니다.
var dataMask = new DataMask();
dataMask.ObjectName = "AGV"; // AGV 객체의 이름을 설정합니다.
dataMask.ObjectIdKey = "VHL_NAME"; // AGV의 고유 식별자로 사용할 키를 설정합니다.
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;
// MQTT 파이프라인 정보를 생성합니다.
// 'AGV' 토픽을 구독하고, 받은 데이터는 위에서 정의한 dataMask로 매핑하며,
// 데이터 유효성 검사를 위해 DataValidator를 설정합니다.
// 데이터가 업데이트되면 OnUpdateData 메서드를 호출하여 처리합니다.
var pipelineInfo = new MqttSubscriptionConfig("AGV");
DataValidator validator = new DataValidator();
//validator.AddValidator("JOB_ID", value => value != null);
validator.AddValidator("VHL_NAME", value => value != null && value!.ToString() == "HFF09CNA8016");
var pipelineInfo = new MqttSubscriptionConfig("AGV")
.setDataMapper(new DataMapper(dataMask))
//.setValidator(validator)
.setHandler(OnUpdateData);
var dataMapperValidator = DataMapperValidator.Get("AGV");
if (dataMapperValidator?.DataMapper != null) pipelineInfo.setDataMapper(dataMapperValidator.DataMapper);
if (dataMapperValidator?.Validator != null) pipelineInfo.setValidator(dataMapperValidator.Validator);
// 생성한 파이프라인 정보를 전역 MQTT 파이프라인에 추가합니다.
DataRepository.Instance.MqttReceiver.Add(pipelineInfo);
//playback에서도 데이터를 업데이트 하기에 DataRepository에 핸들러를 추가합니다.
DataRepository.Instance.AddDataUpdateHandler("AGV", OnUpdateData);
}
/// <summary>
@@ -173,7 +148,7 @@ namespace UVC.Factory.Component
/// 추가, 제거, 수정된 AGV 데이터를 각각 구분하여 처리합니다.
/// </summary>
/// <param name="data">수신된 데이터 객체 (DataArray 형태)</param>
public void OnUpdateData(IDataObject? data)
public void OnUpdateData(IDataObject data)
{
if (data == null || agvPool == null) return;
@@ -244,7 +219,7 @@ namespace UVC.Factory.Component
{
base.OnDestroy();
SceneMain.Instance.Initialized -= OnSceneInitializedAsync;
DataRepository.Instance.MqttReceiver.Remove("AGV");
DataRepository.Instance.RemoveDataUpdateHandler("AGV", OnUpdateData);
agvPool?.ClearRecycledItems();
}
}

View File

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

View File

@@ -0,0 +1,43 @@
using UnityEngine;
using UVC.Data;
using UVC.Factory.Playback.UI;
using UVC.UI.Commands;
using UVC.UI.Loading;
using UVC.UI.Modal;
namespace UVC.Factory.Playback
{
public class PlaybackCommand : ICommand
{
public async void Execute(object parameter = null)
{
var modalContent = new ModalContent("Prefabs/Factory/Playback/UIPlaybackListModal")
{
Title = "Playback List",
ConfirmButtonText = "Play",
ShowCancelButton = false
};
object result = await UVC.UI.Modal.Modal.Open<bool>(modalContent);
Debug.Log($"PlaybackCommand result:{result}");
if (result != null)
{
UIPlaybackListItemData data = (UIPlaybackListItemData)result;
Debug.Log($"PlaybackCommand data:{data}");
UIPlayback.Instance.Show();
DataRepository.Instance.MqttReceiver.Stop();
await UIPlayback.Instance.SetData(data.date, data.time, data.sqlFileName);
}
else
{
UILoading.Show();
PlaybackService.Instance.Stop();
UILoading.Hide();
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 071f03b6e7e6d0342a5fe94183a1db70

View File

@@ -0,0 +1,107 @@
#nullable enable
using Best.HTTP;
using Cysharp.Threading.Tasks;
using SampleProject.Config;
using System;
using System.Collections.Generic;
using UnityEngine;
using UVC.Network;
namespace UVC.Factory.Playback
{
public class PlaybackRepository
{
private PlaybackSQLiteService? sqliteService = null;
public async UniTask<Dictionary<string, Dictionary<string, string>>?> RequestPlaybackDateList()
{
//local
//string path = System.IO.Path.Combine(Application.streamingAssetsPath, "playbackList.json");
//string json = System.IO.File.ReadAllText(path);
//HttpResponseModel<Dictionary<string, Dictionary<string, string>>> localData = JsonHelper.FromJson<HttpResponseModel<Dictionary<string, Dictionary<string, string>>>>(json);
//return new EntityWithState<Dictionary<string, Dictionary<string, string>>>(APIState.Loaded, localData.data);
try
{
return await UniTask.RunOnThreadPool<Dictionary<string, Dictionary<string, string>>?>(async () =>
{
var response = await HttpRequester.RequestGet<HttpResponseModel<Dictionary<string, Dictionary<string, string>>>>($"{Constants.PlaybackDomain}/playback/list");
if (response.message.ToLower() == "success")
{
return new Dictionary<string, Dictionary<string, string>>(response.data);
}
return null;
});
}
catch (Exception e)
{
Debug.Log($"Exception {e.ToString()}");
return null;
}
}
public HTTPRequest? DownloadPlaybackData(string fileName, string savePath, Action<long, long> OnProgress, Action OnComplete, Action<string> OnError)
{
try
{
return HttpRequester.Download($"{Constants.PlaybackDomain}/playback/{fileName}", savePath, OnComplete, OnProgress, OnError);
}
catch (Exception e)
{
Debug.Log($"Exception {e.ToString()}");
return null;
}
}
/// <summary>
/// selectTime보다 +- second 사이의 데이터 요청. selectTime, second 포함
/// </summary>
/// <param name="date"></param>
/// <param name="sqlFileName"></param>
/// <param name="selectTime">yyyy-MM-ddTHH:mm:ss.fffZ format string</param>
/// <param name="second"></param>
/// <param name="orderAsc">true: 오래된 시간이 먼저, false: 최근 시간이 먼저</param>
/// <param name="limit"></param>
/// <returns></returns>
public async UniTask<List<PlaybackSQLiteDataEntity>> SelectBySecondAsync(string date, string sqlFileName, string selectTime, int second, bool orderAsc = true, int limit = 0)
{
validationSqliteService(date, sqlFileName);
return await sqliteService!.SelectBySecond(selectTime, second, orderAsc, limit);
}
/// <summary>
/// selectTime보다 +- second 사이의 데이터 요청. selectTime, second 포함
/// </summary>
/// <param name="date"></param>
/// <param name="sqlFileName"></param>
/// <param name="selectTime">yyyy-MM-ddTHH:mm:ss.fffZ format string</param>
/// <param name="second"></param>
/// <param name="orderAsc">true: 오래된 시간이 먼저, false: 최근 시간이 먼저</param>
/// <param name="limit"></param>
/// <returns></returns>
public async UniTask<List<PlaybackSQLiteDataEntity>> SelectBySecondBaseInfo(string date, string sqlFileName, string selectTime, int second = 59, bool orderAsc = true, int limit = 1)
{
validationSqliteService(date, sqlFileName);
return await sqliteService!.SelectBySecondBaseInfo(selectTime, second, orderAsc, limit);
}
private void validationSqliteService(string date, string sqlFileName)
{
if (sqliteService == null) sqliteService = new PlaybackSQLiteService();
if (sqliteService.Connected)
{
if (sqliteService.Date != date || sqliteService.SqliteFileName != sqlFileName)
{
sqliteService.CloseDB();
}
}
sqliteService.Connect(date, sqlFileName);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 131e22b5d8e3f214cafd3ad0848fce28

View File

@@ -0,0 +1,164 @@
using Cysharp.Threading.Tasks;
using SQLite4Unity3d;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UVC.Util;
namespace UVC.Factory
{
public class PlaybackSQLiteService
{
//#region Singleton
//private static readonly SQLiteService instance = new SQLiteService();
//public static SQLiteService Instance => instance;
//static SQLiteService() { }
//#endregion
private SQLiteConnection dbConnection;
public bool Connected { get => dbConnection != null; }
private string date;
public string Date { get => date; }
private string sqliteFileName;
public string SqliteFileName { get => sqliteFileName; }
public void Connect(string date, string sqliteFileName)
{
this.date = date;
this.sqliteFileName = sqliteFileName;
dbConnection = new SQLiteConnection(Path.Combine(Application.streamingAssetsPath, "playback", date, sqliteFileName));
}
public void CloseDB()
{
dbConnection.Close();
dbConnection = null;
}
/// <summary>
/// 추가하기
/// </summary>
/// <param name="data"></param>
/// <param name="timeStamp">yyyy-MM-ddTHH:mm:ss.fffZ format string</param>
/// <param name="temp"></param>
/// <returns>데이터베이스에서 추가된 행 수</returns>
public int Insert(string data, string timeStamp, string temp = null)
{
var query = $"INSERT INTO realTime (data, timestamp, temp) VALUES ('{data}', '{timeStamp}', " + (temp == null ? "null" : "'" + temp + "'") + ");";
int changedRowLen = dbConnection.Execute(query);
return changedRowLen;
}
/// <summary>
/// selectTime보다 +- second 사이의 데이터 요청. selectTime, second 포함
/// second > 0 : selectTime <= data < selectTime + second
/// second < 0 : selectTime + second < data <= selectTime
/// </summary>
/// <param name="selectTime">yyyy-MM-ddTHH:mm:ss.fffZ format string</param>
/// <param name="second"></param>
/// <param name="orderAsc">true: 오래된 시간이 먼저, false: 최근 시간이 먼저</param>
/// <param name="limit"></param>
/// <returns></returns>
///
readonly string[] queryParts =
{
"SELECT * FROM realTime WHERE ",
"timestamp >= '",
"' AND timestamp < '",
"timestamp <= '",
"' AND timestamp > '",
" ORDER BY timestamp ",
" LIMIT ",
};
public async UniTask<List<PlaybackSQLiteDataEntity>> SelectBySecond(string selectTime, int second, bool orderAsc = true, int limit = 0)
{
List<PlaybackSQLiteDataEntity> result = await UniTask.RunOnThreadPool(() =>
{
DateTime date = DateTimeUtil.UtcParse(selectTime).AddSeconds(second);
string targetTime = DateTimeUtil.FormatTime(date);
//Debug.Log($"SelectBySecondBaseInfo {selectTime} {second} {targetTime} {date}");
queryBuilder.Append(queryParts[0]);
//second가 selectTime 보다 더 미래면
if (second > 0)
{
queryBuilder.Append($"{queryParts[1]}{selectTime}{queryParts[2]}{targetTime}'");
}
else
{
//second가 selectTime 보다 더 과거면
queryBuilder.Append($"{queryParts[3]}{selectTime}{queryParts[4]}{targetTime}'");
}
queryBuilder.Append($"{queryParts[5]}{(orderAsc ? "asc" : "desc")}");
if (limit > 0)
queryBuilder.Append($"{queryParts[6]}{limit}");
queryBuilder.Append(";");
//Debug.Log($"SelectBySecond {query}");
var query = queryBuilder.ToString();
queryBuilder.Clear();
return dbConnection.Query<PlaybackSQLiteDataEntity>(query);
});
return result;
}
/// <summary>
/// selectTime보다 +- second 사이의 데이터 요청. selectTime, second 포함
/// second > 0 : selectTime <= data < selectTime + second
/// second < 0 : selectTime + second < data <= selectTime
/// </summary>
/// <param name="selectTime">yyyy-MM-ddTHH:mm:ss.fffZ format string</param>
/// <param name="second"></param>
/// <param name="orderAsc">true: 오래된 시간이 먼저, false: 최근 시간이 먼저</param>
/// <param name="limit"></param>
/// <returns></returns>
///
StringBuilder queryBuilder = new();
public async UniTask<List<PlaybackSQLiteDataEntity>> SelectBySecondBaseInfo(string selectTime, int second, bool orderAsc = false, int limit = 1)
{
List<PlaybackSQLiteDataEntity> result = await UniTask.RunOnThreadPool(() =>
{
DateTime date = DateTimeUtil.UtcParse(selectTime).AddSeconds(second);
string targetTime = DateTimeUtil.FormatTime(date);
//Debug.Log($"SelectBySecondBaseInfo {selectTime} {second} {targetTime} {date}");
queryBuilder.Append($"SELECT * FROM baseInfo WHERE ");
//second가 selectTime 보다 더 미래면
if (second > 0)
{
queryBuilder.Append($"timestamp >= '{selectTime}' AND timestamp < '{targetTime}'");
}
else
{
//second가 selectTime 보다 더 과거면
queryBuilder.Append($"timestamp <= '{selectTime}' AND timestamp > '{targetTime}'");
}
queryBuilder.Append($" ORDER BY timestamp {(orderAsc ? "asc" : "desc")}");
if (limit > 0) queryBuilder.Append($" LIMIT {limit}");
queryBuilder.Append(";");
//Debug.Log($"SelectBySecondBaseInfo {query}");
var query = queryBuilder.ToString();
queryBuilder.Clear();
return dbConnection.Query<PlaybackSQLiteDataEntity>(query);
});
return result;
}
}
[System.Serializable]
public class PlaybackSQLiteDataEntity
{
public string data { get; set; }
[PrimaryKey]
public string timestamp { get; set; }
public DateTime timestampHungary { get => DateTimeUtil.UtcStringToKoreaDateTime(timestamp); }
public string temp { get; set; }
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 10c4a6d7e00d6e04eb5efd504572f689

View File

@@ -0,0 +1,207 @@
#nullable enable
using Best.HTTP;
using Cysharp.Threading.Tasks;
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UVC.Data;
using UVC.Data.Core;
using UVC.Data.Http;
using UVC.Json;
using UVC.Util;
namespace UVC.Factory.Playback
{
public class PlaybackService
{
#region Singleton
private static readonly PlaybackService instance = new PlaybackService(new PlaybackRepository());
public static PlaybackService Instance => instance;
static PlaybackService() { }
#endregion
private readonly PlaybackRepository repository;
private string date;
private string time;
private string fileName;
public Action OnStopPlayback;
public PlaybackService(PlaybackRepository repository)
{
this.repository = repository;
}
public async UniTask<Dictionary<string, Dictionary<string, string>>?> RequestDataAsync()
{
Dictionary<string, Dictionary<string, string>>? data = await repository.RequestPlaybackDateList();
return data;
}
public async UniTask DispatchBaseInfoData(string date, string time, string fileName, string minute = "00", string second = "00")
{
Debug.Log($"DispatchBaseInfoData {date} {time} {minute} {second} {fileName}");
//헝가리 시간임
this.date = date;
this.time = time;
this.fileName = fileName;
DateTime dateTime = DateTimeUtil.UtcParse($"{date}T{int.Parse(time).ToString("00")}:{minute}:{second}.000Z");
string formatTime = DateTimeUtil.FormatTime(dateTime);
//baseInfo 가져오기
List<PlaybackSQLiteDataEntity> list = await repository.SelectBySecondBaseInfo(date, fileName, formatTime);
if (list.Count > 0)
{
HttpRequestConfig httpRequestConfig = new HttpRequestConfig("");
httpRequestConfig.setSplitResponseByKey(true);
httpRequestConfig.AddSplitConfig("AGV", DataMapperValidator.Get("AGV"));
httpRequestConfig.AddSplitConfig("ALARM", DataMapperValidator.Get("ALARM"));
foreach (var item in list)
{
await HttpDataProcessor.ProcessSplitResponse(httpRequestConfig, item.data);
}
}
}
/// <summary>
///
/// </summary>
/// <param name="second">0 ~ 3600</param>
public async UniTask DispatchRealTimeData(int second, int speed)
{
int newSecond = second;
if (newSecond > 36000) newSecond = 36000;
//utc 시간으로 변환
DateTime dateTime = DateTimeUtil.UtcParse($"{date}T{int.Parse(time).ToString("00")}:00:00.000Z").AddSeconds(newSecond);//.Add(-DateTimeUtil.UtcKoreaGap);
string formatTime = DateTimeUtil.FormatTime(dateTime);
List<PlaybackSQLiteDataEntity> list = await repository.SelectBySecondAsync(date, fileName, formatTime, 1);
if (list.Count > 0)
{
HttpRequestConfig httpRequestConfig = new HttpRequestConfig("");
httpRequestConfig.setSplitResponseByKey(true);
httpRequestConfig.AddSplitConfig("AGV", DataMapperValidator.Get("AGV"));
httpRequestConfig.AddSplitConfig("ALARM", DataMapperValidator.Get("ALARM"));
foreach (var item in list)
{
await HttpDataProcessor.ProcessSplitResponse(httpRequestConfig, item.data);
}
}
}
public void Stop()
{
OnStopPlayback?.Invoke();
}
public HTTPRequest? ReadyData(string date, string time, string fileName, Action<long, long, float> OnProgress, Action<string> OnComplete)
{
//date : "2024-12-05"
//fileName : "2024-12-05_0.sqlite.7z"
string playbackPath = Path.Combine(Application.streamingAssetsPath, "playback");
string tempPath = Path.Combine(playbackPath, "temp");//한국 시간으로 변경하기 때문에 임시 폴더 만들어서 압축 해제 후 이동
string datePath = Path.Combine(playbackPath, date);
var fileNameArr = fileName.Split(".");
string zipFilePath = Path.Combine(datePath, fileName);
string sqlFilePath = Path.Combine(datePath, fileNameArr[0] + ".sqlite");
DateTime utcDateTime = DateTimeUtil.Parse(fileNameArr[0], "yyyy-MM-dd_H").Add(-DateTimeUtil.UtcKoreaGap);
string utcDatePath = Path.Combine(playbackPath, utcDateTime.ToString("yyyy-MM-dd"));
string utcFileName = utcDateTime.ToString("yyyy-MM-dd_H") + "." + fileNameArr[1] + "." + fileNameArr[2];
var utcFileNameArr = utcFileName.Split(".");
string utcZipFilePath = Path.Combine(tempPath, utcFileName);
string utcSqlFilePath = Path.Combine(tempPath, utcFileNameArr[0] + ".sqlite");
if (!Directory.Exists(playbackPath)) Directory.CreateDirectory(playbackPath);
if (!Directory.Exists(datePath)) Directory.CreateDirectory(datePath);
if (!Directory.Exists(utcDatePath)) Directory.CreateDirectory(utcDatePath);
if (!Directory.Exists(tempPath)) Directory.CreateDirectory(tempPath);
if (File.Exists(sqlFilePath))
{
Debug.Log($"ONREADY SQP FILE");
if (OnProgress != null) OnProgress.Invoke(100, 100, 1.0f);
if (OnComplete != null) OnComplete.Invoke(null);
return null;
}
else
{
long downloadTotal = 0;
return repository.DownloadPlaybackData(utcFileName, utcZipFilePath,
(long progress, long length) =>
{
float percent = (float)progress / (float)length;
Debug.Log($"DownloadPlaybackData OnProgress:{percent}");
if (OnProgress != null) OnProgress.Invoke(progress, length, percent / 2);
downloadTotal = length;
}, async () =>
{
await UniTask.Delay(500);
Debug.Log($"DownloadPlaybackData OnComplete");
if (File.Exists(utcZipFilePath))
{
if (OnProgress != null) OnProgress.Invoke(50, 100, 0.5f);
//압축해제 후
var zipper = new Zipper();
string errorMessage = await zipper.Decompress(utcZipFilePath, tempPath, (long read, long total, float percent) =>
{
if (OnProgress != null)
{
OnProgress.Invoke(downloadTotal + read, downloadTotal + total, 0.5f + percent / 2);
if (0.5f + percent / 2 > 100f)
{
Debug.Log($" DownloadReadData :{downloadTotal + read} , DownloadTotalData :{downloadTotal + total} ,DownloadPlaybackData OnProgress:{percent}");
}
}
});
Debug.Log($"zipper1 errorMessage:{errorMessage} utcSqlFilePath:{utcSqlFilePath} sqlFilePath:{sqlFilePath} utcZipFilePath:{utcZipFilePath}");
////파일 접근 문제면 2회 0.5초 후에 다시 실행.
//if (errorMessage == "Could not open input(7z) file")
//{
// await UniTask.Delay(500);
// errorMessage = await zipper.Decompress(utcZipFilePath, tempPath, (long read, long total, float percent) =>
// {
// if (OnProgress != null) OnProgress.Invoke(downloadTotal + read, downloadTotal + total, 0.5f + percent / 2);
// });
// Debug.Log($"zipper2 errorMessage:{errorMessage} utcSqlFilePath:{utcSqlFilePath} sqlFilePath:{sqlFilePath} utcZipFilePath:{utcZipFilePath}");
//}
//if (errorMessage == "Could not open input(7z) file")
//{
// await UniTask.Delay(500);
// errorMessage = await zipper.Decompress(utcZipFilePath, tempPath, (long read, long total, float percent) =>
// {
// if (OnProgress != null) OnProgress.Invoke(downloadTotal + read, downloadTotal + total, 0.5f + percent / 2);
// });
// Debug.Log($"zipper3 errorMessage:{errorMessage} utcSqlFilePath:{utcSqlFilePath} sqlFilePath:{sqlFilePath} utcZipFilePath:{utcZipFilePath}");
//}
//압축해제 한 파일 이동
if (File.Exists(utcSqlFilePath))
{
//동일한 파일명이 있을경우 제거후 다시
File.Copy(utcSqlFilePath, sqlFilePath);
File.Delete(utcSqlFilePath);
}
//zip 파일 삭제
File.Delete(utcZipFilePath);
if (OnComplete != null) OnComplete.Invoke(errorMessage);
}
},
(string? error) =>
{
Debug.Log($"DownloadPlaybackData OnError:{error}");
if (OnComplete != null) OnComplete.Invoke(error);
});
}
}
}
}

View File

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

View File

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

View File

@@ -0,0 +1,265 @@
using Cysharp.Threading.Tasks;
using System;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UVC.Extension;
using UVC.UI;
using UVC.UI.Loading;
namespace UVC.Factory.Playback.UI
{
public class UIPlayback : MonoBehaviour
{
private static UIPlayback instance;
public static UIPlayback Instance
{
get
{
if (instance == null) instance = CreateUIPlayBack();
return instance;
}
}
private static UIPlayback CreateUIPlayBack()
{
GameObject prefab = Resources.Load<GameObject>("Prefabs/Factory/Playback/UIPlayback");
GameObject go = GameObject.Instantiate(prefab);
return go.GetComponent<UIPlayback>();
}
[SerializeField]
[Tooltip("종료 버튼")]
private Button exitButton;
[SerializeField]
[Tooltip("종료 버튼")]
private TextMeshProUGUI dateTimeTxt0;
[SerializeField]
[Tooltip("종료 버튼")]
private TextMeshProUGUI dateTimeTxt1;
[SerializeField]
[Tooltip("play 버튼")]
private Button playButton;
[SerializeField]
[Tooltip("play 버튼 이미지")]
private Image playButtonImage;
[SerializeField]
[Tooltip("play 버튼 이미지 Sprite")]
private Sprite playButtonImagePlay;
[SerializeField]
[Tooltip("play 버튼 Puase 이미지 Sprite")]
private Sprite playButtonImagePause;
[SerializeField]
[Tooltip("Speed Slider")]
private UISliderWithLabel sliderSpeed;
[SerializeField]
[Tooltip("투명 조절 Slider")]
private SliderWithEvent opacitySlider;
[SerializeField]
[Tooltip("Progress Bar")]
private UIPlaybackProgressBar progressBar;
[SerializeField]
private CanvasGroup canvasGroup;
private bool isPlaying = false;
private bool preparingData = false;
private string date;
private string time;
private string fileName;
private bool isTick = false;
private bool IsTick
{
get => isTick;
set
{
if (isTick != value)
{
var temp = isTick;
isTick = value;
if (!temp && value) OnTimer().Forget();
}
}
}
private void Init()
{
exitButton.onClick.AddListener(OnClickExit);
playButton.onClick.AddListener(OnClickPlay);
progressBar.OnChangeValue += OnChangeProgress;
sliderSpeed.OnChangeValue += OnChangeSpeed;
opacitySlider.onValueChanged.AddListener(OnValueChangedOpcity);
}
private void OnDestroy()
{
exitButton.onClick.RemoveListener(OnClickExit);
playButton.onClick.RemoveListener(OnClickPlay);
progressBar.OnChangeValue = null;
sliderSpeed.OnChangeValue = null;
opacitySlider.onValueChanged.RemoveListener(OnValueChangedOpcity);
if (isPlaying) IsTick = false;
}
public void Show()
{
if (playButton == null) Init();
gameObject.SetActive(true);
if (transform.parent == null)
{
var canvases = GameObject.FindObjectsByType<Canvas>(FindObjectsSortMode.None);
foreach (var canvas in canvases)
{
if (canvas.name == "ModalCanvas")
{
transform.SetParent(canvas.transform, false);
break;
}
}
}
}
public void Hide()
{
Time.timeScale = 1;
IsTick = false;
gameObject.SetActive(false);
}
private void OnClickExit()
{
UILoading.Show();
isPlaying = false;
UpdatePlayState();
Hide();
PlaybackService.Instance.Stop();
UILoading.Hide();
}
private void OnClickPlay()
{
isPlaying = !isPlaying;
UpdatePlayState();
}
private void OnChangeProgress(int newValue)
{
ChangePlayTime().Forget();
}
private void OnChangeSpeed(int newValue)
{
if (isPlaying)
{
if (Time.timeScale != sliderSpeed.Value) Time.timeScale = sliderSpeed.Value;
}
else
{
Time.timeScale = 1;
}
}
private void OnValueChangedOpcity(float newValue)
{
canvasGroup.alpha = opacitySlider.value;
}
private async UniTaskVoid ChangePlayTime()
{
bool tempIsPlaing = isPlaying;
isPlaying = false;
int newSecond = (int)progressBar.Value;
if (newSecond == progressBar.MaxValue)
{
newSecond -= 60;
progressBar.Value = newSecond;
}
preparingData = true;
progressBar.Interactable = !preparingData;
IsTick = false;
UILoading.Show();
UpdatePlayState();
await UniTask.WaitForSeconds(0.5f);
int minute = (int)newSecond / 60;
int seconds = (int)newSecond % 60;
await PlaybackService.Instance.DispatchBaseInfoData(date, time, fileName, minute.ToString("00"), seconds.ToString("00"));
preparingData = false;
progressBar.Interactable = !preparingData;
if (isPlaying != tempIsPlaing)
{
isPlaying = tempIsPlaing;
UpdatePlayState();
}
UILoading.Hide();
await UniTask.WaitForSeconds(0.5f);
}
public async UniTask SetData(string date, string time, string fileName)
{
Init();
this.date = date;
this.time = time;
this.fileName = fileName;
Debug.Log($"UIPlayback SetData {date} {time}");
int timeInt = int.Parse(time);
dateTimeTxt0.text = dateTimeTxt1.text = date.Substring(2).Replace("-", ".");
progressBar.Init(timeInt);
sliderSpeed.Init();
Time.timeScale = 1;
canvasGroup.alpha = opacitySlider.value = 1;
preparingData = true;
progressBar.Interactable = !preparingData;
isPlaying = false;
UpdatePlayState();
//UILoading.Show();
await UniTask.WaitForSeconds(0.5f);
await PlaybackService.Instance.DispatchBaseInfoData(date, time, fileName);
preparingData = false;
progressBar.Interactable = !preparingData;
//UILoading.Hide();
await UniTask.WaitForSeconds(0.5f);
}
private void UpdatePlayState()
{
playButton.enabled = false;
progressBar.enabled = false;
playButtonImage.sprite = isPlaying ? playButtonImagePause : playButtonImagePlay;
IsTick = isPlaying;
progressBar.enabled = true;
playButton.enabled = true;
OnChangeSpeed(sliderSpeed.Value);
}
private async UniTaskVoid OnTimer()
{
if (progressBar.Value == progressBar.MaxValue)
{
if (isPlaying) OnClickPlay();
return;
}
progressBar.Value += 1;
//PlaybackService.Instance.DispatchingTimelineEvent = false;
PlaybackService.Instance.DispatchRealTimeData(progressBar.Value, sliderSpeed.Value).Forget();
if (isTick)
{
//PlaybackService.Instance.DispatchingTimelineEvent = true;
await UniTask.Delay(TimeSpan.FromMilliseconds(1000 / sliderSpeed.Value));
OnTimer().Forget();
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6ca072637b87cb24eba398b90a1d49e9

View File

@@ -0,0 +1,311 @@
using Best.HTTP;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UVC.Extension;
using UVC.Pool;
using UVC.UI.Modal;
using UVC.Util;
namespace UVC.Factory.Playback.UI
{
public enum UIPlaybackListItemStatus
{
Default,
Downloading,
Downloaded
}
public class UIPlaybackListItemData
{
public string date = "";
public string time = "";
public string zipFileName = "";
public string sqlFileName = "";
public UIPlaybackListItemStatus status = UIPlaybackListItemStatus.Default;
public override string ToString()
{
return $"date:{date}, time:{time}, zipFileName:{zipFileName}, sqlFileName:{sqlFileName}, status:{status}";
}
}
public class UIPlaybackListItem : UnityEngine.MonoBehaviour, IPointerClickHandler
{
protected static ItemPool<UIPlaybackListItem> pool;
public static readonly string PrefabPath = "Prefabs/Factory/Playback/UIPlaybackListItem";
public static UIPlaybackListItem CreateFromPool(Transform parent)
{
if (pool == null)
{
GameObject prefab = Resources.Load<GameObject>(PrefabPath);
pool = new ItemPool<UIPlaybackListItem>(prefab, parent, null);
}
return pool.GetItem(true, parent);
}
public static List<UIPlaybackListItem> ActiveItems
{
get
{
if (pool != null) return (List<UIPlaybackListItem>)pool.ActiveItems;
return new List<UIPlaybackListItem>();
}
}
public static List<UIPlaybackListItem> DownloadingItems
{
get
{
return ActiveItems.Where(x => x.Status == UIPlaybackListItemStatus.Downloading).ToList();
}
}
public static void ReleaseAll()
{
if (pool != null)
{
foreach (var item in pool.ActiveItems) item.Release();
pool.ReturnAll();
}
}
public static void ClearAll()
{
if (pool != null)
{
foreach (var item in pool.ActiveItems) item.Release();
pool.ReturnAll();
pool.ClearRecycledItems();
}
}
[SerializeField]
private Image loadingImage;
[SerializeField]
private Image selectedImage;
[SerializeField]
private Button downloadButton;
[SerializeField]
private Button stopButton;
[SerializeField]
private Button deleteButton;
[SerializeField]
private TextMeshProUGUI downloadText;
[SerializeField]
private TextMeshProUGUI text;
public Action<UIPlaybackListItemData, bool> OnSelect { get; set; }
public Action<UIPlaybackListItemData, UIPlaybackListItemStatus> OnChangeStatus { get; set; }
private UIPlaybackListItemData data;
public UIPlaybackListItemData Data { get => data; }
public UIPlaybackListItemStatus Status
{
get => data.status;
set
{
if (data.status != value)
{
data.status = value;
ChangeStatus();
if (OnChangeStatus != null) OnChangeStatus.Invoke(Data, value);
}
}
}
private bool selected = false;
public bool Selected
{
get => selected;
set
{
if (selected != value)
{
selected = value;
selectedImage.gameObject.SetActive(selected);
}
}
}
private HTTPRequest? downloadRequest;
public void Init(UIPlaybackListItemData data)
{
transform.localScale = Vector3.one;
selected = false;
selectedImage.gameObject.SetActive(selected);
this.data = data;
text.text = $"{data.time} ~ {int.Parse(data.time) + 1} Hour";
downloadButton.onClick.AddListener(onClickDownload);
stopButton.onClick.AddListener(onClickStop);
deleteButton.onClick.AddListener(onClickDelete);
ChangeStatus();
}
private void onClickDownload()
{
if (Status == UIPlaybackListItemStatus.Downloading) return;
long freeSize = DriveUtil.GetDriveGigaBytes();
Debug.Log($"여유 공간 freeSize:{freeSize} {10 * (DownloadingItems.Count + 1)} {freeSize < 10 * (DownloadingItems.Count + 1)}");
if (freeSize < 10 * (DownloadingItems.Count + 1))
{
Toast.Show("Playback 하나당 10기가바이트의 용량이 필요합니다. 용량을 확보하고 다운로드 하세요.\nEach Playback requires a capacity of 10 gigabytes. Secure the capacity and download it.");
return;
}
if (DownloadingItems.Count >= 2)
{
Toast.Show("한번에 총 2개 아이템만 다운로드가 가능합니다.\nOnly 2 items can be downloaded at a time.");
//await UIAlertManager.Instance.ShowAlert("Downloading", "한번에 총 2개 아이템만 다운로드가 가능합니다.\nOnly 3 items can be downloaded at a time.");
return;
}
Status = UIPlaybackListItemStatus.Downloading;
downloadRequest = PlaybackService.Instance.ReadyData(data.date, data.time, data.zipFileName,
(long read, long total, float percent) =>
{
Debug.Log($"ReadyData {percent}");
downloadText.text = $"{read.ToSizeSuffix()}/{total.ToSizeSuffix()} ({(int)(percent * 100)}%)";
loadingImage.fillAmount = percent;
},
(string errorMessage) =>
{
Debug.Log($"Complete Data errorMessage:{errorMessage}");
if (downloadRequest != null) downloadRequest.Clear();
downloadRequest = null;
if (errorMessage != null)
{
if (errorMessage.ToLower().Contains("abort")) errorMessage = "다운로드를 중지 했습니다.\nThe download has been stopped.";
Toast.Show(errorMessage);
//await UIAlertManager.Instance.ShowAlert("Error", errorMessage);
deleteFile();
Status = UIPlaybackListItemStatus.Default;
}
else
{
Status = UIPlaybackListItemStatus.Downloaded;
}
});
}
private void deleteFile()
{
try
{
string playbackPath = Path.Combine(Application.streamingAssetsPath, "playback");
string tempPath = Path.Combine(playbackPath, "temp");
string datePath = Path.Combine(playbackPath, data.date);
var fileNameArr = data.zipFileName.Split('.');
DateTime utcDateTime = DateTimeUtil.Parse(fileNameArr[0], "yyyy-MM-dd_H");
string utcSqlFileName = utcDateTime.ToString("yyyy-MM-dd_H") + "." + fileNameArr[1];
string utcZipFileName = utcSqlFileName + "." + fileNameArr[2];
string utcZipFilePath = Path.Combine(datePath, utcZipFileName);
string utcSqlFilePath = Path.Combine(datePath, utcSqlFileName);
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
if (File.Exists(utcZipFilePath)) File.Delete(utcZipFilePath);
if (File.Exists(utcSqlFilePath)) File.Delete(utcSqlFilePath);
// if (Directory.Exists(tempPath)) Directory.Delete(tempPath, true);
}
catch (Exception ex)
{
Debug.LogException(ex);
}
}
private void onClickStop()
{
if (downloadRequest != null && Status == UIPlaybackListItemStatus.Downloading)
{
downloadRequest.Abort();
downloadRequest.Clear();
downloadRequest = null;
deleteFile();
Status = UIPlaybackListItemStatus.Default;
}
}
private void onClickDelete()
{
deleteFile();
Status = UIPlaybackListItemStatus.Default;
}
public void OnPointerClick(PointerEventData eventData)
{
Selected = !selected;
if (OnSelect != null) OnSelect.Invoke(data, Selected);
}
public void Release()
{
OnDestroy();
}
private void OnDestroy()
{
downloadButton.onClick.RemoveListener(onClickDownload);
stopButton.onClick.RemoveListener(onClickStop);
deleteButton.onClick.RemoveListener(onClickDelete);
OnSelect = null;
OnChangeStatus = null;
transform.SetParent(null);
}
private void ChangeStatus()
{
downloadText.text = "";
if (data.status == UIPlaybackListItemStatus.Default)
{
loadingImage.gameObject.SetActive(false);
downloadButton.gameObject.SetActive(true);
stopButton.gameObject.SetActive(false);
deleteButton.gameObject.SetActive(false);
downloadText.gameObject.SetActive(false);
}
else if (data.status == UIPlaybackListItemStatus.Downloading)
{
loadingImage.gameObject.SetActive(true);
loadingImage.SetAlpha(0.2f);
loadingImage.fillAmount = 0;
downloadButton.gameObject.SetActive(false);
stopButton.gameObject.SetActive(true);
deleteButton.gameObject.SetActive(false);
downloadText.gameObject.SetActive(true);
}
else if (data.status == UIPlaybackListItemStatus.Downloaded)
{
loadingImage.gameObject.SetActive(true);
loadingImage.SetAlpha(1f);
loadingImage.fillAmount = 1;
downloadButton.gameObject.SetActive(false);
stopButton.gameObject.SetActive(false);
deleteButton.gameObject.SetActive(true);
downloadText.gameObject.SetActive(false);
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More