Browse Source

修复bug

“hujiajun” 1 năm trước cách đây
mục cha
commit
1cacba7b0b
42 tập tin đã thay đổi với 4976 bổ sung147 xóa
  1. 182 73
      Assets/FrameWork/ProjectManager/XunJian/进入任务/进入任务.prefab
  2. 38 8
      Assets/HotUpdate/Scripts/Scripts/JinRuRenwu.cs
  3. 145 19
      Assets/HotUpdate/Scripts/Scripts/Project/XunJian/进入任务/ChangeCameraSaoMiao.cs
  4. 4 10
      Assets/HotUpdate/Scripts/Scripts/Project/XunJian/进入任务/Loom.cs
  5. 23 9
      Assets/HotUpdate/Scripts/Scripts/Project/XunJian/进入任务/RenWuTypeWindow.cs
  6. 10 4
      Assets/HotUpdate/Scripts/Scripts/Project/XunJian/进入任务/ShowVideoManager.cs
  7. 9 5
      Assets/HotUpdate/Scripts/Scripts/TipAndErrorManager.cs
  8. 5 0
      Assets/HotUpdate/UniGif.meta
  9. 5 0
      Assets/HotUpdate/UniGif/Example.meta
  10. 5 0
      Assets/HotUpdate/UniGif/Example/Script.meta
  11. 360 0
      Assets/HotUpdate/UniGif/Example/Script/UniGifImage.cs
  12. 12 0
      Assets/HotUpdate/UniGif/Example/Script/UniGifImage.cs.meta
  13. 21 0
      Assets/HotUpdate/UniGif/Example/Script/UniGifTest.cs
  14. 8 0
      Assets/HotUpdate/UniGif/Example/Script/UniGifTest.cs.meta
  15. 5 0
      Assets/HotUpdate/UniGif/Example/Script/Utility.meta
  16. 89 0
      Assets/HotUpdate/UniGif/Example/Script/Utility/UniGifImageAspectController.cs
  17. 12 0
      Assets/HotUpdate/UniGif/Example/Script/Utility/UniGifImageAspectController.cs.meta
  18. 2218 0
      Assets/HotUpdate/UniGif/Example/UniGifExample.unity
  19. 4 0
      Assets/HotUpdate/UniGif/Example/UniGifExample.unity.meta
  20. 72 0
      Assets/HotUpdate/UniGif/UniGif.cs
  21. 8 0
      Assets/HotUpdate/UniGif/UniGif.cs.meta
  22. 275 0
      Assets/HotUpdate/UniGif/UniGifConst.cs
  23. 8 0
      Assets/HotUpdate/UniGif/UniGifConst.cs.meta
  24. 579 0
      Assets/HotUpdate/UniGif/UniGifDecoder.cs
  25. 8 0
      Assets/HotUpdate/UniGif/UniGifDecoder.cs.meta
  26. 56 0
      Assets/HotUpdate/UniGif/UniGifExtension.cs
  27. 12 0
      Assets/HotUpdate/UniGif/UniGifExtension.cs.meta
  28. 603 0
      Assets/HotUpdate/UniGif/UniGifFormatter.cs
  29. 8 0
      Assets/HotUpdate/UniGif/UniGifFormatter.cs.meta
  30. 141 0
      Assets/HybridCLRGenerate/AOTGenericReferences.cs
  31. 8 0
      Assets/HybridCLRGenerate/link.xml
  32. 1 7
      Assets/Main/LoadDll.cs
  33. 8 0
      Assets/NRSDK.meta
  34. 15 0
      Assets/NRSDK/NRProjectConfig.asset
  35. 8 0
      Assets/NRSDK/NRProjectConfig.asset.meta
  36. 2 2
      Assets/Scenes/Edustry.unity
  37. BIN
      Assets/StreamingAssets/mscorlib.dll.bytes
  38. BIN
      Assets/StreamingAssets/netstandard.dll.bytes
  39. BIN
      Assets/StreamingAssets/pkq.gif
  40. 1 1
      Assets/StreamingAssets/pkq.gif.meta
  41. 2 2
      Packages/manifest.json
  42. 6 7
      Packages/packages-lock.json

+ 182 - 73
Assets/FrameWork/ProjectManager/XunJian/进入任务/进入任务.prefab

@@ -1779,6 +1779,69 @@ MonoBehaviour:
   m_FillOrigin: 0
   m_UseSpriteMesh: 0
   m_PixelsPerUnitMultiplier: 1
+--- !u!1 &2288219029396908591
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5337205826700024256}
+  - component: {fileID: 6781363820934445775}
+  m_Layer: 5
+  m_Name: videoandmodel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &5337205826700024256
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2288219029396908591}
+  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: 4420183677033236063}
+  - {fileID: 5159099031647131548}
+  m_Father: {fileID: 1363556228952835098}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 320, y: -1800}
+  m_SizeDelta: {x: 640, y: 480}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &6781363820934445775
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2288219029396908591}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 0
+    m_Right: 0
+    m_Top: 0
+    m_Bottom: 0
+  m_ChildAlignment: 0
+  m_StartCorner: 0
+  m_StartAxis: 1
+  m_CellSize: {x: 640, y: 480}
+  m_Spacing: {x: 40, y: 40}
+  m_Constraint: 0
+  m_ConstraintCount: 2
 --- !u!1 &2302547886377046790
 GameObject:
   m_ObjectHideFlags: 0
@@ -1893,8 +1956,8 @@ RectTransform:
   m_Father: {fileID: 5099701053908007057}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
   m_AnchoredPosition: {x: 385.5, y: 0}
   m_SizeDelta: {x: 771, y: 0}
   m_Pivot: {x: 0.5, y: 1}
@@ -3293,9 +3356,9 @@ RectTransform:
   m_Father: {fileID: 1941495110105555512}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 574, y: -100}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 959.5, y: 0}
   m_SizeDelta: {x: 0, y: 0}
   m_Pivot: {x: 0.5, y: 1}
 --- !u!114 &3001207142907341833
@@ -4672,6 +4735,70 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   msg: "\u62CD\u7167/\u5F55\u5C4F"
+--- !u!1 &6724435281167035641
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8281476722443267961}
+  - component: {fileID: 6567456728862263218}
+  m_Layer: 5
+  m_Name: images
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &8281476722443267961
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6724435281167035641}
+  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: 5511868129926330179}
+  - {fileID: 340916537086920711}
+  - {fileID: 744733168888182302}
+  m_Father: {fileID: 1363556228952835098}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 320, y: -1280}
+  m_SizeDelta: {x: 640, y: 480}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &6567456728862263218
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6724435281167035641}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 0
+    m_Right: 0
+    m_Top: 0
+    m_Bottom: 0
+  m_ChildAlignment: 0
+  m_StartCorner: 0
+  m_StartAxis: 1
+  m_CellSize: {x: 640, y: 480}
+  m_Spacing: {x: 40, y: 40}
+  m_Constraint: 0
+  m_ConstraintCount: 2
 --- !u!1 &6773460392647958158
 GameObject:
   m_ObjectHideFlags: 0
@@ -5528,20 +5655,17 @@ RectTransform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
-  - {fileID: 4420183677033236063}
-  - {fileID: 5511868129926330179}
-  - {fileID: 340916537086920711}
-  - {fileID: 744733168888182302}
-  - {fileID: 5159099031647131548}
-  - {fileID: 8542819322292739457}
   - {fileID: 8014526504965210063}
+  - {fileID: 8542819322292739457}
+  - {fileID: 8281476722443267961}
+  - {fileID: 5337205826700024256}
   m_Father: {fileID: 1941495110105555512}
   m_RootOrder: 1
   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: 1327, y: 1141.8}
+  m_SizeDelta: {x: 717.5371, y: 3780.809}
   m_Pivot: {x: 0, y: 1}
 --- !u!114 &6089075526505893379
 MonoBehaviour:
@@ -5856,9 +5980,9 @@ RectTransform:
   m_Father: {fileID: 357678414522435767}
   m_RootOrder: 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: -78.15}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
   m_SizeDelta: {x: 200, y: 0}
   m_Pivot: {x: 0, y: 0}
 --- !u!222 &7528899676586470911
@@ -7351,7 +7475,7 @@ PrefabInstance:
   m_ObjectHideFlags: 0
   serializedVersion: 2
   m_Modification:
-    m_TransformParent: {fileID: 1363556228952835098}
+    m_TransformParent: {fileID: 5337205826700024256}
     m_Modifications:
     - target: {fileID: 2415235072230918127, guid: d3faef802ff64634497afd62661bdfbc, type: 3}
       propertyPath: m_Name
@@ -7371,7 +7495,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 4980491567860670752, guid: d3faef802ff64634497afd62661bdfbc, type: 3}
       propertyPath: m_RootOrder
-      value: 4
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 4980491567860670752, guid: d3faef802ff64634497afd62661bdfbc, type: 3}
       propertyPath: m_AnchorMax.x
@@ -7427,7 +7551,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 4980491567860670752, guid: d3faef802ff64634497afd62661bdfbc, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 320
+      value: 1000
       objectReference: {fileID: 0}
     - target: {fileID: 4980491567860670752, guid: d3faef802ff64634497afd62661bdfbc, type: 3}
       propertyPath: m_AnchoredPosition.y
@@ -7466,19 +7590,19 @@ PrefabInstance:
     m_Modifications:
     - target: {fileID: 1046681076883175317, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchorMax.y
-      value: 0
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 1046681076883175317, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchorMin.y
-      value: 0
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 1046681076883175317, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 0
+      value: 135
       objectReference: {fileID: 0}
     - target: {fileID: 1046681076883175317, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchoredPosition.y
-      value: 0
+      value: -50
       objectReference: {fileID: 0}
     - target: {fileID: 2663175551128001469, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_Name
@@ -7494,19 +7618,19 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 6534303979265014755, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchorMax.y
-      value: 0
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 6534303979265014755, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchorMin.y
-      value: 0
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 6534303979265014755, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 0
+      value: 405
       objectReference: {fileID: 0}
     - target: {fileID: 6534303979265014755, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchoredPosition.y
-      value: 0
+      value: -50
       objectReference: {fileID: 0}
     - target: {fileID: 7708746070731989160, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: playImg
@@ -7530,7 +7654,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 8949749624788767784, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_RootOrder
-      value: 6
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 8949749624788767784, guid: cb61b52cc83342e489699f3476640957, type: 3}
       propertyPath: m_AnchorMax.x
@@ -7650,8 +7774,12 @@ PrefabInstance:
   m_ObjectHideFlags: 0
   serializedVersion: 2
   m_Modification:
-    m_TransformParent: {fileID: 1363556228952835098}
+    m_TransformParent: {fileID: 8281476722443267961}
     m_Modifications:
+    - target: {fileID: 3790039448010503031, guid: bc3de041e82908647849e0e8128295b1, type: 3}
+      propertyPath: m_Center.y
+      value: 0
+      objectReference: {fileID: 0}
     - target: {fileID: 4458167396202558435, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_Name
       value: Image
@@ -7670,7 +7798,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_RootOrder
-      value: 1
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_AnchorMax.x
@@ -7714,15 +7842,15 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_LocalRotation.x
-      value: 0
+      value: -0
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_LocalRotation.y
-      value: 0
+      value: -0
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_LocalRotation.z
-      value: 0
+      value: -0
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_AnchoredPosition.x
@@ -7773,7 +7901,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 2240469572346570524, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_IsActive
-      value: 0
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_Pivot.x
@@ -7785,7 +7913,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_RootOrder
-      value: 5
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_AnchorMax.x
@@ -7793,7 +7921,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_AnchorMax.y
-      value: 1
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_AnchorMin.x
@@ -7801,15 +7929,15 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_AnchorMin.y
-      value: 1
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_SizeDelta.x
-      value: 640
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_SizeDelta.y
-      value: 170
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_LocalPosition.x
@@ -7841,11 +7969,11 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 1360
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_AnchoredPosition.y
-      value: -0
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 4560886240936283504, guid: f90550dfc0e1ef54ba8811058fbab030, type: 3}
       propertyPath: m_LocalEulerAnglesHint.x
@@ -7907,7 +8035,7 @@ PrefabInstance:
   m_ObjectHideFlags: 0
   serializedVersion: 2
   m_Modification:
-    m_TransformParent: {fileID: 1363556228952835098}
+    m_TransformParent: {fileID: 5337205826700024256}
     m_Modifications:
     - target: {fileID: 2413293942919352051, guid: 4d3636cb3ec3d4b4197477650beeb660, type: 3}
       propertyPath: m_Name
@@ -8008,11 +8136,6 @@ RectTransform:
   m_CorrespondingSourceObject: {fileID: 7255333946027317694, guid: 4d3636cb3ec3d4b4197477650beeb660, type: 3}
   m_PrefabInstance: {fileID: 6478351553496440801}
   m_PrefabAsset: {fileID: 0}
---- !u!1 &8183282706243599341 stripped
-GameObject:
-  m_CorrespondingSourceObject: {fileID: 2915911613087114252, guid: 4d3636cb3ec3d4b4197477650beeb660, type: 3}
-  m_PrefabInstance: {fileID: 6478351553496440801}
-  m_PrefabAsset: {fileID: 0}
 --- !u!1 &8690263258676728082 stripped
 GameObject:
   m_CorrespondingSourceObject: {fileID: 2413293942919352051, guid: 4d3636cb3ec3d4b4197477650beeb660, type: 3}
@@ -8031,26 +8154,12 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   _scanFrequency: 0
---- !u!114 &8127128727990103697
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 8690263258676728082}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 6c43c2e969f7c77408b270b6f63e4f09, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  plbt: {fileID: 8183282706243599341}
-  url: 
 --- !u!1001 &7188588262015716276
 PrefabInstance:
   m_ObjectHideFlags: 0
   serializedVersion: 2
   m_Modification:
-    m_TransformParent: {fileID: 1363556228952835098}
+    m_TransformParent: {fileID: 8281476722443267961}
     m_Modifications:
     - target: {fileID: 4458167396202558435, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_Name
@@ -8070,7 +8179,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_RootOrder
-      value: 3
+      value: 2
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_AnchorMax.x
@@ -8114,19 +8223,19 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_LocalRotation.x
-      value: 0
+      value: -0
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_LocalRotation.y
-      value: 0
+      value: -0
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_LocalRotation.z
-      value: 0
+      value: -0
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 1000
+      value: 1680
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_AnchoredPosition.y
@@ -8161,7 +8270,7 @@ PrefabInstance:
   m_ObjectHideFlags: 0
   serializedVersion: 2
   m_Modification:
-    m_TransformParent: {fileID: 1363556228952835098}
+    m_TransformParent: {fileID: 8281476722443267961}
     m_Modifications:
     - target: {fileID: 4458167396202558435, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_Name
@@ -8181,7 +8290,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_RootOrder
-      value: 2
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_AnchorMax.x
@@ -8225,23 +8334,23 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_LocalRotation.x
-      value: 0
+      value: -0
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_LocalRotation.y
-      value: 0
+      value: -0
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_LocalRotation.z
-      value: 0
+      value: -0
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 320
+      value: 1000
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_AnchoredPosition.y
-      value: -760
+      value: -240
       objectReference: {fileID: 0}
     - target: {fileID: 7608598676142472618, guid: bc3de041e82908647849e0e8128295b1, type: 3}
       propertyPath: m_LocalEulerAnglesHint.x

+ 38 - 8
Assets/HotUpdate/Scripts/Scripts/JinRuRenwu.cs

@@ -34,6 +34,7 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
     public GameObject Image3;
     public GameObject Text;
 
+
     public GameObject paizhaoGo;
 
     public TextMeshProUGUI indexText;
@@ -438,6 +439,8 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
         {
             list[i].SetActive(isOpen);
         }
+        Image.transform.parent.gameObject.SetActive(true);
+        Video.transform.parent.gameObject.SetActive(true);
         checkJd();
     }
 
@@ -482,6 +485,8 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
         {
             list[i].SetActive(false);
         }
+        Image.transform.parent.gameObject.SetActive(false);
+        Video.transform.parent.gameObject.SetActive(false);
     }
 
     public void showText()
@@ -489,16 +494,18 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
         Text.SetActive(!Text.activeSelf);
         if (!JinRuRenwu.Instance.paizhaoGo.activeSelf)
         {
-            Text.transform.SetAsFirstSibling();
+           // Text.transform.SetAsFirstSibling();
         }
         else
         {
-            Video.transform.SetSiblingIndex(1);
+            //Video.transform.SetSiblingIndex(1);
         }
         checkJd();
     }
     public void showImage()
     {
+        if (!Image.activeSelf)
+            Image.transform.parent.gameObject.SetActive(!Image.activeSelf);
         Image.SetActive(!Image.activeSelf);
         switch (img)
         {
@@ -510,13 +517,13 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
                 Image3.SetActive(Image.activeSelf);
                 break;
         }
+        Image.transform.parent.gameObject.SetActive(Image.activeSelf);
+
         if (!JinRuRenwu.Instance.paizhaoGo.activeSelf)
         {
-            Image.transform.SetAsFirstSibling();
         }
         else
         {
-            Image.transform.SetSiblingIndex(1);
         }
             checkJd();
     }
@@ -524,28 +531,51 @@ public class JinRuRenwu : WindowSingleton<JinRuRenwu>
     public void showModel()
     {
 
+        if (!Model.activeSelf)
+            Video.transform.parent.gameObject.SetActive(!Model.activeSelf);
         Model.SetActive(!Model.activeSelf);
         if (!JinRuRenwu.Instance.paizhaoGo.activeSelf)
         {
-            Model.transform.SetAsFirstSibling();
+           // Model.transform.SetAsFirstSibling();
+        }
+        else
+        {
+           // Video.transform.SetSiblingIndex(1);
+        }
+        if(!Model.activeSelf&&!Video.activeSelf)
+        {
+            Video.transform.parent.gameObject.SetActive(false);
         }
         else
         {
-            Video.transform.SetSiblingIndex(1);
+
+            Video.transform.parent.gameObject.SetActive(true);
         }
         checkJd();
     }
     public void showVideo()
     {
+        if(!Video.activeSelf)
+        {
+            Video.transform.parent.gameObject.SetActive(!Video.activeSelf);
+            Video.GetComponent<ShowVideoManager>().playeVideo();
+        }
 
         Video.SetActive(!Video.activeSelf);
         if (!JinRuRenwu.Instance.paizhaoGo.activeSelf)
         {
-            Video.transform.SetAsFirstSibling();
         }
         else
         {
-            Video.transform.SetSiblingIndex(1);
+        }
+        if (!Model.activeSelf && !Video.activeSelf)
+        {
+            Video.transform.parent.gameObject.SetActive(false);
+        }
+        else
+        {
+
+            Video.transform.parent.gameObject.SetActive(true);
         }
         checkJd();
     }

+ 145 - 19
Assets/HotUpdate/Scripts/Scripts/Project/XunJian/进入任务/ChangeCameraSaoMiao.cs

@@ -87,6 +87,15 @@ public class ChangeCameraSaoMiao : MonoSingleton<ChangeCameraSaoMiao>
     //    });
     //}
 
+    public static string getFileSuffix(string fileName)
+    {
+        return fileName.Substring(fileName.LastIndexOf("."));//例如:abc.png  截取后:.png
+    }
+    public static string getFilesFirst(string fileName)
+    {
+        return fileName.Substring(0, fileName.LastIndexOf("."));//例如:abc.png  截取后:.png
+    }
+
     public void showsaomiao(XunJianTasks ri)
     {
         checkLuXiang();
@@ -111,28 +120,19 @@ public class ChangeCameraSaoMiao : MonoSingleton<ChangeCameraSaoMiao>
             Debug.Log("打开startDevice42" + ri.diagram.Count);
             for (int i = 0; i < ri.diagram.Count; i++)
             {
-                Debug.Log("打开startDevice43" + ri.diagram[i].path);
-                // 下载识别图 处理
 
-                DownLoadXRManager.DownLoadForFilePath(DownLoadXRManager.getTestData(ri.diagram[i], "minio"), (string bytes) =>
+                MinioResources mires = ri.diagram[i];
+                string gifpath = Application.persistentDataPath + "/DownLoadXR/" + mires.path.Split("/")[mires.path.Split("/").Length - 1];
+                string giftopngpath = Application.persistentDataPath + "/DownLoadXR/" + mires.uuid+".png";
+
+                if (getFileSuffix(gifpath).ToLower() == ".gif")
                 {
-                    if (bytes == null)
+                    if (File.Exists(giftopngpath))
                     {
-                        close();
-                        JsonData data = new JsonData();
-                        data["type"] = "20001";
-                        List<string> backTip = new List<string>();
-                        backTip.Add(data.ToJson());
-                        backTip.Add(data.ToJson());
-                        backTip.Add(data.ToJson());
-                        WindowsManager.Instance.show(WindowConfig.windowType.Error, false, WindowsManager.Instance.getErrorData("提示", "识别图未找到!" + rw.diagram, Color.gray, "stop", backTip, true, "识别图错误", 5).ToJson());
 
-                    }
-                    else
-                    {
                         ImageFileSourceData data = new ImageFileSourceData();
-                        data.Name = bytes.Split("/")[bytes.Split("/").Length - 1];
-                        data.Path = bytes;
+                        data.Name = giftopngpath.Split("/")[giftopngpath.Split("/").Length - 1];
+                        data.Path = giftopngpath;
                         data.PathType = PathType.Absolute;
                         data.Scale = 0.1f;
                         rw.imageData = data;
@@ -143,10 +143,136 @@ public class ChangeCameraSaoMiao : MonoSingleton<ChangeCameraSaoMiao>
                         ARSaoTuManager.Instance.AddARGameObj(data);
                         Debug.Log("打开startDevice4");
                     }
-                }, (float f) =>
+                    else
+                    {
+                        // 下载识别图 处理
+
+                        DownLoadXRManager.DownLoadForBytes(DownLoadXRManager.getTestData(mires, "minio"), (byte[] bytes) =>
+                        {
+                            if (bytes == null)
+                            {
+                                close();
+                                JsonData data = new JsonData();
+                                data["type"] = "20001";
+                                List<string> backTip = new List<string>();
+                                backTip.Add(data.ToJson());
+                                backTip.Add(data.ToJson());
+                                backTip.Add(data.ToJson());
+                                WindowsManager.Instance.show(WindowConfig.windowType.Error, false, WindowsManager.Instance.getErrorData("提示", "识别图未找到!" + rw.diagram, Color.gray, "stop", backTip, true, "识别图错误", 5).ToJson());
+
+                            }
+                            else
+                            {
+                                //gif
+                                StartCoroutine(UniGif.GetTextureListCoroutine(bytes, (gifTexList, loopCount, width, height) =>
+                                {
+                                    if (gifTexList != null)
+                                    {
+                                        byte[] gifbyte = gifTexList[0].m_texture2d.EncodeToPNG();
+                                        //文件流信息  
+                                        //StreamWriter sw;  
+                                        Stream sw;
+                                        Debug.Log("准备存文件===》" + giftopngpath);
+                                        FileInfo file = new FileInfo(giftopngpath);
+                                        try
+                                        {
+
+                                            if (file.Exists)
+                                            {
+                                                file.Delete();
+                                            }
+                                            if (!Directory.Exists(Application.persistentDataPath + "/DownLoadXR"))
+                                            {
+                                                Directory.CreateDirectory(Application.persistentDataPath + "/DownLoadXR");
+                                            }
+                                            //如果此文件存在则打开  
+                                            //sw = file .Append();  
+                                            //如果此文件不存在则创建  
+                                            sw = file.Create();
+
+                                            //以行的形式写入信息  
+                                            //sw.WriteLine(info);  
+                                            sw.Write(gifbyte, 0, gifbyte.Length);
+                                            sw.Close();
+                                            sw.Dispose();
+                                        }
+                                        catch
+                                        {
+                                        }
+                                      ;
+
+                                        ImageFileSourceData data = new ImageFileSourceData();
+                                        data.Name = giftopngpath.Split("/")[giftopngpath.Split("/").Length - 1];
+                                        data.Path = giftopngpath;
+                                        data.PathType = PathType.Absolute;
+                                        data.Scale = 0.1f;
+                                        rw.imageData = data;
+                                        Debug.Log("打开startDevice1" + data.Path);
+                                        Debug.Log("打开startDevice1" + data.Name);
+                                        ARSaoTuManager.Instance.startDevice();
+                                        Debug.Log("打开startDevice3");
+                                        ARSaoTuManager.Instance.AddARGameObj(data);
+                                        Debug.Log("打开startDevice4");
+
+
+                                    }
+                                    else
+                                    {
+                                    }
+                                }));
+
+                            }
+                        }, (float f) =>
+                        {
+
+                        });
+                    }
+
+                }
+                else
                 {
+                    Debug.Log("打开startDevice43" + ri.diagram[i].path);
+                    // 下载识别图 处理
+
+                    DownLoadXRManager.DownLoadForFilePath(DownLoadXRManager.getTestData(ri.diagram[i], "minio"), (string bytes) =>
+                    {
+                        if (bytes == null)
+                        {
+                            close();
+                            JsonData data = new JsonData();
+                            data["type"] = "20001";
+                            List<string> backTip = new List<string>();
+                            backTip.Add(data.ToJson());
+                            backTip.Add(data.ToJson());
+                            backTip.Add(data.ToJson());
+                            WindowsManager.Instance.show(WindowConfig.windowType.Error, false, WindowsManager.Instance.getErrorData("提示", "识别图未找到!" + rw.diagram, Color.gray, "stop", backTip, true, "识别图错误", 5).ToJson());
+
+                        }
+                        else
+                        {
+                            ImageFileSourceData data = new ImageFileSourceData();
+                            data.Name = bytes.Split("/")[bytes.Split("/").Length - 1];
+                            data.Path = bytes;
+                            data.PathType = PathType.Absolute;
+                            data.Scale = 0.1f;
+                            rw.imageData = data;
+                            Debug.Log("打开startDevice1" + data.Path);
+                            Debug.Log("打开startDevice1" + data.Name);
+                            ARSaoTuManager.Instance.startDevice();
+                            Debug.Log("打开startDevice3");
+                            ARSaoTuManager.Instance.AddARGameObj(data);
+                            Debug.Log("打开startDevice4");
+                        }
+                    }, (float f) =>
+                    {
+
+                    });
+                }
+
+                
+
 
-                });
+              
 
 
             }

+ 4 - 10
Assets/HotUpdate/Scripts/Scripts/Project/XunJian/进入任务/Loom.cs

@@ -83,23 +83,17 @@ public class Loom : MonoBehaviour
 			Thread.Sleep(1);
 		}
 		Interlocked.Increment(ref numThreads);
+		Debug.Log("RunActionRunActionRunActionRunActionRunAction");
 		ThreadPool.QueueUserWorkItem(RunAction, a);
 		return null;
 	}
 
 	private static void RunAction(object action)
 	{
-		try
-		{
+		Debug.Log("QueueUserWorkItemQueueUserWorkItemQueueUserWorkItemQueueUserWorkItem");
+
 			((Action)action)();
-		}
-		catch
-		{
-		}
-		finally
-		{
-			Interlocked.Decrement(ref numThreads);
-		}
+
 
 	}
 

+ 23 - 9
Assets/HotUpdate/Scripts/Scripts/Project/XunJian/进入任务/RenWuTypeWindow.cs

@@ -24,7 +24,7 @@ public class RenWuTypeWindow : MonoBehaviour
         this.transform.GetComponent<RectTransform>().localEulerAngles = Vector3.zero;
         this.transform.GetComponent<RectTransform>().localScale = Vector3.one;
 
-        if(data2.loadingMethod==1)
+        if(data2!=null&&data2.loadingMethod==1)
         {
 
             changebizhi(this.GetComponent<RawImage>().texture);
@@ -34,7 +34,11 @@ public class RenWuTypeWindow : MonoBehaviour
     Mat _mat;
     public void updateData(MinioResources datafile)
     {
-        Debug.Log("updateData=====>4444");
+        Debug.Log("updateData=====>4444" + datafile.loadingMethod);
+        Debug.Log("updateData=====>4444" + datafile.path);
+        if(datafile.loadingMethod!= 11111)
+        Debug.Log("updateData=====>4444" + Application.persistentDataPath + "/" + datafile.uuid + Path.GetExtension(datafile.path));
+        
         if (tex != null)
         {
             Destroy(tex);
@@ -50,7 +54,6 @@ public class RenWuTypeWindow : MonoBehaviour
                 Debug.Log("updateData=====>66666");
                 break;
             case 3:
-                this.GetComponent<ShowVideoManager>().OnDisable();
                 info.gameObject.SetActive(true);
                 info.text = "视频加载中";
                 if (File.Exists(Application.persistentDataPath + "/" + data2.uuid + Path.GetExtension(data2.path)))
@@ -84,11 +87,19 @@ public class RenWuTypeWindow : MonoBehaviour
                // this.gameObject.GetComponentInChildren<TextMeshProUGUI>().text = data.info;
                 break;
             case 1:
+                this.GetComponent<RawImage>().texture = null;
                 if (File.Exists(Application.persistentDataPath + "/" + data2.uuid + Path.GetExtension(data2.path)))
                 {
-                    Loom.RunAsync(() =>
-                    {
-                        _mat = GameUtility.zoomByteByOpenCV(Application.persistentDataPath + "/" + data2.uuid + Path.GetExtension(data2.path) ,1, false, true);
+                    Debug.Log("RoomFileMinio.Instance.bucket=End=0=>" + Application.persistentDataPath + "/" + data2.uuid + Path.GetExtension(data2.path));
+
+                    string localpath = Application.persistentDataPath + "/" + data2.uuid + Path.GetExtension(data2.path);
+                   Loom.RunAsync(() =>
+                   {
+                       Debug.Log("RoomFileMinio.Instance.bucket=End=13=>");
+                       Debug.Log("RoomFileMinio.Instance.bucket=End=1=>" + localpath);
+                        _mat = GameUtility.zoomByteByOpenCV(localpath, 1, false, true);
+
+                        Debug.Log("RoomFileMinio.Instance.bucket=End==2=>" + localpath);
                         Loom.QueueOnMainThread(() => {
                             if (tex != null)
                             {
@@ -106,9 +117,8 @@ public class RenWuTypeWindow : MonoBehaviour
 
                     RoomFileMinio.Instance.getFile(RoomFileMinio.Instance.bucket, data2.path, data2.uuid, rfd =>
                     {
-                        Debug.Log("RoomFileMinio.Instance.bucket=End===>");
-                        Debug.Log(rfd.url);
-                        Debug.Log(rfd.bytes.Length);
+                        Debug.Log("RoomFileMinio.Instance.bucket=End===>" + rfd.url);
+                        Debug.Log("RoomFileMinio.Instance.bucket=End===>" + rfd.bytes.Length);
                         Texture2D tex = GetSprite(rfd.bytes).texture;
                         this.GetComponent<RawImage>().texture = tex;
                         changebizhi(tex);
@@ -170,6 +180,10 @@ public class RenWuTypeWindow : MonoBehaviour
 
     public void changebizhi(Texture tex)
     {
+        if(!tex)
+        {
+            return;
+        }
 
         float bz = 1;
         float bzbz = 640f / 480f;

+ 10 - 4
Assets/HotUpdate/Scripts/Scripts/Project/XunJian/进入任务/ShowVideoManager.cs

@@ -10,11 +10,12 @@ public class ShowVideoManager : MonoBehaviour
     AVProVideoPlayer avpro;
     private void OnEnable()
     {
-        playeVideo();
+       // playeVideo();
     }
     Timer timers;
     public void playeVideo()
     {
+        Debug.Log("video playeVideo==3=>?");
 
         if (url != null && url != "")
         {
@@ -26,7 +27,6 @@ public class ShowVideoManager : MonoBehaviour
                 {
                     url = "file://" + url;
                 }
-#endif
             if (this.GetComponent<MediaPlayerCtrl>()&&url == this.GetComponent<MediaPlayerCtrl>().pathLoad)
             {
                 avpro.SetUrl(url);
@@ -38,6 +38,9 @@ public class ShowVideoManager : MonoBehaviour
                 this.GetComponent<MediaPlayerCtrl>().Load(this.GetComponent<MediaPlayerCtrl>().pathLoad);
 
             }
+#else
+            avpro.Play();
+#endif
             TimerMgr.Instance.DestroyTimer(timers);
 
             timers = TimerMgr.Instance.CreateTimer(()=> {
@@ -76,11 +79,14 @@ public class ShowVideoManager : MonoBehaviour
 
     public void OnDisable()
     {
-        if(avpro!=null)
+        Debug.Log("video stop==3=>?");
+        if (avpro!=null)
         {
+            Debug.Log("video stop==1=>?");
             //url = "";
             plbt.SetActive(true);
-            avpro.Stop();
+            avpro.Pause();
+            Debug.Log("video stop==2=>?");
         }
     }
 }

+ 9 - 5
Assets/HotUpdate/Scripts/Scripts/TipAndErrorManager.cs

@@ -15,9 +15,12 @@ public class TipAndErrorManager : WindowSingleton<TipAndErrorManager>
     private void OnTipBackChange(string msg)
     {
         WindowGenSui.Instance.jd = WindowsManager.Instance.preJDInt;
-        try
-        {
+      //  try
+       // {
             JsonData d = JsonMapper.ToObject(msg);
+        if(d!=null&&d.Keys.Contains("type"))
+        {
+
             switch (d["type"].ToString())
             {
                 case "10001":
@@ -53,10 +56,11 @@ public class TipAndErrorManager : WindowSingleton<TipAndErrorManager>
 
             }
         }
-        catch
-        {
+       // }
+      //  catch
+      //  {
 
-        }
+      //  }
         Debug.Log("提示框的回调"+msg);
     }
 }

+ 5 - 0
Assets/HotUpdate/UniGif.meta

@@ -0,0 +1,5 @@
+fileFormatVersion: 2
+guid: 1a6906b6a74529c4a91500e31409ef99
+folderAsset: yes
+DefaultImporter:
+  userData: 

+ 5 - 0
Assets/HotUpdate/UniGif/Example.meta

@@ -0,0 +1,5 @@
+fileFormatVersion: 2
+guid: a14df7e6b24dada4aadb9c292c033e8e
+folderAsset: yes
+DefaultImporter:
+  userData: 

+ 5 - 0
Assets/HotUpdate/UniGif/Example/Script.meta

@@ -0,0 +1,5 @@
+fileFormatVersion: 2
+guid: ca44cc1366b8dc44ea1a3140e5ebc554
+folderAsset: yes
+DefaultImporter:
+  userData: 

+ 360 - 0
Assets/HotUpdate/UniGif/Example/Script/UniGifImage.cs

@@ -0,0 +1,360 @@
+/*
+UniGif
+Copyright (c) 2015 WestHillApps (Hironari Nishioka)
+This software is released under the MIT License.
+http://opensource.org/licenses/mit-license.php
+*/
+
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using UnityEngine;
+using UnityEngine.Networking;
+using UnityEngine.UI;
+
+/// <summary>
+/// Texture Animation from GIF image
+/// </summary>
+[RequireComponent(typeof(UniGifImageAspectController))]
+public class UniGifImage : MonoBehaviour
+{
+    /// <summary>
+    /// This component state
+    /// </summary>
+    public enum State
+    {
+        None,
+        Loading,
+        Ready,
+        Playing,
+        Pause,
+    }
+
+    // Target row image
+    [SerializeField]
+    private RawImage m_rawImage;
+    // Image Aspect Controller
+    [SerializeField]
+    private UniGifImageAspectController m_imgAspectCtrl;
+    // Textures filter mode
+    [SerializeField]
+    private FilterMode m_filterMode = FilterMode.Point;
+    // Textures wrap mode
+    [SerializeField]
+    private TextureWrapMode m_wrapMode = TextureWrapMode.Clamp;
+    // Load from url on start
+    [SerializeField]
+    private bool m_loadOnStart;
+    // GIF image url (WEB or StreamingAssets path)
+    [SerializeField]
+    private string m_loadOnStartUrl;
+    // Rotating on loading
+    [SerializeField]
+    private bool m_rotateOnLoading;
+    // Debug log flag
+    [SerializeField]
+    private bool m_outputDebugLog;
+
+    // Decoded GIF texture list
+    private List<UniGif.GifTexture> m_gifTextureList;
+    // Delay time
+    private float m_delayTime;
+    // Texture index
+    private int m_gifTextureIndex;
+    // loop counter
+    private int m_nowLoopCount;
+
+    /// <summary>
+    /// Now state
+    /// </summary>
+    public State nowState
+    {
+        get;
+        private set;
+    }
+
+    /// <summary>
+    /// Animation loop count (0 is infinite)
+    /// </summary>
+    public int loopCount
+    {
+        get;
+        private set;
+    }
+
+    /// <summary>
+    /// Texture width (px)
+    /// </summary>
+    public int width
+    {
+        get;
+        private set;
+    }
+
+    /// <summary>
+    /// Texture height (px)
+    /// </summary>
+    public int height
+    {
+        get;
+        private set;
+    }
+
+    private void Start()
+    {
+        if (m_rawImage == null)
+        {
+            m_rawImage = GetComponent<RawImage>();
+        }
+        if (m_loadOnStart)
+        {
+            SetGifFromUrl(m_loadOnStartUrl);
+        }
+    }
+
+    private void OnDestroy()
+    {
+        Clear();
+    }
+
+    private void Update()
+    {
+        switch (nowState)
+        {
+            case State.None:
+                break;
+
+            case State.Loading:
+                if (m_rotateOnLoading)
+                {
+                    transform.Rotate(0f, 0f, 30f * Time.deltaTime, Space.Self);
+                }
+                break;
+
+            case State.Ready:
+                break;
+
+            case State.Playing:
+                if (m_rawImage == null || m_gifTextureList == null || m_gifTextureList.Count <= 0)
+                {
+                    return;
+                }
+                if (m_delayTime > Time.time)
+                {
+                    return;
+                }
+                // Change texture
+                m_gifTextureIndex++;
+                if (m_gifTextureIndex >= m_gifTextureList.Count)
+                {
+                    m_gifTextureIndex = 0;
+
+                    if (loopCount > 0)
+                    {
+                        m_nowLoopCount++;
+                        if (m_nowLoopCount >= loopCount)
+                        {
+                            Stop();
+                            return;
+                        }
+                    }
+                }
+                m_rawImage.texture = m_gifTextureList[m_gifTextureIndex].m_texture2d;
+                m_delayTime = Time.time + m_gifTextureList[m_gifTextureIndex].m_delaySec;
+                break;
+
+            case State.Pause:
+                break;
+
+            default:
+                break;
+        }
+    }
+
+    /// <summary>
+    /// Set GIF texture from url
+    /// </summary>
+    /// <param name="url">GIF image url (WEB or StreamingAssets path)</param>
+    /// <param name="autoPlay">Auto play after decode</param>
+    public void SetGifFromUrl(string url, bool autoPlay = true)
+    {
+        StartCoroutine(SetGifFromUrlCoroutine(url, autoPlay));
+    }
+
+    /// <summary>
+    /// Set GIF texture from url
+    /// </summary>
+    /// <param name="url">GIF image url (WEB or StreamingAssets path)</param>
+    /// <param name="autoPlay">Auto play after decode</param>
+    /// <returns>IEnumerator</returns>
+    public IEnumerator SetGifFromUrlCoroutine(string url, bool autoPlay = true)
+    {
+        if (string.IsNullOrEmpty(url))
+        {
+            Debug.LogError("URL is nothing.");
+            yield break;
+        }
+
+        if (nowState == State.Loading)
+        {
+            Debug.LogWarning("Already loading.");
+            yield break;
+        }
+        nowState = State.Loading;
+
+        string path;
+        if (url.StartsWith("http"))
+        {
+            // from WEB
+            path = url;
+        }
+        else
+        {
+            // from StreamingAssets
+            path = Path.Combine("file:///" + Application.streamingAssetsPath, url);
+        }
+
+        // Load file
+        UnityWebRequest request = UnityWebRequest.Get(path);
+        request.SendWebRequest();
+        while (!request.isDone)
+        {
+            yield return null;
+        }
+
+        if (string.IsNullOrEmpty(request.error) == false)
+        {
+            Debug.LogError("File load error.\n" + request.error + "\npath: " + path);
+            nowState = State.None;
+            yield break;
+        }
+
+        Clear();
+        nowState = State.Loading;
+
+        // Get GIF textures
+        yield return StartCoroutine(UniGif.GetTextureListCoroutine(request.downloadHandler.data, (gifTexList, loopCount, width, height) =>
+        {
+            request.Dispose();
+            if (gifTexList != null)
+            {
+                m_gifTextureList = gifTexList;
+                this.loopCount = loopCount;
+                this.width = width;
+                this.height = height;
+                nowState = State.Ready;
+
+                m_imgAspectCtrl.FixAspectRatio(width, height);
+
+                if (m_rotateOnLoading)
+                {
+                    transform.localEulerAngles = Vector3.zero;
+                }
+
+                if (autoPlay)
+                {
+                    Play();
+                }
+            }
+            else
+            {
+                Debug.LogError("Gif texture get error.");
+                nowState = State.None;
+            }
+        },
+        m_filterMode, m_wrapMode, m_outputDebugLog));
+
+    }
+
+    /// <summary>
+    /// Clear GIF texture
+    /// </summary>
+    public void Clear()
+    {
+        if (m_rawImage != null)
+        {
+            m_rawImage.texture = null;
+        }
+
+        if (m_gifTextureList != null)
+        {
+            for (int i = 0; i < m_gifTextureList.Count; i++)
+            {
+                if (m_gifTextureList[i] != null)
+                {
+                    if (m_gifTextureList[i].m_texture2d != null)
+                    {
+                        Destroy(m_gifTextureList[i].m_texture2d);
+                        m_gifTextureList[i].m_texture2d = null;
+                    }
+                    m_gifTextureList[i] = null;
+                }
+            }
+            m_gifTextureList.Clear();
+            m_gifTextureList = null;
+        }
+
+        nowState = State.None;
+    }
+
+    /// <summary>
+    /// Play GIF animation
+    /// </summary>
+    public void Play()
+    {
+        if (nowState != State.Ready)
+        {
+            Debug.LogWarning("State is not READY.");
+            return;
+        }
+        if (m_rawImage == null || m_gifTextureList == null || m_gifTextureList.Count <= 0)
+        {
+            Debug.LogError("Raw Image or GIF Texture is nothing.");
+            return;
+        }
+        nowState = State.Playing;
+        m_rawImage.texture = m_gifTextureList[0].m_texture2d;
+        m_delayTime = Time.time + m_gifTextureList[0].m_delaySec;
+        m_gifTextureIndex = 0;
+        m_nowLoopCount = 0;
+    }
+
+    /// <summary>
+    /// Stop GIF animation
+    /// </summary>
+    public void Stop()
+    {
+        if (nowState != State.Playing && nowState != State.Pause)
+        {
+            Debug.LogWarning("State is not Playing and Pause.");
+            return;
+        }
+        nowState = State.Ready;
+    }
+
+    /// <summary>
+    /// Pause GIF animation
+    /// </summary>
+    public void Pause()
+    {
+        if (nowState != State.Playing)
+        {
+            Debug.LogWarning("State is not Playing.");
+            return;
+        }
+        nowState = State.Pause;
+    }
+
+    /// <summary>
+    /// Resume GIF animation
+    /// </summary>
+    public void Resume()
+    {
+        if (nowState != State.Pause)
+        {
+            Debug.LogWarning("State is not Pause.");
+            return;
+        }
+        nowState = State.Playing;
+    }
+}

+ 12 - 0
Assets/HotUpdate/UniGif/Example/Script/UniGifImage.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 71a962ef61c26864486fed7b06ca2919
+timeCreated: 1467547242
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 21 - 0
Assets/HotUpdate/UniGif/Example/Script/UniGifTest.cs

@@ -0,0 +1,21 @@
+using System.Collections;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// gif显示测试
+/// </summary>
+public class UniGifTest : MonoBehaviour
+{
+    public UniGifImage gifImage;
+
+    private void Start()
+    {
+       StartCoroutine(ViewGifCoroutine());
+    }
+
+    private IEnumerator ViewGifCoroutine()
+    {
+        yield return StartCoroutine(gifImage.SetGifFromUrlCoroutine("pkq.gif"));
+    }
+}

+ 8 - 0
Assets/HotUpdate/UniGif/Example/Script/UniGifTest.cs.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1bd1c08c7a63c4e4dac483de2a449248
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

+ 5 - 0
Assets/HotUpdate/UniGif/Example/Script/Utility.meta

@@ -0,0 +1,5 @@
+fileFormatVersion: 2
+guid: 00273d07608a1b34d82d6c05f35f11ed
+folderAsset: yes
+DefaultImporter:
+  userData: 

+ 89 - 0
Assets/HotUpdate/UniGif/Example/Script/Utility/UniGifImageAspectController.cs

@@ -0,0 +1,89 @@
+/*
+UniGif
+Copyright (c) 2015 WestHillApps (Hironari Nishioka)
+This software is released under the MIT License.
+http://opensource.org/licenses/mit-license.php
+*/
+
+using UnityEngine;
+
+[ExecuteInEditMode]
+public class UniGifImageAspectController : MonoBehaviour
+{
+    public int m_originalWidth;
+    public int m_originalHeight;
+
+    public bool m_fixOnUpdate;
+
+    private Vector2 m_lastSize = Vector2.zero;
+    private Vector2 m_newSize = Vector2.zero;
+
+    private RectTransform m_rectTransform;
+
+    public RectTransform rectTransform
+    {
+        get
+        {
+            return m_rectTransform != null ? m_rectTransform : (m_rectTransform = GetComponent<RectTransform>());
+        }
+    }
+
+    private void Update()
+    {
+#if UNITY_EDITOR
+        if (Application.isPlaying == false)
+        {
+            FixAspectRatio();
+            return;
+        }
+#endif
+
+        if (m_fixOnUpdate)
+        {
+            FixAspectRatio();
+        }
+    }
+
+    public void FixAspectRatio(int originalWidth = -1, int originalHeight = -1)
+    {
+        bool forceUpdate = false;
+        if (originalWidth > 0 && originalHeight > 0)
+        {
+            m_originalWidth = originalWidth;
+            m_originalHeight = originalHeight;
+            forceUpdate = true;
+        }
+        if (m_originalWidth <= 0 || m_originalHeight <= 0)
+        {
+            return;
+        }
+
+        bool changeX;
+        if (forceUpdate || m_lastSize.x != rectTransform.sizeDelta.x)
+        {
+            changeX = true;
+        }
+        else if (m_lastSize.y != rectTransform.sizeDelta.y)
+        {
+            changeX = false;
+        }
+        else
+        {
+            return;
+        }
+
+        if (changeX)
+        {
+            float ratio = rectTransform.sizeDelta.x / m_originalWidth;
+            m_newSize.Set(rectTransform.sizeDelta.x, m_originalHeight * ratio);
+        }
+        else
+        {
+            float ratio = rectTransform.sizeDelta.y / m_originalHeight;
+            m_newSize.Set(m_originalWidth * ratio, rectTransform.sizeDelta.y);
+        }
+        rectTransform.sizeDelta = m_newSize;
+
+        m_lastSize = rectTransform.sizeDelta;
+    }
+}

+ 12 - 0
Assets/HotUpdate/UniGif/Example/Script/Utility/UniGifImageAspectController.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 10b5e2a9913274d43a1e678b6ac98f7a
+timeCreated: 1467549140
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 2218 - 0
Assets/HotUpdate/UniGif/Example/UniGifExample.unity

@@ -0,0 +1,2218 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: 0.25
+    backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 9
+  m_Fog: 0
+  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: 0.01
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 3
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 0}
+  m_HaloStrength: 0.5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+  m_DefaultReflectionMode: 0
+  m_DefaultReflectionResolution: 128
+  m_ReflectionBounces: 1
+  m_ReflectionIntensity: 1
+  m_CustomReflection: {fileID: 0}
+  m_Sun: {fileID: 0}
+  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
+  m_UseRadianceAmbientProbe: 0
+--- !u!157 &4
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 12
+  m_GIWorkflowMode: 1
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 1
+    m_EnableRealtimeLightmaps: 0
+  m_LightmapEditorSettings:
+    serializedVersion: 12
+    m_Resolution: 1
+    m_BakeResolution: 50
+    m_AtlasSize: 1024
+    m_AO: 0
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 0
+    m_CompAOExponentDirect: 0
+    m_ExtractAmbientOcclusion: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 0
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 1024
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 1
+    m_BakeBackend: 0
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 512
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 512
+    m_PVREnvironmentReferencePointCount: 2048
+    m_PVRFilteringMode: 0
+    m_PVRDenoiserTypeDirect: 0
+    m_PVRDenoiserTypeIndirect: 0
+    m_PVRDenoiserTypeAO: 0
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVREnvironmentMIS: 0
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+    m_PVRFilteringAtrousPositionSigmaIndirect: 2
+    m_PVRFilteringAtrousPositionSigmaAO: 1
+    m_ExportTrainingData: 0
+    m_TrainingDataDestination: TrainingData
+    m_LightProbeSampleCountMultiplier: 4
+  m_LightingDataAsset: {fileID: 0}
+  m_LightingSettings: {fileID: 662457823}
+--- !u!196 &5
+NavMeshSettings:
+  serializedVersion: 2
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    serializedVersion: 2
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.4
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666666
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+    maxJobWorkers: 0
+    preserveTilesOutsideBounds: 0
+    debug:
+      m_Flags: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &32275672
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 32275673}
+  - component: {fileID: 32275675}
+  - component: {fileID: 32275674}
+  m_Layer: 5
+  m_Name: Panel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &32275673
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 32275672}
+  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_Children:
+  - {fileID: 693671452}
+  - {fileID: 752814570}
+  - {fileID: 763911186}
+  - {fileID: 373408226}
+  - {fileID: 1109617577}
+  - {fileID: 1739650637}
+  m_Father: {fileID: 248455183}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 1280, y: 720}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &32275674
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 32275672}
+  m_Enabled: 0
+  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: 0.392}
+  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: 10907, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &32275675
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 32275672}
+  m_CullTransparentMesh: 1
+--- !u!1 &248455182
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 248455183}
+  - component: {fileID: 248455186}
+  - component: {fileID: 248455185}
+  - component: {fileID: 248455184}
+  m_Layer: 5
+  m_Name: Canvas
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &248455183
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 248455182}
+  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_Children:
+  - {fileID: 32275673}
+  m_Father: {fileID: 1181593149}
+  m_RootOrder: 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: 0, y: 0}
+  m_Pivot: {x: 0, y: 0}
+--- !u!114 &248455184
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 248455182}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 32
+--- !u!114 &248455185
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 248455182}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 1
+  m_ReferencePixelsPerUnit: 1
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 1280, y: 720}
+  m_ScreenMatchMode: 1
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+  m_PresetInfoIsWorld: 0
+--- !u!223 &248455186
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 248455182}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 1
+  m_Camera: {fileID: 1181593150}
+  m_PlaneDistance: 0
+  m_PixelPerfect: 0
+  m_ReceivesEvents: 1
+  m_OverrideSorting: 0
+  m_OverridePixelPerfect: 0
+  m_SortingBucketNormalizedSize: 0
+  m_AdditionalShaderChannelsFlag: 25
+  m_SortingLayerID: 0
+  m_SortingOrder: 0
+  m_TargetDisplay: 0
+--- !u!1 &279391282
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 279391283}
+  - component: {fileID: 279391286}
+  - component: {fileID: 279391285}
+  - component: {fileID: 279391284}
+  m_Layer: 5
+  m_Name: Button Play
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &279391283
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 279391282}
+  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_Children:
+  - {fileID: 1277180820}
+  m_Father: {fileID: 1739650637}
+  m_RootOrder: 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: 120, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &279391284
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 279391282}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 0
+    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: Highlighted
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 279391285}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!114 &279391285
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 279391282}
+  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: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &279391286
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 279391282}
+  m_CullTransparentMesh: 1
+--- !u!1 &373408225
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 373408226}
+  - component: {fileID: 373408229}
+  - component: {fileID: 373408228}
+  - component: {fileID: 373408227}
+  m_Layer: 5
+  m_Name: InputField
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &373408226
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 373408225}
+  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_Children:
+  - {fileID: 1573880796}
+  - {fileID: 1058623880}
+  m_Father: {fileID: 32275673}
+  m_RootOrder: 3
+  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: -155.9, y: -221}
+  m_SizeDelta: {x: 637.99, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &373408227
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 373408225}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 0
+    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: Highlighted
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 373408228}
+  m_TextComponent: {fileID: 1058623881}
+  m_Placeholder: {fileID: 1573880794}
+  m_ContentType: 0
+  m_InputType: 0
+  m_AsteriskChar: 42
+  m_KeyboardType: 0
+  m_LineType: 0
+  m_HideMobileInput: 0
+  m_CharacterValidation: 0
+  m_CharacterLimit: 0
+  m_OnEndEdit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_CustomCaretColor: 0
+  m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
+  m_Text: pkq.gif
+  m_CaretBlinkRate: 1.7
+  m_CaretWidth: 1
+  m_ReadOnly: 0
+  m_ShouldActivateOnSelect: 1
+--- !u!114 &373408228
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 373408225}
+  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: 10911, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &373408229
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 373408225}
+  m_CullTransparentMesh: 1
+--- !u!850595691 &662457823
+LightingSettings:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Settings.lighting
+  serializedVersion: 3
+  m_GIWorkflowMode: 1
+  m_EnableBakedLightmaps: 1
+  m_EnableRealtimeLightmaps: 0
+  m_RealtimeEnvironmentLighting: 1
+  m_BounceScale: 1
+  m_AlbedoBoost: 1
+  m_IndirectOutputScale: 1
+  m_UsingShadowmask: 0
+  m_BakeBackend: 0
+  m_LightmapMaxSize: 1024
+  m_BakeResolution: 50
+  m_Padding: 2
+  m_TextureCompression: 0
+  m_AO: 0
+  m_AOMaxDistance: 1
+  m_CompAOExponent: 0
+  m_CompAOExponentDirect: 0
+  m_ExtractAO: 0
+  m_MixedBakeMode: 1
+  m_LightmapsBakeMode: 1
+  m_FilterMode: 1
+  m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0}
+  m_ExportTrainingData: 0
+  m_TrainingDataDestination: TrainingData
+  m_RealtimeResolution: 1
+  m_ForceWhiteAlbedo: 0
+  m_ForceUpdates: 0
+  m_FinalGather: 0
+  m_FinalGatherRayCount: 1024
+  m_FinalGatherFiltering: 1
+  m_PVRCulling: 1
+  m_PVRSampling: 1
+  m_PVRDirectSampleCount: 32
+  m_PVRSampleCount: 512
+  m_PVREnvironmentSampleCount: 512
+  m_PVREnvironmentReferencePointCount: 2048
+  m_LightProbeSampleCountMultiplier: 4
+  m_PVRBounces: 2
+  m_PVRMinBounces: 2
+  m_PVREnvironmentMIS: 0
+  m_PVRFilteringMode: 0
+  m_PVRDenoiserTypeDirect: 0
+  m_PVRDenoiserTypeIndirect: 0
+  m_PVRDenoiserTypeAO: 0
+  m_PVRFilterTypeDirect: 0
+  m_PVRFilterTypeIndirect: 0
+  m_PVRFilterTypeAO: 0
+  m_PVRFilteringGaussRadiusDirect: 1
+  m_PVRFilteringGaussRadiusIndirect: 5
+  m_PVRFilteringGaussRadiusAO: 2
+  m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+  m_PVRFilteringAtrousPositionSigmaIndirect: 2
+  m_PVRFilteringAtrousPositionSigmaAO: 1
+--- !u!1 &693671451
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 693671452}
+  - component: {fileID: 693671454}
+  - component: {fileID: 693671453}
+  m_Layer: 5
+  m_Name: TitleText
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &693671452
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 693671451}
+  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_Children: []
+  m_Father: {fileID: 32275673}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 249.5}
+  m_SizeDelta: {x: 1010.6, y: 122.19995}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &693671453
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 693671451}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 60
+    m_FontStyle: 1
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 109
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "Unity GIF\u89E3\u6790\u4E0E\u663E\u793A"
+--- !u!222 &693671454
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 693671451}
+  m_CullTransparentMesh: 1
+--- !u!1 &752814565
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 752814570}
+  - component: {fileID: 752814569}
+  - component: {fileID: 752814568}
+  - component: {fileID: 752814567}
+  - component: {fileID: 752814566}
+  m_Layer: 5
+  m_Name: RawImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &752814566
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 752814565}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 71a962ef61c26864486fed7b06ca2919, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_rawImage: {fileID: 752814568}
+  m_imgAspectCtrl: {fileID: 752814567}
+  m_filterMode: 1
+  m_wrapMode: 1
+  m_loadOnStart: 0
+  m_loadOnStartUrl: 
+  m_rotateOnLoading: 1
+  m_outputDebugLog: 0
+--- !u!114 &752814567
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 752814565}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 10b5e2a9913274d43a1e678b6ac98f7a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_originalWidth: 0
+  m_originalHeight: 0
+  m_fixOnUpdate: 0
+--- !u!114 &752814568
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 752814565}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, 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_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &752814569
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 752814565}
+  m_CullTransparentMesh: 1
+--- !u!224 &752814570
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 752814565}
+  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_Children: []
+  m_Father: {fileID: 32275673}
+  m_RootOrder: 1
+  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: 21.86}
+  m_SizeDelta: {x: 300, y: 300}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &763911185
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 763911186}
+  - component: {fileID: 763911188}
+  - component: {fileID: 763911187}
+  m_Layer: 5
+  m_Name: TIpsText
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &763911186
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 763911185}
+  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_Children: []
+  m_Father: {fileID: 32275673}
+  m_RootOrder: 2
+  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: -475.2, y: -178.5}
+  m_SizeDelta: {x: 1010.6, y: 122.19995}
+  m_Pivot: {x: 0, y: 0.5}
+--- !u!114 &763911187
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 763911185}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 1
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 3
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u8BF7\u8F93\u5165gif\u56FE\u7247url\uFF0C\u652F\u6301http\u94FE\u63A5\uFF0C\u4E5F\u652F\u6301\u672C\u5730\u56FE\u7247\uFF0C\u672C\u5730\u9ED8\u8BA4\u4ECEStreamingAssets\u6587\u4EF6\u5939\u4E2D\u52A0\u8F7D"
+--- !u!222 &763911188
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 763911185}
+  m_CullTransparentMesh: 1
+--- !u!1 &906726471
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 906726472}
+  - component: {fileID: 906726474}
+  - component: {fileID: 906726473}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &906726472
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 906726471}
+  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_Children: []
+  m_Father: {fileID: 1109617577}
+  m_RootOrder: 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 &906726473
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 906726471}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u663E\u793AGIF\u56FE\u7247"
+--- !u!222 &906726474
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 906726471}
+  m_CullTransparentMesh: 1
+--- !u!1 &1051302491
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1051302492}
+  - component: {fileID: 1051302495}
+  - component: {fileID: 1051302494}
+  - component: {fileID: 1051302493}
+  m_Layer: 5
+  m_Name: Button Stop
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1051302492
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1051302491}
+  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_Children:
+  - {fileID: 1744761865}
+  m_Father: {fileID: 1739650637}
+  m_RootOrder: 1
+  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: 120, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1051302493
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1051302491}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 0
+    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: Highlighted
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 1051302494}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!114 &1051302494
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1051302491}
+  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: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1051302495
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1051302491}
+  m_CullTransparentMesh: 1
+--- !u!1 &1058623879
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1058623880}
+  - component: {fileID: 1058623882}
+  - component: {fileID: 1058623881}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1058623880
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1058623879}
+  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_Children: []
+  m_Father: {fileID: 373408226}
+  m_RootOrder: 1
+  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.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1058623881
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1058623879}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 25
+    m_FontStyle: 0
+    m_BestFit: 1
+    m_MinSize: 1
+    m_MaxSize: 25
+    m_Alignment: 3
+    m_AlignByGeometry: 0
+    m_RichText: 0
+    m_HorizontalOverflow: 1
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: pkq.gif
+--- !u!222 &1058623882
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1058623879}
+  m_CullTransparentMesh: 1
+--- !u!1 &1109617576
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1109617577}
+  - component: {fileID: 1109617580}
+  - component: {fileID: 1109617579}
+  - component: {fileID: 1109617578}
+  m_Layer: 5
+  m_Name: Button Submit
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1109617577
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1109617576}
+  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_Children:
+  - {fileID: 906726472}
+  m_Father: {fileID: 32275673}
+  m_RootOrder: 4
+  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: 298.4, y: -221}
+  m_SizeDelta: {x: 250, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1109617578
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1109617576}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 0
+    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: Highlighted
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 1109617579}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 1390710246}
+        m_TargetAssemblyTypeName: 
+        m_MethodName: OnButtonClicked
+        m_Mode: 1
+        m_Arguments:
+          m_ObjectArgument: {fileID: 0}
+          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+          m_IntArgument: 0
+          m_FloatArgument: 0
+          m_StringArgument: 
+          m_BoolArgument: 0
+        m_CallState: 2
+--- !u!114 &1109617579
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1109617576}
+  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: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1109617580
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1109617576}
+  m_CullTransparentMesh: 1
+--- !u!1 &1181593148
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1181593149}
+  - component: {fileID: 1181593150}
+  m_Layer: 5
+  m_Name: UiCamera
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1181593149
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1181593148}
+  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_Children:
+  - {fileID: 248455183}
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!20 &1181593150
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1181593148}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 2
+  m_BackGroundColor: {r: 0.029236369, g: 0.49102423, b: 0.6886792, a: 1}
+  m_projectionMatrixMode: 1
+  m_GateFitMode: 2
+  m_FOVAxisMode: 0
+  m_SensorSize: {x: 36, y: 24}
+  m_LensShift: {x: 0, y: 0}
+  m_FocalLength: 50
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: -10
+  far clip plane: 10
+  field of view: 60
+  orthographic: 1
+  orthographic size: 5.4
+  m_Depth: 0
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 32
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 0
+  m_AllowMSAA: 1
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 0
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!1 &1277180819
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1277180820}
+  - component: {fileID: 1277180822}
+  - component: {fileID: 1277180821}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1277180820
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1277180819}
+  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_Children: []
+  m_Father: {fileID: 279391283}
+  m_RootOrder: 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 &1277180821
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1277180819}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u64AD\u653E"
+--- !u!222 &1277180822
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1277180819}
+  m_CullTransparentMesh: 1
+--- !u!1 &1302108149
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1302108150}
+  - component: {fileID: 1302108153}
+  - component: {fileID: 1302108152}
+  - component: {fileID: 1302108151}
+  m_Layer: 5
+  m_Name: Button Resume
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1302108150
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1302108149}
+  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_Children:
+  - {fileID: 1960270368}
+  m_Father: {fileID: 1739650637}
+  m_RootOrder: 3
+  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: 120, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1302108151
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1302108149}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 0
+    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: Highlighted
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 1302108152}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!114 &1302108152
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1302108149}
+  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: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1302108153
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1302108149}
+  m_CullTransparentMesh: 1
+--- !u!1 &1323841675
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1323841679}
+  - component: {fileID: 1323841678}
+  - component: {fileID: 1323841677}
+  - component: {fileID: 1323841676}
+  m_Layer: 0
+  m_Name: EventSystem
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1323841676
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1323841675}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2d49b7c1bcd2e07499844da127be038d, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_ForceModuleActive: 0
+--- !u!114 &1323841677
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1323841675}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalAxis: Horizontal
+  m_VerticalAxis: Vertical
+  m_SubmitButton: Submit
+  m_CancelButton: Cancel
+  m_InputActionsPerSecond: 10
+  m_RepeatDelay: 0.5
+  m_ForceModuleActive: 0
+--- !u!114 &1323841678
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1323841675}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_FirstSelected: {fileID: 0}
+  m_sendNavigationEvents: 1
+  m_DragThreshold: 5
+--- !u!4 &1323841679
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1323841675}
+  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_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1390710245
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1390710247}
+  - component: {fileID: 1390710246}
+  m_Layer: 0
+  m_Name: UniGifTest
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1390710246
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1390710245}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1bd1c08c7a63c4e4dac483de2a449248, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  gifUrlInput: {fileID: 373408227}
+  gifImage: {fileID: 752814566}
+  loadBtn: {fileID: 1109617578}
+  playBtn: {fileID: 279391284}
+  stopBtn: {fileID: 1051302493}
+  pauseBtn: {fileID: 2031546599}
+  resumeBtn: {fileID: 1302108151}
+--- !u!4 &1390710247
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1390710245}
+  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_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1573880793
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1573880796}
+  - component: {fileID: 1573880795}
+  - component: {fileID: 1573880794}
+  m_Layer: 5
+  m_Name: Placeholder
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1573880794
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1573880793}
+  m_Enabled: 0
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 25
+    m_FontStyle: 2
+    m_BestFit: 1
+    m_MinSize: 1
+    m_MaxSize: 25
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: Enter gif image url...
+--- !u!222 &1573880795
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1573880793}
+  m_CullTransparentMesh: 1
+--- !u!224 &1573880796
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1573880793}
+  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_Children: []
+  m_Father: {fileID: 373408226}
+  m_RootOrder: 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.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &1739650636
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1739650637}
+  - component: {fileID: 1739650638}
+  m_Layer: 5
+  m_Name: btns
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1739650637
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1739650636}
+  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_Children:
+  - {fileID: 279391283}
+  - {fileID: 1051302492}
+  - {fileID: 2031546598}
+  - {fileID: 1302108150}
+  m_Father: {fileID: 32275673}
+  m_RootOrder: 5
+  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: -294.6}
+  m_SizeDelta: {x: 524.2, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1739650638
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1739650636}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 0
+    m_Right: 0
+    m_Top: 0
+    m_Bottom: 0
+  m_ChildAlignment: 4
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 1
+  m_ChildForceExpandHeight: 1
+  m_ChildControlWidth: 0
+  m_ChildControlHeight: 0
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+  m_ReverseArrangement: 0
+--- !u!1 &1744761864
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1744761865}
+  - component: {fileID: 1744761867}
+  - component: {fileID: 1744761866}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1744761865
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1744761864}
+  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_Children: []
+  m_Father: {fileID: 1051302492}
+  m_RootOrder: 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 &1744761866
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1744761864}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u505C\u6B62"
+--- !u!222 &1744761867
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1744761864}
+  m_CullTransparentMesh: 1
+--- !u!1 &1756924453
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1756924454}
+  - component: {fileID: 1756924456}
+  - component: {fileID: 1756924455}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1756924454
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1756924453}
+  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_Children: []
+  m_Father: {fileID: 2031546598}
+  m_RootOrder: 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 &1756924455
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1756924453}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u6682\u505C"
+--- !u!222 &1756924456
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1756924453}
+  m_CullTransparentMesh: 1
+--- !u!1 &1960270367
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1960270368}
+  - component: {fileID: 1960270370}
+  - component: {fileID: 1960270369}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1960270368
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1960270367}
+  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_Children: []
+  m_Father: {fileID: 1302108150}
+  m_RootOrder: 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 &1960270369
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1960270367}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u7EE7\u7EED"
+--- !u!222 &1960270370
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1960270367}
+  m_CullTransparentMesh: 1
+--- !u!1 &2031546597
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2031546598}
+  - component: {fileID: 2031546601}
+  - component: {fileID: 2031546600}
+  - component: {fileID: 2031546599}
+  m_Layer: 5
+  m_Name: Button Pause
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2031546598
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2031546597}
+  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_Children:
+  - {fileID: 1756924454}
+  m_Father: {fileID: 1739650637}
+  m_RootOrder: 2
+  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: 120, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2031546599
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2031546597}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 0
+    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: Highlighted
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 2031546600}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!114 &2031546600
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2031546597}
+  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: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &2031546601
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2031546597}
+  m_CullTransparentMesh: 1

+ 4 - 0
Assets/HotUpdate/UniGif/Example/UniGifExample.unity.meta

@@ -0,0 +1,4 @@
+fileFormatVersion: 2
+guid: 9295f194f952bfb4cbd9956e1b4aea43
+DefaultImporter:
+  userData: 

+ 72 - 0
Assets/HotUpdate/UniGif/UniGif.cs

@@ -0,0 +1,72 @@
+/*
+UniGif
+Copyright (c) 2015 WestHillApps (Hironari Nishioka)
+This software is released under the MIT License.
+http://opensource.org/licenses/mit-license.php
+*/
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public static partial class UniGif
+{
+    /// <summary>
+    /// Get GIF texture list Coroutine
+    /// </summary>
+    /// <param name="bytes">GIF file byte data</param>
+    /// <param name="callback">Callback method(param is GIF texture list, Animation loop count, GIF image width (px), GIF image height (px))</param>
+    /// <param name="filterMode">Textures filter mode</param>
+    /// <param name="wrapMode">Textures wrap mode</param>
+    /// <param name="debugLog">Debug Log Flag</param>
+    /// <returns>IEnumerator</returns>
+    public static IEnumerator GetTextureListCoroutine(
+        byte[] bytes,
+        Action<List<GifTexture>, int, int, int> callback,
+        FilterMode filterMode = FilterMode.Bilinear,
+        TextureWrapMode wrapMode = TextureWrapMode.Clamp,
+        bool debugLog = false)
+    {
+        int loopCount = -1;
+        int width = 0;
+        int height = 0;
+
+        // Set GIF data
+        var gifData = new GifData();
+        if (SetGifData(bytes, ref gifData, debugLog) == false)
+        {
+            Debug.LogError("GIF file data set error.");
+            if (callback != null)
+            {
+                callback(null, loopCount, width, height);
+            }
+            yield break;
+        }
+
+        // Decode to textures from GIF data
+        List<GifTexture> gifTexList = null;
+        yield return DecodeTextureCoroutine(gifData, result => gifTexList = result, filterMode, wrapMode);
+
+        if (gifTexList == null || gifTexList.Count <= 0)
+        {
+            Debug.LogError("GIF texture decode error.");
+            if (callback != null)
+            {
+                callback(null, loopCount, width, height);
+            }
+            yield break;
+        }
+
+        loopCount = gifData.m_appEx.loopCount;
+        width = gifData.m_logicalScreenWidth;
+        height = gifData.m_logicalScreenHeight;
+
+        if (callback != null)
+        {
+            callback(gifTexList, loopCount, width, height);
+        }
+
+        yield break;
+    }
+}

+ 8 - 0
Assets/HotUpdate/UniGif/UniGif.cs.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: dc888f2174383f449acbb36759059036
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

+ 275 - 0
Assets/HotUpdate/UniGif/UniGifConst.cs

@@ -0,0 +1,275 @@
+/*
+UniGif
+Copyright (c) 2015 WestHillApps (Hironari Nishioka)
+This software is released under the MIT License.
+http://opensource.org/licenses/mit-license.php
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using UnityEngine;
+
+public static partial class UniGif
+{
+    /// <summary>
+    /// Gif Texture
+    /// </summary>
+    public class GifTexture
+    {
+        // Texture
+        public Texture2D m_texture2d;
+        // Delay time until the next texture.
+        public float m_delaySec;
+
+        public GifTexture(Texture2D texture2d, float delaySec)
+        {
+            m_texture2d = texture2d;
+            m_delaySec = delaySec;
+        }
+    }
+
+    /// <summary>
+    /// GIF Data Format
+    /// </summary>
+    private struct GifData
+    {
+        // Signature
+        public byte m_sig0, m_sig1, m_sig2;
+        // Version
+        public byte m_ver0, m_ver1, m_ver2;
+        // Logical Screen Width
+        public ushort m_logicalScreenWidth;
+        // Logical Screen Height
+        public ushort m_logicalScreenHeight;
+        // Global Color Table Flag
+        public bool m_globalColorTableFlag;
+        // Color Resolution
+        public int m_colorResolution;
+        // Sort Flag
+        public bool m_sortFlag;
+        // Size of Global Color Table
+        public int m_sizeOfGlobalColorTable;
+        // Background Color Index
+        public byte m_bgColorIndex;
+        // Pixel Aspect Ratio
+        public byte m_pixelAspectRatio;
+        // Global Color Table
+        public List<byte[]> m_globalColorTable;
+        // ImageBlock
+        public List<ImageBlock> m_imageBlockList;
+        // GraphicControlExtension
+        public List<GraphicControlExtension> m_graphicCtrlExList;
+        // Comment Extension
+        public List<CommentExtension> m_commentExList;
+        // Plain Text Extension
+        public List<PlainTextExtension> m_plainTextExList;
+        // Application Extension
+        public ApplicationExtension m_appEx;
+        // Trailer
+        public byte m_trailer;
+
+        public string signature
+        {
+            get
+            {
+                char[] c = { (char)m_sig0, (char)m_sig1, (char)m_sig2 };
+                return new string(c);
+            }
+        }
+
+        public string version
+        {
+            get
+            {
+                char[] c = { (char)m_ver0, (char)m_ver1, (char)m_ver2 };
+                return new string(c);
+            }
+        }
+
+        public void Dump()
+        {
+            Debug.Log("GIF Type: " + signature + "-" + version);
+            Debug.Log("Image Size: " + m_logicalScreenWidth + "x" + m_logicalScreenHeight);
+            Debug.Log("Animation Image Count: " + m_imageBlockList.Count);
+            Debug.Log("Animation Loop Count (0 is infinite): " + m_appEx.loopCount);
+            if (m_graphicCtrlExList != null && m_graphicCtrlExList.Count > 0)
+            {
+                var sb = new StringBuilder("Animation Delay Time (1/100sec)");
+                for (int i = 0; i < m_graphicCtrlExList.Count; i++)
+                {
+                    sb.Append(", ");
+                    sb.Append(m_graphicCtrlExList[i].m_delayTime);
+                }
+                Debug.Log(sb.ToString());
+            }
+            Debug.Log("Application Identifier: " + m_appEx.applicationIdentifier);
+            Debug.Log("Application Authentication Code: " + m_appEx.applicationAuthenticationCode);
+        }
+    }
+
+    /// <summary>
+    /// Image Block
+    /// </summary>
+    private struct ImageBlock
+    {
+        // Image Separator
+        public byte m_imageSeparator;
+        // Image Left Position
+        public ushort m_imageLeftPosition;
+        // Image Top Position
+        public ushort m_imageTopPosition;
+        // Image Width
+        public ushort m_imageWidth;
+        // Image Height
+        public ushort m_imageHeight;
+        // Local Color Table Flag
+        public bool m_localColorTableFlag;
+        // Interlace Flag
+        public bool m_interlaceFlag;
+        // Sort Flag
+        public bool m_sortFlag;
+        // Size of Local Color Table
+        public int m_sizeOfLocalColorTable;
+        // Local Color Table
+        public List<byte[]> m_localColorTable;
+        // LZW Minimum Code Size
+        public byte m_lzwMinimumCodeSize;
+        // Block Size & Image Data List
+        public List<ImageDataBlock> m_imageDataList;
+
+        public struct ImageDataBlock
+        {
+            // Block Size
+            public byte m_blockSize;
+            // Image Data
+            public byte[] m_imageData;
+        }
+    }
+
+    /// <summary>
+    /// Graphic Control Extension
+    /// </summary>
+    private struct GraphicControlExtension
+    {
+        // Extension Introducer
+        public byte m_extensionIntroducer;
+        // Graphic Control Label
+        public byte m_graphicControlLabel;
+        // Block Size
+        public byte m_blockSize;
+        // Disposal Mothod
+        public ushort m_disposalMethod;
+        // Transparent Color Flag
+        public bool m_transparentColorFlag;
+        // Delay Time
+        public ushort m_delayTime;
+        // Transparent Color Index
+        public byte m_transparentColorIndex;
+        // Block Terminator
+        public byte m_blockTerminator;
+    }
+
+    /// <summary>
+    /// Comment Extension
+    /// </summary>
+    private struct CommentExtension
+    {
+        // Extension Introducer
+        public byte m_extensionIntroducer;
+        // Comment Label
+        public byte m_commentLabel;
+        // Block Size & Comment Data List
+        public List<CommentDataBlock> m_commentDataList;
+
+        public struct CommentDataBlock
+        {
+            // Block Size
+            public byte m_blockSize;
+            // Image Data
+            public byte[] m_commentData;
+        }
+    }
+
+    /// <summary>
+    /// Plain Text Extension
+    /// </summary>
+    private struct PlainTextExtension
+    {
+        // Extension Introducer
+        public byte m_extensionIntroducer;
+        // Plain Text Label
+        public byte m_plainTextLabel;
+        // Block Size
+        public byte m_blockSize;
+        // Block Size & Plain Text Data List
+        public List<PlainTextDataBlock> m_plainTextDataList;
+
+        public struct PlainTextDataBlock
+        {
+            // Block Size
+            public byte m_blockSize;
+            // Plain Text Data
+            public byte[] m_plainTextData;
+        }
+    }
+
+    /// <summary>
+    /// Application Extension
+    /// </summary>
+    private struct ApplicationExtension
+    {
+        // Extension Introducer
+        public byte m_extensionIntroducer;
+        // Extension Label
+        public byte m_extensionLabel;
+        // Block Size
+        public byte m_blockSize;
+        // Application Identifier
+        public byte m_appId1, m_appId2, m_appId3, m_appId4, m_appId5, m_appId6, m_appId7, m_appId8;
+        // Application Authentication Code
+        public byte m_appAuthCode1, m_appAuthCode2, m_appAuthCode3;
+        // Block Size & Application Data List
+        public List<ApplicationDataBlock> m_appDataList;
+
+        public struct ApplicationDataBlock
+        {
+            // Block Size
+            public byte m_blockSize;
+            // Application Data
+            public byte[] m_applicationData;
+        }
+
+        public string applicationIdentifier
+        {
+            get
+            {
+                char[] c = { (char)m_appId1, (char)m_appId2, (char)m_appId3, (char)m_appId4, (char)m_appId5, (char)m_appId6, (char)m_appId7, (char)m_appId8 };
+                return new string(c);
+            }
+        }
+
+        public string applicationAuthenticationCode
+        {
+            get
+            {
+                char[] c = { (char)m_appAuthCode1, (char)m_appAuthCode2, (char)m_appAuthCode3 };
+                return new string(c);
+            }
+        }
+
+        public int loopCount
+        {
+            get
+            {
+                if (m_appDataList == null || m_appDataList.Count < 1 ||
+                    m_appDataList[0].m_applicationData.Length < 3 ||
+                    m_appDataList[0].m_applicationData[0] != 0x01)
+                {
+                    return 0;
+                }
+                return BitConverter.ToUInt16(m_appDataList[0].m_applicationData, 1);
+            }
+        }
+    }
+}

+ 8 - 0
Assets/HotUpdate/UniGif/UniGifConst.cs.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 37f5eaccd43e9b94ebe77bd6edcd1377
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

+ 579 - 0
Assets/HotUpdate/UniGif/UniGifDecoder.cs

@@ -0,0 +1,579 @@
+/*
+UniGif
+Copyright (c) 2015 WestHillApps (Hironari Nishioka)
+This software is released under the MIT License.
+http://opensource.org/licenses/mit-license.php
+*/
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using UnityEngine;
+
+public static partial class UniGif
+{
+    /// <summary>
+    /// Decode to textures from GIF data
+    /// </summary>
+    /// <param name="gifData">GIF data</param>
+    /// <param name="callback">Callback method(param is GIF texture list)</param>
+    /// <param name="filterMode">Textures filter mode</param>
+    /// <param name="wrapMode">Textures wrap mode</param>
+    /// <returns>IEnumerator</returns>
+    private static IEnumerator DecodeTextureCoroutine(GifData gifData, Action<List<GifTexture>> callback, FilterMode filterMode, TextureWrapMode wrapMode)
+    {
+        if (gifData.m_imageBlockList == null || gifData.m_imageBlockList.Count < 1)
+        {
+            yield break;
+        }
+
+        List<GifTexture> gifTexList = new List<GifTexture>(gifData.m_imageBlockList.Count);
+        List<ushort> disposalMethodList = new List<ushort>(gifData.m_imageBlockList.Count);
+
+        int imgIndex = 0;
+
+        for (int i = 0; i < gifData.m_imageBlockList.Count; i++)
+        {
+            byte[] decodedData = GetDecodedData(gifData.m_imageBlockList[i]);
+
+            GraphicControlExtension? graphicCtrlEx = GetGraphicCtrlExt(gifData, imgIndex);
+
+            int transparentIndex = GetTransparentIndex(graphicCtrlEx);
+
+            disposalMethodList.Add(GetDisposalMethod(graphicCtrlEx));
+
+            Color32 bgColor;
+            List<byte[]> colorTable = GetColorTableAndSetBgColor(gifData, gifData.m_imageBlockList[i], transparentIndex, out bgColor);
+
+            yield return 0;
+
+            bool filledTexture;
+            Texture2D tex = CreateTexture2D(gifData, gifTexList, imgIndex, disposalMethodList, bgColor, filterMode, wrapMode, out filledTexture);
+
+            yield return 0;
+
+            // Set pixel data
+            int dataIndex = 0;
+            // Reverse set pixels. because GIF data starts from the top left.
+            for (int y = tex.height - 1; y >= 0; y--)
+            {
+                SetTexturePixelRow(tex, y, gifData.m_imageBlockList[i], decodedData, ref dataIndex, colorTable, bgColor, transparentIndex, filledTexture);
+            }
+            tex.Apply();
+
+            yield return 0;
+
+            float delaySec = GetDelaySec(graphicCtrlEx);
+
+            // Add to GIF texture list
+            gifTexList.Add(new GifTexture(tex, delaySec));
+
+            imgIndex++;
+        }
+
+        if (callback != null)
+        {
+            callback(gifTexList);
+        }
+
+        yield break;
+    }
+
+    #region Call from DecodeTexture methods
+
+    /// <summary>
+    /// Get decoded image data from ImageBlock
+    /// </summary>
+    private static byte[] GetDecodedData(ImageBlock imgBlock)
+    {
+        // Combine LZW compressed data
+        List<byte> lzwData = new List<byte>();
+        for (int i = 0; i < imgBlock.m_imageDataList.Count; i++)
+        {
+            for (int k = 0; k < imgBlock.m_imageDataList[i].m_imageData.Length; k++)
+            {
+                lzwData.Add(imgBlock.m_imageDataList[i].m_imageData[k]);
+            }
+        }
+
+        // LZW decode
+        int needDataSize = imgBlock.m_imageHeight * imgBlock.m_imageWidth;
+        byte[] decodedData = DecodeGifLZW(lzwData, imgBlock.m_lzwMinimumCodeSize, needDataSize);
+
+        // Sort interlace GIF
+        if (imgBlock.m_interlaceFlag)
+        {
+            decodedData = SortInterlaceGifData(decodedData, imgBlock.m_imageWidth);
+        }
+        return decodedData;
+    }
+
+    /// <summary>
+    /// Get color table and set background color (local or global)
+    /// </summary>
+    private static List<byte[]> GetColorTableAndSetBgColor(GifData gifData, ImageBlock imgBlock, int transparentIndex, out Color32 bgColor)
+    {
+        List<byte[]> colorTable = imgBlock.m_localColorTableFlag ? imgBlock.m_localColorTable : gifData.m_globalColorTableFlag ? gifData.m_globalColorTable : null;
+
+        if (colorTable != null)
+        {
+            // Set background color from color table
+            byte[] bgRgb = colorTable[gifData.m_bgColorIndex];
+            bgColor = new Color32(bgRgb[0], bgRgb[1], bgRgb[2], (byte)(transparentIndex == gifData.m_bgColorIndex ? 0 : 255));
+        }
+        else
+        {
+            bgColor = Color.black;
+        }
+
+        return colorTable;
+    }
+
+    /// <summary>
+    /// Get GraphicControlExtension from GifData
+    /// </summary>
+    private static GraphicControlExtension? GetGraphicCtrlExt(GifData gifData, int imgBlockIndex)
+    {
+        if (gifData.m_graphicCtrlExList != null && gifData.m_graphicCtrlExList.Count > imgBlockIndex)
+        {
+            return gifData.m_graphicCtrlExList[imgBlockIndex];
+        }
+        return null;
+    }
+
+    /// <summary>
+    /// Get transparent color index from GraphicControlExtension
+    /// </summary>
+    private static int GetTransparentIndex(GraphicControlExtension? graphicCtrlEx)
+    {
+        int transparentIndex = -1;
+        if (graphicCtrlEx != null && graphicCtrlEx.Value.m_transparentColorFlag)
+        {
+            transparentIndex = graphicCtrlEx.Value.m_transparentColorIndex;
+        }
+        return transparentIndex;
+    }
+
+    /// <summary>
+    /// Get delay seconds from GraphicControlExtension
+    /// </summary>
+    private static float GetDelaySec(GraphicControlExtension? graphicCtrlEx)
+    {
+        // Get delay sec from GraphicControlExtension
+        float delaySec = graphicCtrlEx != null ? graphicCtrlEx.Value.m_delayTime / 100f : (1f / 60f);
+        if (delaySec <= 0f)
+        {
+            delaySec = 0.1f;
+        }
+        return delaySec;
+    }
+
+    /// <summary>
+    /// Get disposal method from GraphicControlExtension
+    /// </summary>
+    private static ushort GetDisposalMethod(GraphicControlExtension? graphicCtrlEx)
+    {
+        return graphicCtrlEx != null ? graphicCtrlEx.Value.m_disposalMethod : (ushort)2;
+    }
+
+    /// <summary>
+    /// Create Texture2D object and initial settings
+    /// </summary>
+    private static Texture2D CreateTexture2D(GifData gifData, List<GifTexture> gifTexList, int imgIndex, List<ushort> disposalMethodList, Color32 bgColor, FilterMode filterMode, TextureWrapMode wrapMode, out bool filledTexture)
+    {
+        filledTexture = false;
+
+        // Create texture
+        Texture2D tex = new Texture2D(gifData.m_logicalScreenWidth, gifData.m_logicalScreenHeight, TextureFormat.ARGB32, false);
+        tex.filterMode = filterMode;
+        tex.wrapMode = wrapMode;
+
+        // Check dispose
+        ushort disposalMethod = imgIndex > 0 ? disposalMethodList[imgIndex - 1] : (ushort)2;
+        int useBeforeIndex = -1;
+        if (disposalMethod == 0)
+        {
+            // 0 (No disposal specified)
+        }
+        else if (disposalMethod == 1)
+        {
+            // 1 (Do not dispose)
+            useBeforeIndex = imgIndex - 1;
+        }
+        else if (disposalMethod == 2)
+        {
+            // 2 (Restore to background color)
+            filledTexture = true;
+            Color32[] pix = new Color32[tex.width * tex.height];
+            for (int i = 0; i < pix.Length; i++)
+            {
+                pix[i] = bgColor;
+            }
+            tex.SetPixels32(pix);
+            tex.Apply();
+        }
+        else if (disposalMethod == 3)
+        {
+            // 3 (Restore to previous)
+            for (int i = imgIndex - 1; i >= 0; i--)
+            {
+                if (disposalMethodList[i] == 0 || disposalMethodList[i] == 1)
+                {
+                    useBeforeIndex = i;
+                    break;
+                }
+            }
+        }
+
+        if (useBeforeIndex >= 0)
+        {
+            filledTexture = true;
+            Color32[] pix = gifTexList[useBeforeIndex].m_texture2d.GetPixels32();
+            tex.SetPixels32(pix);
+            tex.Apply();
+        }
+
+        return tex;
+    }
+
+    /// <summary>
+    /// Set texture pixel row
+    /// </summary>
+    private static void SetTexturePixelRow(Texture2D tex, int y, ImageBlock imgBlock, byte[] decodedData, ref int dataIndex, List<byte[]> colorTable, Color32 bgColor, int transparentIndex, bool filledTexture)
+    {
+        // Row no (0~)
+        int row = tex.height - 1 - y;
+
+        for (int x = 0; x < tex.width; x++)
+        {
+            // Line no (0~)
+            int line = x;
+
+            // Out of image blocks
+            if (row < imgBlock.m_imageTopPosition ||
+                row >= imgBlock.m_imageTopPosition + imgBlock.m_imageHeight ||
+                line < imgBlock.m_imageLeftPosition ||
+                line >= imgBlock.m_imageLeftPosition + imgBlock.m_imageWidth)
+            {
+                // Get pixel color from bg color
+                if (filledTexture == false)
+                {
+                    tex.SetPixel(x, y, bgColor);
+                }
+                continue;
+            }
+
+            // Out of decoded data
+            if (dataIndex >= decodedData.Length)
+            {
+                if (filledTexture == false)
+                {
+                    tex.SetPixel(x, y, bgColor);
+                    if (dataIndex == decodedData.Length)
+                    {
+                        Debug.LogError("dataIndex exceeded the size of decodedData. dataIndex:" + dataIndex + " decodedData.Length:" + decodedData.Length + " y:" + y + " x:" + x);
+                    }
+                }
+                dataIndex++;
+                continue;
+            }
+
+            // Get pixel color from color table
+            {
+                byte colorIndex = decodedData[dataIndex];
+                if (colorTable == null || colorTable.Count <= colorIndex)
+                {
+                    if (filledTexture == false)
+                    {
+                        tex.SetPixel(x, y, bgColor);
+                        if (colorTable == null)
+                        {
+                            Debug.LogError("colorIndex exceeded the size of colorTable. colorTable is null. colorIndex:" + colorIndex);
+                        }
+                        else
+                        {
+                            Debug.LogError("colorIndex exceeded the size of colorTable. colorTable.Count:" + colorTable.Count + " colorIndex:" + colorIndex);
+                        }
+                    }
+                    dataIndex++;
+                    continue;
+                }
+                byte[] rgb = colorTable[colorIndex];
+
+                // Set alpha
+                byte alpha = transparentIndex >= 0 && transparentIndex == colorIndex ? (byte)0 : (byte)255;
+
+                if (filledTexture == false || alpha != 0)
+                {
+                    // Set color
+                    Color32 col = new Color32(rgb[0], rgb[1], rgb[2], alpha);
+                    tex.SetPixel(x, y, col);
+                }
+            }
+
+            dataIndex++;
+        }
+    }
+
+    #endregion
+
+    #region Decode LZW & Sort interrace methods
+
+    /// <summary>
+    /// GIF LZW decode
+    /// </summary>
+    /// <param name="compData">LZW compressed data</param>
+    /// <param name="lzwMinimumCodeSize">LZW minimum code size</param>
+    /// <param name="needDataSize">Need decoded data size</param>
+    /// <returns>Decoded data array</returns>
+    private static byte[] DecodeGifLZW(List<byte> compData, int lzwMinimumCodeSize, int needDataSize)
+    {
+        int clearCode = 0;
+        int finishCode = 0;
+
+        // Initialize dictionary
+        Dictionary<int, string> dic = new Dictionary<int, string>();
+        int lzwCodeSize = 0;
+        InitDictionary(dic, lzwMinimumCodeSize, out lzwCodeSize, out clearCode, out finishCode);
+
+        // Convert to bit array
+        byte[] compDataArr = compData.ToArray();
+        var bitData = new BitArray(compDataArr);
+
+        byte[] output = new byte[needDataSize];
+        int outputAddIndex = 0;
+
+        string prevEntry = null;
+
+        bool dicInitFlag = false;
+
+        int bitDataIndex = 0;
+
+        // LZW decode loop
+        while (bitDataIndex < bitData.Length)
+        {
+            if (dicInitFlag)
+            {
+                InitDictionary(dic, lzwMinimumCodeSize, out lzwCodeSize, out clearCode, out finishCode);
+                dicInitFlag = false;
+            }
+
+            int key = bitData.GetNumeral(bitDataIndex, lzwCodeSize);
+
+            string entry = null;
+
+            if (key == clearCode)
+            {
+                // Clear (Initialize dictionary)
+                dicInitFlag = true;
+                bitDataIndex += lzwCodeSize;
+                prevEntry = null;
+                continue;
+            }
+            else if (key == finishCode)
+            {
+                // Exit
+                Debug.LogWarning("early stop code. bitDataIndex:" + bitDataIndex + " lzwCodeSize:" + lzwCodeSize + " key:" + key + " dic.Count:" + dic.Count);
+                break;
+            }
+            else if (dic.ContainsKey(key))
+            {
+                // Output from dictionary
+                entry = dic[key];
+            }
+            else if (key >= dic.Count)
+            {
+                if (prevEntry != null)
+                {
+                    // Output from estimation
+                    entry = prevEntry + prevEntry[0];
+                }
+                else
+                {
+                    Debug.LogWarning("It is strange that come here. bitDataIndex:" + bitDataIndex + " lzwCodeSize:" + lzwCodeSize + " key:" + key + " dic.Count:" + dic.Count);
+                    bitDataIndex += lzwCodeSize;
+                    continue;
+                }
+            }
+            else
+            {
+                Debug.LogWarning("It is strange that come here. bitDataIndex:" + bitDataIndex + " lzwCodeSize:" + lzwCodeSize + " key:" + key + " dic.Count:" + dic.Count);
+                bitDataIndex += lzwCodeSize;
+                continue;
+            }
+
+            // Output
+            // Take out 8 bits from the string.
+            byte[] temp = Encoding.Unicode.GetBytes(entry);
+            for (int i = 0; i < temp.Length; i++)
+            {
+                if (i % 2 == 0)
+                {
+                    output[outputAddIndex] = temp[i];
+                    outputAddIndex++;
+                }
+            }
+
+            if (outputAddIndex >= needDataSize)
+            {
+                // Exit
+                break;
+            }
+
+            if (prevEntry != null)
+            {
+                // Add to dictionary
+                dic.Add(dic.Count, prevEntry + entry[0]);
+            }
+
+            prevEntry = entry;
+
+            bitDataIndex += lzwCodeSize;
+
+            if (lzwCodeSize == 3 && dic.Count >= 8)
+            {
+                lzwCodeSize = 4;
+            }
+            else if (lzwCodeSize == 4 && dic.Count >= 16)
+            {
+                lzwCodeSize = 5;
+            }
+            else if (lzwCodeSize == 5 && dic.Count >= 32)
+            {
+                lzwCodeSize = 6;
+            }
+            else if (lzwCodeSize == 6 && dic.Count >= 64)
+            {
+                lzwCodeSize = 7;
+            }
+            else if (lzwCodeSize == 7 && dic.Count >= 128)
+            {
+                lzwCodeSize = 8;
+            }
+            else if (lzwCodeSize == 8 && dic.Count >= 256)
+            {
+                lzwCodeSize = 9;
+            }
+            else if (lzwCodeSize == 9 && dic.Count >= 512)
+            {
+                lzwCodeSize = 10;
+            }
+            else if (lzwCodeSize == 10 && dic.Count >= 1024)
+            {
+                lzwCodeSize = 11;
+            }
+            else if (lzwCodeSize == 11 && dic.Count >= 2048)
+            {
+                lzwCodeSize = 12;
+            }
+            else if (lzwCodeSize == 12 && dic.Count >= 4096)
+            {
+                int nextKey = bitData.GetNumeral(bitDataIndex, lzwCodeSize);
+                if (nextKey != clearCode)
+                {
+                    dicInitFlag = true;
+                }
+            }
+        }
+
+        return output;
+    }
+
+    /// <summary>
+    /// Initialize dictionary
+    /// </summary>
+    /// <param name="dic">Dictionary</param>
+    /// <param name="lzwMinimumCodeSize">LZW minimum code size</param>
+    /// <param name="lzwCodeSize">out LZW code size</param>
+    /// <param name="clearCode">out Clear code</param>
+    /// <param name="finishCode">out Finish code</param>
+    private static void InitDictionary(Dictionary<int, string> dic, int lzwMinimumCodeSize, out int lzwCodeSize, out int clearCode, out int finishCode)
+    {
+        int dicLength = (int)Math.Pow(2, lzwMinimumCodeSize);
+
+        clearCode = dicLength;
+        finishCode = clearCode + 1;
+
+        dic.Clear();
+
+        for (int i = 0; i < dicLength + 2; i++)
+        {
+            dic.Add(i, ((char)i).ToString());
+        }
+
+        lzwCodeSize = lzwMinimumCodeSize + 1;
+    }
+
+    /// <summary>
+    /// Sort interlace GIF data
+    /// </summary>
+    /// <param name="decodedData">Decoded GIF data</param>
+    /// <param name="xNum">Pixel number of horizontal row</param>
+    /// <returns>Sorted data</returns>
+    private static byte[] SortInterlaceGifData(byte[] decodedData, int xNum)
+    {
+        int rowNo = 0;
+        int dataIndex = 0;
+        var newArr = new byte[decodedData.Length];
+        // Every 8th. row, starting with row 0.
+        for (int i = 0; i < newArr.Length; i++)
+        {
+            if (rowNo % 8 == 0)
+            {
+                newArr[i] = decodedData[dataIndex];
+                dataIndex++;
+            }
+            if (i != 0 && i % xNum == 0)
+            {
+                rowNo++;
+            }
+        }
+        rowNo = 0;
+        // Every 8th. row, starting with row 4.
+        for (int i = 0; i < newArr.Length; i++)
+        {
+            if (rowNo % 8 == 4)
+            {
+                newArr[i] = decodedData[dataIndex];
+                dataIndex++;
+            }
+            if (i != 0 && i % xNum == 0)
+            {
+                rowNo++;
+            }
+        }
+        rowNo = 0;
+        // Every 4th. row, starting with row 2.
+        for (int i = 0; i < newArr.Length; i++)
+        {
+            if (rowNo % 4 == 2)
+            {
+                newArr[i] = decodedData[dataIndex];
+                dataIndex++;
+            }
+            if (i != 0 && i % xNum == 0)
+            {
+                rowNo++;
+            }
+        }
+        rowNo = 0;
+        // Every 2nd. row, starting with row 1.
+        for (int i = 0; i < newArr.Length; i++)
+        {
+            if (rowNo % 8 != 0 && rowNo % 8 != 4 && rowNo % 4 != 2)
+            {
+                newArr[i] = decodedData[dataIndex];
+                dataIndex++;
+            }
+            if (i != 0 && i % xNum == 0)
+            {
+                rowNo++;
+            }
+        }
+
+        return newArr;
+    }
+
+    #endregion
+}

+ 8 - 0
Assets/HotUpdate/UniGif/UniGifDecoder.cs.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7f251ba69c91af840b8837da30503cbe
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

+ 56 - 0
Assets/HotUpdate/UniGif/UniGifExtension.cs

@@ -0,0 +1,56 @@
+using UnityEngine;
+using System.Collections;
+
+/// <summary>
+/// Extension methods class
+/// </summary>
+public static class UniGifExtension
+{
+    /// <summary>
+    /// Convert BitArray to int (Specifies the start index and bit length)
+    /// </summary>
+    /// <param name="startIndex">Start index</param>
+    /// <param name="bitLength">Bit length</param>
+    /// <returns>Converted int</returns>
+    public static int GetNumeral(this BitArray array, int startIndex, int bitLength)
+    {
+        var newArray = new BitArray(bitLength);
+
+        for (int i = 0; i < bitLength; i++)
+        {
+            if (array.Length <= startIndex + i)
+            {
+                newArray[i] = false;
+            }
+            else
+            {
+                bool bit = array.Get(startIndex + i);
+                newArray[i] = bit;
+            }
+        }
+
+        return newArray.ToNumeral();
+    }
+
+    /// <summary>
+    /// Convert BitArray to int
+    /// </summary>
+    /// <returns>Converted int</returns>
+    public static int ToNumeral(this BitArray array)
+    {
+        if (array == null)
+        {
+            Debug.LogError("array is nothing.");
+            return 0;
+        }
+        if (array.Length > 32)
+        {
+            Debug.LogError("must be at most 32 bits long.");
+            return 0;
+        }
+
+        var result = new int[1];
+        array.CopyTo(result, 0);
+        return result[0];
+    }
+}

+ 12 - 0
Assets/HotUpdate/UniGif/UniGifExtension.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: eeaa59f4867db714ca47c5a842078952
+timeCreated: 1489477916
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 603 - 0
Assets/HotUpdate/UniGif/UniGifFormatter.cs

@@ -0,0 +1,603 @@
+/*
+UniGif
+Copyright (c) 2015 WestHillApps (Hironari Nishioka)
+This software is released under the MIT License.
+http://opensource.org/licenses/mit-license.php
+*/
+
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+public static partial class UniGif
+{
+    /// <summary>
+    /// Set GIF data
+    /// </summary>
+    /// <param name="gifBytes">GIF byte data</param>
+    /// <param name="gifData">ref GIF data</param>
+    /// <param name="debugLog">Debug log flag</param>
+    /// <returns>Result</returns>
+    private static bool SetGifData(byte[] gifBytes, ref GifData gifData, bool debugLog)
+    {
+        if (debugLog)
+        {
+            Debug.Log("SetGifData Start.");
+        }
+
+        if (gifBytes == null || gifBytes.Length <= 0)
+        {
+            Debug.LogError("bytes is nothing.");
+            return false;
+        }
+
+        int byteIndex = 0;
+
+        if (SetGifHeader(gifBytes, ref byteIndex, ref gifData) == false)
+        {
+            Debug.LogError("GIF header set error.");
+            return false;
+        }
+
+        if (SetGifBlock(gifBytes, ref byteIndex, ref gifData) == false)
+        {
+            Debug.LogError("GIF block set error.");
+            return false;
+        }
+
+        if (debugLog)
+        {
+            gifData.Dump();
+            Debug.Log("SetGifData Finish.");
+        }
+        return true;
+    }
+
+    private static bool SetGifHeader(byte[] gifBytes, ref int byteIndex, ref GifData gifData)
+    {
+        // Signature(3 Bytes)
+        // 0x47 0x49 0x46 (GIF)
+        if (gifBytes[0] != 'G' || gifBytes[1] != 'I' || gifBytes[2] != 'F')
+        {
+            Debug.LogError("This is not GIF image.");
+            return false;
+        }
+        gifData.m_sig0 = gifBytes[0];
+        gifData.m_sig1 = gifBytes[1];
+        gifData.m_sig2 = gifBytes[2];
+
+        // Version(3 Bytes)
+        // 0x38 0x37 0x61 (87a) or 0x38 0x39 0x61 (89a)
+        if ((gifBytes[3] != '8' || gifBytes[4] != '7' || gifBytes[5] != 'a') &&
+            (gifBytes[3] != '8' || gifBytes[4] != '9' || gifBytes[5] != 'a'))
+        {
+            Debug.LogError("GIF version error.\nSupported only GIF87a or GIF89a.");
+            return false;
+        }
+        gifData.m_ver0 = gifBytes[3];
+        gifData.m_ver1 = gifBytes[4];
+        gifData.m_ver2 = gifBytes[5];
+
+        // Logical Screen Width(2 Bytes)
+        gifData.m_logicalScreenWidth = BitConverter.ToUInt16(gifBytes, 6);
+
+        // Logical Screen Height(2 Bytes)
+        gifData.m_logicalScreenHeight = BitConverter.ToUInt16(gifBytes, 8);
+
+        // 1 Byte
+        {
+            // Global Color Table Flag(1 Bit)
+            gifData.m_globalColorTableFlag = (gifBytes[10] & 128) == 128; // 0b10000000
+
+            // Color Resolution(3 Bits)
+            switch (gifBytes[10] & 112)
+            {
+                case 112: // 0b01110000
+                    gifData.m_colorResolution = 8;
+                    break;
+                case 96: // 0b01100000
+                    gifData.m_colorResolution = 7;
+                    break;
+                case 80: // 0b01010000
+                    gifData.m_colorResolution = 6;
+                    break;
+                case 64: // 0b01000000
+                    gifData.m_colorResolution = 5;
+                    break;
+                case 48: // 0b00110000
+                    gifData.m_colorResolution = 4;
+                    break;
+                case 32: // 0b00100000
+                    gifData.m_colorResolution = 3;
+                    break;
+                case 16: // 0b00010000
+                    gifData.m_colorResolution = 2;
+                    break;
+                default:
+                    gifData.m_colorResolution = 1;
+                    break;
+            }
+
+            // Sort Flag(1 Bit)
+            gifData.m_sortFlag = (gifBytes[10] & 8) == 8; // 0b00001000
+
+            // Size of Global Color Table(3 Bits)
+            int val = (gifBytes[10] & 7) + 1;
+            gifData.m_sizeOfGlobalColorTable = (int)Math.Pow(2, val);
+        }
+
+        // Background Color Index(1 Byte)
+        gifData.m_bgColorIndex = gifBytes[11];
+
+        // Pixel Aspect Ratio(1 Byte)
+        gifData.m_pixelAspectRatio = gifBytes[12];
+
+        byteIndex = 13;
+        if (gifData.m_globalColorTableFlag)
+        {
+            // Global Color Table(0~255×3 Bytes)
+            gifData.m_globalColorTable = new List<byte[]>();
+            for (int i = byteIndex; i < byteIndex + (gifData.m_sizeOfGlobalColorTable * 3); i += 3)
+            {
+                gifData.m_globalColorTable.Add(new byte[] { gifBytes[i], gifBytes[i + 1], gifBytes[i + 2] });
+            }
+            byteIndex = byteIndex + (gifData.m_sizeOfGlobalColorTable * 3);
+        }
+
+        return true;
+    }
+
+    private static bool SetGifBlock(byte[] gifBytes, ref int byteIndex, ref GifData gifData)
+    {
+        try
+        {
+            int lastIndex = 0;
+            while (true)
+            {
+                int nowIndex = byteIndex;
+
+                if (gifBytes[nowIndex] == 0x2c)
+                {
+                    // Image Block(0x2c)
+                    SetImageBlock(gifBytes, ref byteIndex, ref gifData);
+
+                }
+                else if (gifBytes[nowIndex] == 0x21)
+                {
+                    // Extension
+                    switch (gifBytes[nowIndex + 1])
+                    {
+                        case 0xf9:
+                            // Graphic Control Extension(0x21 0xf9)
+                            SetGraphicControlExtension(gifBytes, ref byteIndex, ref gifData);
+                            break;
+                        case 0xfe:
+                            // Comment Extension(0x21 0xfe)
+                            SetCommentExtension(gifBytes, ref byteIndex, ref gifData);
+                            break;
+                        case 0x01:
+                            // Plain Text Extension(0x21 0x01)
+                            SetPlainTextExtension(gifBytes, ref byteIndex, ref gifData);
+                            break;
+                        case 0xff:
+                            // Application Extension(0x21 0xff)
+                            SetApplicationExtension(gifBytes, ref byteIndex, ref gifData);
+                            break;
+                        default:
+                            break;
+                    }
+                }
+                else if (gifBytes[nowIndex] == 0x3b)
+                {
+                    // Trailer(1 Byte)
+                    gifData.m_trailer = gifBytes[byteIndex];
+                    byteIndex++;
+                    break;
+                }
+
+                if (lastIndex == nowIndex)
+                {
+                    Debug.LogError("Infinite loop error.");
+                    return false;
+                }
+
+                lastIndex = nowIndex;
+            }
+        }
+        catch (Exception ex)
+        {
+            Debug.LogError(ex.Message);
+            return false;
+        }
+
+        return true;
+    }
+
+    private static void SetImageBlock(byte[] gifBytes, ref int byteIndex, ref GifData gifData)
+    {
+        ImageBlock ib = new ImageBlock();
+
+        // Image Separator(1 Byte)
+        // 0x2c
+        ib.m_imageSeparator = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Image Left Position(2 Bytes)
+        ib.m_imageLeftPosition = BitConverter.ToUInt16(gifBytes, byteIndex);
+        byteIndex += 2;
+
+        // Image Top Position(2 Bytes)
+        ib.m_imageTopPosition = BitConverter.ToUInt16(gifBytes, byteIndex);
+        byteIndex += 2;
+
+        // Image Width(2 Bytes)
+        ib.m_imageWidth = BitConverter.ToUInt16(gifBytes, byteIndex);
+        byteIndex += 2;
+
+        // Image Height(2 Bytes)
+        ib.m_imageHeight = BitConverter.ToUInt16(gifBytes, byteIndex);
+        byteIndex += 2;
+
+        // 1 Byte
+        {
+            // Local Color Table Flag(1 Bit)
+            ib.m_localColorTableFlag = (gifBytes[byteIndex] & 128) == 128; // 0b10000000
+
+            // Interlace Flag(1 Bit)
+            ib.m_interlaceFlag = (gifBytes[byteIndex] & 64) == 64; // 0b01000000
+
+            // Sort Flag(1 Bit)
+            ib.m_sortFlag = (gifBytes[byteIndex] & 32) == 32; // 0b00100000
+
+            // Reserved(2 Bits)
+            // Unused
+
+            // Size of Local Color Table(3 Bits)
+            int val = (gifBytes[byteIndex] & 7) + 1;
+            ib.m_sizeOfLocalColorTable = (int)Math.Pow(2, val);
+
+            byteIndex++;
+        }
+
+        if (ib.m_localColorTableFlag)
+        {
+            // Local Color Table(0~255×3 Bytes)
+            ib.m_localColorTable = new List<byte[]>();
+            for (int i = byteIndex; i < byteIndex + (ib.m_sizeOfLocalColorTable * 3); i += 3)
+            {
+                ib.m_localColorTable.Add(new byte[] { gifBytes[i], gifBytes[i + 1], gifBytes[i + 2] });
+            }
+            byteIndex = byteIndex + (ib.m_sizeOfLocalColorTable * 3);
+        }
+
+        // LZW Minimum Code Size(1 Byte)
+        ib.m_lzwMinimumCodeSize = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Block Size & Image Data List
+        while (true)
+        {
+            // Block Size(1 Byte)
+            byte blockSize = gifBytes[byteIndex];
+            byteIndex++;
+
+            if (blockSize == 0x00)
+            {
+                // Block Terminator(1 Byte)
+                break;
+            }
+
+            var imageDataBlock = new ImageBlock.ImageDataBlock();
+            imageDataBlock.m_blockSize = blockSize;
+
+            // Image Data(? Bytes)
+            imageDataBlock.m_imageData = new byte[imageDataBlock.m_blockSize];
+            for (int i = 0; i < imageDataBlock.m_imageData.Length; i++)
+            {
+                imageDataBlock.m_imageData[i] = gifBytes[byteIndex];
+                byteIndex++;
+            }
+
+            if (ib.m_imageDataList == null)
+            {
+                ib.m_imageDataList = new List<ImageBlock.ImageDataBlock>();
+            }
+            ib.m_imageDataList.Add(imageDataBlock);
+        }
+
+        if (gifData.m_imageBlockList == null)
+        {
+            gifData.m_imageBlockList = new List<ImageBlock>();
+        }
+        gifData.m_imageBlockList.Add(ib);
+    }
+
+    private static void SetGraphicControlExtension(byte[] gifBytes, ref int byteIndex, ref GifData gifData)
+    {
+        GraphicControlExtension gcEx = new GraphicControlExtension();
+
+        // Extension Introducer(1 Byte)
+        // 0x21
+        gcEx.m_extensionIntroducer = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Graphic Control Label(1 Byte)
+        // 0xf9
+        gcEx.m_graphicControlLabel = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Block Size(1 Byte)
+        // 0x04
+        gcEx.m_blockSize = gifBytes[byteIndex];
+        byteIndex++;
+
+        // 1 Byte
+        {
+            // Reserved(3 Bits)
+            // Unused
+
+            // Disposal Mothod(3 Bits)
+            // 0 (No disposal specified)
+            // 1 (Do not dispose)
+            // 2 (Restore to background color)
+            // 3 (Restore to previous)
+            switch (gifBytes[byteIndex] & 28)
+            { // 0b00011100
+                case 4:     // 0b00000100
+                    gcEx.m_disposalMethod = 1;
+                    break;
+                case 8:     // 0b00001000
+                    gcEx.m_disposalMethod = 2;
+                    break;
+                case 12:    // 0b00001100
+                    gcEx.m_disposalMethod = 3;
+                    break;
+                default:
+                    gcEx.m_disposalMethod = 0;
+                    break;
+            }
+
+            // User Input Flag(1 Bit)
+            // Unknown
+
+            // Transparent Color Flag(1 Bit)
+            gcEx.m_transparentColorFlag = (gifBytes[byteIndex] & 1) == 1; // 0b00000001
+
+            byteIndex++;
+        }
+
+        // Delay Time(2 Bytes)
+        gcEx.m_delayTime = BitConverter.ToUInt16(gifBytes, byteIndex);
+        byteIndex += 2;
+
+        // Transparent Color Index(1 Byte)
+        gcEx.m_transparentColorIndex = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Block Terminator(1 Byte)
+        gcEx.m_blockTerminator = gifBytes[byteIndex];
+        byteIndex++;
+
+        if (gifData.m_graphicCtrlExList == null)
+        {
+            gifData.m_graphicCtrlExList = new List<GraphicControlExtension>();
+        }
+        gifData.m_graphicCtrlExList.Add(gcEx);
+    }
+
+    private static void SetCommentExtension(byte[] gifBytes, ref int byteIndex, ref GifData gifData)
+    {
+        CommentExtension commentEx = new CommentExtension();
+
+        // Extension Introducer(1 Byte)
+        // 0x21
+        commentEx.m_extensionIntroducer = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Comment Label(1 Byte)
+        // 0xfe
+        commentEx.m_commentLabel = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Block Size & Comment Data List
+        while (true)
+        {
+            // Block Size(1 Byte)
+            byte blockSize = gifBytes[byteIndex];
+            byteIndex++;
+
+            if (blockSize == 0x00)
+            {
+                // Block Terminator(1 Byte)
+                break;
+            }
+
+            var commentDataBlock = new CommentExtension.CommentDataBlock();
+            commentDataBlock.m_blockSize = blockSize;
+
+            // Comment Data(n Byte)
+            commentDataBlock.m_commentData = new byte[commentDataBlock.m_blockSize];
+            for (int i = 0; i < commentDataBlock.m_commentData.Length; i++)
+            {
+                commentDataBlock.m_commentData[i] = gifBytes[byteIndex];
+                byteIndex++;
+            }
+
+            if (commentEx.m_commentDataList == null)
+            {
+                commentEx.m_commentDataList = new List<CommentExtension.CommentDataBlock>();
+            }
+            commentEx.m_commentDataList.Add(commentDataBlock);
+        }
+
+        if (gifData.m_commentExList == null)
+        {
+            gifData.m_commentExList = new List<CommentExtension>();
+        }
+        gifData.m_commentExList.Add(commentEx);
+    }
+
+    private static void SetPlainTextExtension(byte[] gifBytes, ref int byteIndex, ref GifData gifData)
+    {
+        PlainTextExtension plainTxtEx = new PlainTextExtension();
+
+        // Extension Introducer(1 Byte)
+        // 0x21
+        plainTxtEx.m_extensionIntroducer = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Plain Text Label(1 Byte)
+        // 0x01
+        plainTxtEx.m_plainTextLabel = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Block Size(1 Byte)
+        // 0x0c
+        plainTxtEx.m_blockSize = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Text Grid Left Position(2 Bytes)
+        // Not supported
+        byteIndex += 2;
+
+        // Text Grid Top Position(2 Bytes)
+        // Not supported
+        byteIndex += 2;
+
+        // Text Grid Width(2 Bytes)
+        // Not supported
+        byteIndex += 2;
+
+        // Text Grid Height(2 Bytes)
+        // Not supported
+        byteIndex += 2;
+
+        // Character Cell Width(1 Bytes)
+        // Not supported
+        byteIndex++;
+
+        // Character Cell Height(1 Bytes)
+        // Not supported
+        byteIndex++;
+
+        // Text Foreground Color Index(1 Bytes)
+        // Not supported
+        byteIndex++;
+
+        // Text Background Color Index(1 Bytes)
+        // Not supported
+        byteIndex++;
+
+        // Block Size & Plain Text Data List
+        while (true)
+        {
+            // Block Size(1 Byte)
+            byte blockSize = gifBytes[byteIndex];
+            byteIndex++;
+
+            if (blockSize == 0x00)
+            {
+                // Block Terminator(1 Byte)
+                break;
+            }
+
+            var plainTextDataBlock = new PlainTextExtension.PlainTextDataBlock();
+            plainTextDataBlock.m_blockSize = blockSize;
+
+            // Plain Text Data(n Byte)
+            plainTextDataBlock.m_plainTextData = new byte[plainTextDataBlock.m_blockSize];
+            for (int i = 0; i < plainTextDataBlock.m_plainTextData.Length; i++)
+            {
+                plainTextDataBlock.m_plainTextData[i] = gifBytes[byteIndex];
+                byteIndex++;
+            }
+
+            if (plainTxtEx.m_plainTextDataList == null)
+            {
+                plainTxtEx.m_plainTextDataList = new List<PlainTextExtension.PlainTextDataBlock>();
+            }
+            plainTxtEx.m_plainTextDataList.Add(plainTextDataBlock);
+        }
+
+        if (gifData.m_plainTextExList == null)
+        {
+            gifData.m_plainTextExList = new List<PlainTextExtension>();
+        }
+        gifData.m_plainTextExList.Add(plainTxtEx);
+    }
+
+    private static void SetApplicationExtension(byte[] gifBytes, ref int byteIndex, ref GifData gifData)
+    {
+        // Extension Introducer(1 Byte)
+        // 0x21
+        gifData.m_appEx.m_extensionIntroducer = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Extension Label(1 Byte)
+        // 0xff
+        gifData.m_appEx.m_extensionLabel = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Block Size(1 Byte)
+        // 0x0b
+        gifData.m_appEx.m_blockSize = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Application Identifier(8 Bytes)
+        gifData.m_appEx.m_appId1 = gifBytes[byteIndex];
+        byteIndex++;
+        gifData.m_appEx.m_appId2 = gifBytes[byteIndex];
+        byteIndex++;
+        gifData.m_appEx.m_appId3 = gifBytes[byteIndex];
+        byteIndex++;
+        gifData.m_appEx.m_appId4 = gifBytes[byteIndex];
+        byteIndex++;
+        gifData.m_appEx.m_appId5 = gifBytes[byteIndex];
+        byteIndex++;
+        gifData.m_appEx.m_appId6 = gifBytes[byteIndex];
+        byteIndex++;
+        gifData.m_appEx.m_appId7 = gifBytes[byteIndex];
+        byteIndex++;
+        gifData.m_appEx.m_appId8 = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Application Authentication Code(3 Bytes)
+        gifData.m_appEx.m_appAuthCode1 = gifBytes[byteIndex];
+        byteIndex++;
+        gifData.m_appEx.m_appAuthCode2 = gifBytes[byteIndex];
+        byteIndex++;
+        gifData.m_appEx.m_appAuthCode3 = gifBytes[byteIndex];
+        byteIndex++;
+
+        // Block Size & Application Data List
+        while (true)
+        {
+            // Block Size (1 Byte)
+            byte blockSize = gifBytes[byteIndex];
+            byteIndex++;
+
+            if (blockSize == 0x00)
+            {
+                // Block Terminator(1 Byte)
+                break;
+            }
+
+            var appDataBlock = new ApplicationExtension.ApplicationDataBlock();
+            appDataBlock.m_blockSize = blockSize;
+
+            // Application Data(n Byte)
+            appDataBlock.m_applicationData = new byte[appDataBlock.m_blockSize];
+            for (int i = 0; i < appDataBlock.m_applicationData.Length; i++)
+            {
+                appDataBlock.m_applicationData[i] = gifBytes[byteIndex];
+                byteIndex++;
+            }
+
+            if (gifData.m_appEx.m_appDataList == null)
+            {
+                gifData.m_appEx.m_appDataList = new List<ApplicationExtension.ApplicationDataBlock>();
+            }
+            gifData.m_appEx.m_appDataList.Add(appDataBlock);
+        }
+    }
+}

+ 8 - 0
Assets/HotUpdate/UniGif/UniGifFormatter.cs.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b74d64e144c492a40849d69b064810ad
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

+ 141 - 0
Assets/HybridCLRGenerate/AOTGenericReferences.cs

@@ -34,6 +34,14 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
 	// SC.XR.Unity.Singleton.<>c<object>
 	// SC.XR.Unity.Singleton<object>
 	// System.Action<Loom.DelayedQueueItem>
+	// System.Action<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Action<UniGif.CommentExtension.CommentDataBlock>
+	// System.Action<UniGif.CommentExtension>
+	// System.Action<UniGif.GraphicControlExtension>
+	// System.Action<UniGif.ImageBlock.ImageDataBlock>
+	// System.Action<UniGif.ImageBlock>
+	// System.Action<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Action<UniGif.PlainTextExtension>
 	// System.Action<UnityEngine.Vector2>
 	// System.Action<UnityEngine.Vector3>
 	// System.Action<byte>
@@ -41,9 +49,11 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
 	// System.Action<float>
 	// System.Action<int>
 	// System.Action<object,float>
+	// System.Action<object,int,int,int>
 	// System.Action<object,object,byte>
 	// System.Action<object,object>
 	// System.Action<object>
+	// System.Action<ushort>
 	// System.Buffers.ArrayPool<int>
 	// System.Buffers.TlsOverPerCoreLockedStacksArrayPool.LockedStack<int>
 	// System.Buffers.TlsOverPerCoreLockedStacksArrayPool.PerCoreLockedStacks<int>
@@ -51,89 +61,192 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
 	// System.ByReference<int>
 	// System.ByReference<ushort>
 	// System.Collections.Generic.ArraySortHelper<Loom.DelayedQueueItem>
+	// System.Collections.Generic.ArraySortHelper<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.Generic.ArraySortHelper<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.Generic.ArraySortHelper<UniGif.CommentExtension>
+	// System.Collections.Generic.ArraySortHelper<UniGif.GraphicControlExtension>
+	// System.Collections.Generic.ArraySortHelper<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.Generic.ArraySortHelper<UniGif.ImageBlock>
+	// System.Collections.Generic.ArraySortHelper<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.Generic.ArraySortHelper<UniGif.PlainTextExtension>
 	// System.Collections.Generic.ArraySortHelper<UnityEngine.Vector2>
 	// System.Collections.Generic.ArraySortHelper<UnityEngine.Vector3>
 	// System.Collections.Generic.ArraySortHelper<byte>
 	// System.Collections.Generic.ArraySortHelper<int>
 	// System.Collections.Generic.ArraySortHelper<object>
+	// System.Collections.Generic.ArraySortHelper<ushort>
 	// System.Collections.Generic.Comparer<Loom.DelayedQueueItem>
 	// System.Collections.Generic.Comparer<System.Collections.Generic.KeyValuePair<object,ushort>>
+	// System.Collections.Generic.Comparer<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.Generic.Comparer<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.Generic.Comparer<UniGif.CommentExtension>
+	// System.Collections.Generic.Comparer<UniGif.GraphicControlExtension>
+	// System.Collections.Generic.Comparer<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.Generic.Comparer<UniGif.ImageBlock>
+	// System.Collections.Generic.Comparer<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.Generic.Comparer<UniGif.PlainTextExtension>
 	// System.Collections.Generic.Comparer<UnityEngine.Vector2>
 	// System.Collections.Generic.Comparer<UnityEngine.Vector3>
 	// System.Collections.Generic.Comparer<byte>
 	// System.Collections.Generic.Comparer<int>
 	// System.Collections.Generic.Comparer<object>
+	// System.Collections.Generic.Comparer<ushort>
+	// System.Collections.Generic.Dictionary.Enumerator<int,object>
 	// System.Collections.Generic.Dictionary.Enumerator<object,object>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,object>
 	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<object,object>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,object>
 	// System.Collections.Generic.Dictionary.KeyCollection<object,object>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,object>
 	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<object,object>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,object>
 	// System.Collections.Generic.Dictionary.ValueCollection<object,object>
+	// System.Collections.Generic.Dictionary<int,object>
 	// System.Collections.Generic.Dictionary<object,object>
+	// System.Collections.Generic.EqualityComparer<int>
 	// System.Collections.Generic.EqualityComparer<object>
 	// System.Collections.Generic.EqualityComparer<ushort>
 	// System.Collections.Generic.ICollection<Loom.DelayedQueueItem>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,object>>
 	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.ICollection<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.Generic.ICollection<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.Generic.ICollection<UniGif.CommentExtension>
+	// System.Collections.Generic.ICollection<UniGif.GraphicControlExtension>
+	// System.Collections.Generic.ICollection<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.Generic.ICollection<UniGif.ImageBlock>
+	// System.Collections.Generic.ICollection<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.Generic.ICollection<UniGif.PlainTextExtension>
 	// System.Collections.Generic.ICollection<UnityEngine.Vector2>
 	// System.Collections.Generic.ICollection<UnityEngine.Vector3>
 	// System.Collections.Generic.ICollection<byte>
 	// System.Collections.Generic.ICollection<int>
 	// System.Collections.Generic.ICollection<object>
+	// System.Collections.Generic.ICollection<ushort>
 	// System.Collections.Generic.IComparer<Loom.DelayedQueueItem>
 	// System.Collections.Generic.IComparer<System.Collections.Generic.KeyValuePair<object,ushort>>
+	// System.Collections.Generic.IComparer<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.Generic.IComparer<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.Generic.IComparer<UniGif.CommentExtension>
+	// System.Collections.Generic.IComparer<UniGif.GraphicControlExtension>
+	// System.Collections.Generic.IComparer<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.Generic.IComparer<UniGif.ImageBlock>
+	// System.Collections.Generic.IComparer<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.Generic.IComparer<UniGif.PlainTextExtension>
 	// System.Collections.Generic.IComparer<UnityEngine.Vector2>
 	// System.Collections.Generic.IComparer<UnityEngine.Vector3>
 	// System.Collections.Generic.IComparer<byte>
 	// System.Collections.Generic.IComparer<int>
 	// System.Collections.Generic.IComparer<object>
+	// System.Collections.Generic.IComparer<ushort>
 	// System.Collections.Generic.IDictionary<object,object>
 	// System.Collections.Generic.IDictionary<object,ushort>
 	// System.Collections.Generic.IEnumerable<Loom.DelayedQueueItem>
 	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<System.UIntPtr,object>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,object>>
 	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,object>>
 	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,ushort>>
+	// System.Collections.Generic.IEnumerable<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.Generic.IEnumerable<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.Generic.IEnumerable<UniGif.CommentExtension>
+	// System.Collections.Generic.IEnumerable<UniGif.GraphicControlExtension>
+	// System.Collections.Generic.IEnumerable<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.Generic.IEnumerable<UniGif.ImageBlock>
+	// System.Collections.Generic.IEnumerable<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.Generic.IEnumerable<UniGif.PlainTextExtension>
 	// System.Collections.Generic.IEnumerable<UnityEngine.Vector2>
 	// System.Collections.Generic.IEnumerable<UnityEngine.Vector3>
 	// System.Collections.Generic.IEnumerable<byte>
 	// System.Collections.Generic.IEnumerable<int>
 	// System.Collections.Generic.IEnumerable<object>
+	// System.Collections.Generic.IEnumerable<ushort>
 	// System.Collections.Generic.IEnumerator<Loom.DelayedQueueItem>
 	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<System.UIntPtr,object>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,object>>
 	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<object,object>>
 	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<object,ushort>>
+	// System.Collections.Generic.IEnumerator<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.Generic.IEnumerator<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.Generic.IEnumerator<UniGif.CommentExtension>
+	// System.Collections.Generic.IEnumerator<UniGif.GraphicControlExtension>
+	// System.Collections.Generic.IEnumerator<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.Generic.IEnumerator<UniGif.ImageBlock>
+	// System.Collections.Generic.IEnumerator<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.Generic.IEnumerator<UniGif.PlainTextExtension>
 	// System.Collections.Generic.IEnumerator<UnityEngine.Vector2>
 	// System.Collections.Generic.IEnumerator<UnityEngine.Vector3>
 	// System.Collections.Generic.IEnumerator<byte>
 	// System.Collections.Generic.IEnumerator<int>
 	// System.Collections.Generic.IEnumerator<object>
+	// System.Collections.Generic.IEnumerator<ushort>
+	// System.Collections.Generic.IEqualityComparer<int>
 	// System.Collections.Generic.IEqualityComparer<object>
 	// System.Collections.Generic.IList<Loom.DelayedQueueItem>
+	// System.Collections.Generic.IList<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.Generic.IList<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.Generic.IList<UniGif.CommentExtension>
+	// System.Collections.Generic.IList<UniGif.GraphicControlExtension>
+	// System.Collections.Generic.IList<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.Generic.IList<UniGif.ImageBlock>
+	// System.Collections.Generic.IList<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.Generic.IList<UniGif.PlainTextExtension>
 	// System.Collections.Generic.IList<UnityEngine.Vector2>
 	// System.Collections.Generic.IList<UnityEngine.Vector3>
 	// System.Collections.Generic.IList<byte>
 	// System.Collections.Generic.IList<int>
 	// System.Collections.Generic.IList<object>
+	// System.Collections.Generic.IList<ushort>
 	// System.Collections.Generic.KeyValuePair<System.UIntPtr,object>
+	// System.Collections.Generic.KeyValuePair<int,object>
 	// System.Collections.Generic.KeyValuePair<object,object>
 	// System.Collections.Generic.KeyValuePair<object,ushort>
 	// System.Collections.Generic.List.Enumerator<Loom.DelayedQueueItem>
+	// System.Collections.Generic.List.Enumerator<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.Generic.List.Enumerator<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.Generic.List.Enumerator<UniGif.CommentExtension>
+	// System.Collections.Generic.List.Enumerator<UniGif.GraphicControlExtension>
+	// System.Collections.Generic.List.Enumerator<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.Generic.List.Enumerator<UniGif.ImageBlock>
+	// System.Collections.Generic.List.Enumerator<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.Generic.List.Enumerator<UniGif.PlainTextExtension>
 	// System.Collections.Generic.List.Enumerator<UnityEngine.Vector2>
 	// System.Collections.Generic.List.Enumerator<UnityEngine.Vector3>
 	// System.Collections.Generic.List.Enumerator<byte>
 	// System.Collections.Generic.List.Enumerator<int>
 	// System.Collections.Generic.List.Enumerator<object>
+	// System.Collections.Generic.List.Enumerator<ushort>
 	// System.Collections.Generic.List<Loom.DelayedQueueItem>
+	// System.Collections.Generic.List<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.Generic.List<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.Generic.List<UniGif.CommentExtension>
+	// System.Collections.Generic.List<UniGif.GraphicControlExtension>
+	// System.Collections.Generic.List<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.Generic.List<UniGif.ImageBlock>
+	// System.Collections.Generic.List<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.Generic.List<UniGif.PlainTextExtension>
 	// System.Collections.Generic.List<UnityEngine.Vector2>
 	// System.Collections.Generic.List<UnityEngine.Vector3>
 	// System.Collections.Generic.List<byte>
 	// System.Collections.Generic.List<int>
 	// System.Collections.Generic.List<object>
+	// System.Collections.Generic.List<ushort>
 	// System.Collections.Generic.ObjectComparer<Loom.DelayedQueueItem>
 	// System.Collections.Generic.ObjectComparer<System.Collections.Generic.KeyValuePair<object,ushort>>
+	// System.Collections.Generic.ObjectComparer<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.Generic.ObjectComparer<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.Generic.ObjectComparer<UniGif.CommentExtension>
+	// System.Collections.Generic.ObjectComparer<UniGif.GraphicControlExtension>
+	// System.Collections.Generic.ObjectComparer<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.Generic.ObjectComparer<UniGif.ImageBlock>
+	// System.Collections.Generic.ObjectComparer<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.Generic.ObjectComparer<UniGif.PlainTextExtension>
 	// System.Collections.Generic.ObjectComparer<UnityEngine.Vector2>
 	// System.Collections.Generic.ObjectComparer<UnityEngine.Vector3>
 	// System.Collections.Generic.ObjectComparer<byte>
 	// System.Collections.Generic.ObjectComparer<int>
 	// System.Collections.Generic.ObjectComparer<object>
+	// System.Collections.Generic.ObjectComparer<ushort>
+	// System.Collections.Generic.ObjectEqualityComparer<int>
 	// System.Collections.Generic.ObjectEqualityComparer<object>
 	// System.Collections.Generic.ObjectEqualityComparer<ushort>
 	// System.Collections.Generic.Queue.Enumerator<object>
@@ -164,17 +277,35 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
 	// System.Collections.Generic.TreeWalkPredicate<System.Collections.Generic.KeyValuePair<object,ushort>>
 	// System.Collections.Generic.ValueListBuilder<int>
 	// System.Collections.ObjectModel.ReadOnlyCollection<Loom.DelayedQueueItem>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UniGif.CommentExtension.CommentDataBlock>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UniGif.CommentExtension>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UniGif.GraphicControlExtension>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UniGif.ImageBlock.ImageDataBlock>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UniGif.ImageBlock>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UniGif.PlainTextExtension>
 	// System.Collections.ObjectModel.ReadOnlyCollection<UnityEngine.Vector2>
 	// System.Collections.ObjectModel.ReadOnlyCollection<UnityEngine.Vector3>
 	// System.Collections.ObjectModel.ReadOnlyCollection<byte>
 	// System.Collections.ObjectModel.ReadOnlyCollection<int>
 	// System.Collections.ObjectModel.ReadOnlyCollection<object>
+	// System.Collections.ObjectModel.ReadOnlyCollection<ushort>
 	// System.Comparison<Loom.DelayedQueueItem>
+	// System.Comparison<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Comparison<UniGif.CommentExtension.CommentDataBlock>
+	// System.Comparison<UniGif.CommentExtension>
+	// System.Comparison<UniGif.GraphicControlExtension>
+	// System.Comparison<UniGif.ImageBlock.ImageDataBlock>
+	// System.Comparison<UniGif.ImageBlock>
+	// System.Comparison<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Comparison<UniGif.PlainTextExtension>
 	// System.Comparison<UnityEngine.Vector2>
 	// System.Comparison<UnityEngine.Vector3>
 	// System.Comparison<byte>
 	// System.Comparison<int>
 	// System.Comparison<object>
+	// System.Comparison<ushort>
 	// System.Converter<object,object>
 	// System.Func<Loom.DelayedQueueItem,byte>
 	// System.Func<System.Threading.Tasks.VoidTaskResult>
@@ -189,12 +320,22 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
 	// System.Linq.Enumerable.WhereArrayIterator<Loom.DelayedQueueItem>
 	// System.Linq.Enumerable.WhereEnumerableIterator<Loom.DelayedQueueItem>
 	// System.Linq.Enumerable.WhereListIterator<Loom.DelayedQueueItem>
+	// System.Nullable<UniGif.GraphicControlExtension>
 	// System.Predicate<Loom.DelayedQueueItem>
+	// System.Predicate<UniGif.ApplicationExtension.ApplicationDataBlock>
+	// System.Predicate<UniGif.CommentExtension.CommentDataBlock>
+	// System.Predicate<UniGif.CommentExtension>
+	// System.Predicate<UniGif.GraphicControlExtension>
+	// System.Predicate<UniGif.ImageBlock.ImageDataBlock>
+	// System.Predicate<UniGif.ImageBlock>
+	// System.Predicate<UniGif.PlainTextExtension.PlainTextDataBlock>
+	// System.Predicate<UniGif.PlainTextExtension>
 	// System.Predicate<UnityEngine.Vector2>
 	// System.Predicate<UnityEngine.Vector3>
 	// System.Predicate<byte>
 	// System.Predicate<int>
 	// System.Predicate<object>
+	// System.Predicate<ushort>
 	// System.ReadOnlySpan<int>
 	// System.ReadOnlySpan<ushort>
 	// System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Threading.Tasks.VoidTaskResult>

+ 8 - 0
Assets/HybridCLRGenerate/link.xml

@@ -172,15 +172,18 @@
     <type fullname="UnityEngine.Renderer" preserve="all" />
     <type fullname="UnityEngine.Rendering.AsyncGPUReadback" preserve="all" />
     <type fullname="UnityEngine.Rendering.AsyncGPUReadbackRequest" preserve="all" />
+    <type fullname="UnityEngine.RequireComponent" preserve="all" />
     <type fullname="UnityEngine.ScriptableObject" preserve="all" />
     <type fullname="UnityEngine.SerializeField" preserve="all" />
     <type fullname="UnityEngine.Shader" preserve="all" />
     <type fullname="UnityEngine.SkinnedMeshRenderer" preserve="all" />
+    <type fullname="UnityEngine.Space" preserve="all" />
     <type fullname="UnityEngine.Sprite" preserve="all" />
     <type fullname="UnityEngine.Sprites.DataUtility" preserve="all" />
     <type fullname="UnityEngine.Texture" preserve="all" />
     <type fullname="UnityEngine.Texture2D" preserve="all" />
     <type fullname="UnityEngine.TextureFormat" preserve="all" />
+    <type fullname="UnityEngine.TextureWrapMode" preserve="all" />
     <type fullname="UnityEngine.Time" preserve="all" />
     <type fullname="UnityEngine.Transform" preserve="all" />
     <type fullname="UnityEngine.Vector2" preserve="all" />
@@ -251,6 +254,7 @@
     <type fullname="System.Action`1" preserve="all" />
     <type fullname="System.Action`2" preserve="all" />
     <type fullname="System.Action`3" preserve="all" />
+    <type fullname="System.Action`4" preserve="all" />
     <type fullname="System.AppDomain" preserve="all" />
     <type fullname="System.ArgumentNullException" preserve="all" />
     <type fullname="System.ArgumentOutOfRangeException" preserve="all" />
@@ -259,9 +263,11 @@
     <type fullname="System.Attribute" preserve="all" />
     <type fullname="System.AttributeTargets" preserve="all" />
     <type fullname="System.AttributeUsageAttribute" preserve="all" />
+    <type fullname="System.BitConverter" preserve="all" />
     <type fullname="System.Boolean" preserve="all" />
     <type fullname="System.Byte" preserve="all" />
     <type fullname="System.Char" preserve="all" />
+    <type fullname="System.Collections.BitArray" preserve="all" />
     <type fullname="System.Collections.Generic.Dictionary`2" preserve="all" />
     <type fullname="System.Collections.Generic.Dictionary`2/Enumerator" preserve="all" />
     <type fullname="System.Collections.Generic.ICollection`1" preserve="all" />
@@ -317,6 +323,7 @@
     <type fullname="System.MulticastDelegate" preserve="all" />
     <type fullname="System.NotSupportedException" preserve="all" />
     <type fullname="System.NullReferenceException" preserve="all" />
+    <type fullname="System.Nullable`1" preserve="all" />
     <type fullname="System.Object" preserve="all" />
     <type fullname="System.ParamArrayAttribute" preserve="all" />
     <type fullname="System.Predicate`1" preserve="all" />
@@ -363,6 +370,7 @@
     <type fullname="System.TimeSpan" preserve="all" />
     <type fullname="System.TimeZone" preserve="all" />
     <type fullname="System.Type" preserve="all" />
+    <type fullname="System.UInt16" preserve="all" />
     <type fullname="System.Uri" preserve="all" />
     <type fullname="System.ValueType" preserve="all" />
     <type fullname="System.Xml.XmlAttribute" preserve="all" />

+ 1 - 7
Assets/Main/LoadDll.cs

@@ -60,13 +60,7 @@ public class LoadDll : MonoBehaviour
         "System.Core.dll.bytes",
         "UniTask.dll.bytes",
         "Minio.dll.bytes",
-        "System.Runtime.CompilerServices.Unsafe.dll.bytes",
-        "netstandard.dll.bytes",
-        "COSXML.dll.bytes",
-        "UniTask.Addressables.dll.bytes",
-        "UniTask.DOTween.dll.bytes",
-        "UniTask.Linq.dll.bytes",
-        "UniTask.TextMeshPro.dll.bytes",
+        "System.Runtime.CompilerServices.Unsafe.dll.bytes"
     };
 
     public Text text;

+ 8 - 0
Assets/NRSDK.meta

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

+ 15 - 0
Assets/NRSDK/NRProjectConfig.asset

@@ -0,0 +1,15 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 7a1762186822e43a7a4a471f83f53761, type: 3}
+  m_Name: NRProjectConfig
+  m_EditorClassIdentifier: 
+  targetDeviceTypes: 0100000002000000

+ 8 - 0
Assets/NRSDK/NRProjectConfig.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6a7cc883306194b628ad654a768ac5d8
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 2 - 2
Assets/Scenes/Edustry.unity

@@ -614,7 +614,7 @@ Transform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 0}
-  m_RootOrder: 0
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!114 &676269401
 MonoBehaviour:
@@ -878,7 +878,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 6007065485426162334, guid: 7cd0ceba7525bdc42a36be841a8aad16, type: 3}
       propertyPath: m_RootOrder
-      value: 1
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 6007065485426162334, guid: 7cd0ceba7525bdc42a36be841a8aad16, type: 3}
       propertyPath: m_LocalPosition.x

BIN
Assets/StreamingAssets/mscorlib.dll.bytes


BIN
Assets/StreamingAssets/netstandard.dll.bytes


BIN
Assets/StreamingAssets/pkq.gif


+ 1 - 1
Assets/StreamingAssets/netstandard.dll.bytes.meta → Assets/StreamingAssets/pkq.gif.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: d8c89c128d0e26c44a95a387f8ec10fa
+guid: c762f96a8d826c1429ee89daf9dd840c
 DefaultImporter:
   externalObjects: {}
   userData: 

+ 2 - 2
Packages/manifest.json

@@ -3,7 +3,7 @@
     "com.code-philosophy.hybridclr": "https://gogs.ghz-tech.com:8843/GHzGlass/HYBRIDCLR.git",
     "com.cysharp.unitask": "https://gogs.ghz-tech.com:8843/GHzGlass/UniTaskXR.git",
     "com.easyar.sense": "file:com.easyar.sense-4.6.0+3015.3acb5241.tgz",
-    "com.ghz.avideoplayer": "https://gogs.ghz-tech.com:8843/GHzGlass/VideoPlayerXR.git#EasyMovieTexture",
+    "com.ghz.avideoplayer": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/VideoPlayerXR.git#EasyMovieTexture",
     "com.ghz.login": "https://gogs.ghz-tech.com:8843/GHzGlass/LoginXR.git",
     "com.ghz.mqtt": "https://gogs.ghz-tech.com:8843/GHzGlass/GHZMQTTXR.git",
     "com.maxst.unilivekit": "https://gogs.ghz-tech.com:8843/GHzGlass/LiveKitXR.git",
@@ -20,7 +20,7 @@
     "com.unity.xr.arfoundation": "4.2.9",
     "com.ximmerse.xr": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/GHZSDKXR.git#XRSDK_Rhinox",
     "jh.immersalsdk.engine": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/ImmersalSDK.git#ImmersalSDK_RhionX",
-    "jh.opencvforunity.engine": "https://gogs.ghz-tech.com:8843/GHzGlass/OpenCVForUnity.git",
+    "jh.opencvforunity.engine": "file:/Users/hujiajun/ghz/OpenCVForUnity",
     "jh.trilib.engine": "https://gogs.ghz-tech.com:8843/GHzGlass/TriLibXR.git",
     "com.unity.modules.ai": "1.0.0",
     "com.unity.modules.androidjni": "1.0.0",

+ 6 - 7
Packages/packages-lock.json

@@ -23,11 +23,11 @@
       }
     },
     "com.ghz.avideoplayer": {
-      "version": "https://gogs.ghz-tech.com:8843/GHzGlass/VideoPlayerXR.git#EasyMovieTexture",
+      "version": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/VideoPlayerXR.git#EasyMovieTexture",
       "depth": 0,
       "source": "git",
       "dependencies": {},
-      "hash": "5398cdd7479e08c30ed7505f278da92d467b1fba"
+      "hash": "8c66871ecdeb30039954e4cb8fd2b3a398929cfe"
     },
     "com.ghz.login": {
       "version": "https://gogs.ghz-tech.com:8843/GHzGlass/LoginXR.git",
@@ -267,7 +267,7 @@
         "com.unity.inputsystem": "1.3.0",
         "com.unity.xr.openxr": "1.5.3"
       },
-      "hash": "d4bb781ff0f7322a32678928ad1627f954d51584"
+      "hash": "6b1955bc528687a98f4eeb079f35dbe68effe1b2"
     },
     "jh.immersalsdk.engine": {
       "version": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/ImmersalSDK.git#ImmersalSDK_RhionX",
@@ -281,15 +281,14 @@
       "hash": "954c4915f652d31ee8ee9bc90ab92ff997c43cf7"
     },
     "jh.opencvforunity.engine": {
-      "version": "https://gogs.ghz-tech.com:8843/GHzGlass/OpenCVForUnity.git",
+      "version": "file:/Users/hujiajun/ghz/OpenCVForUnity",
       "depth": 0,
-      "source": "git",
+      "source": "local",
       "dependencies": {
         "com.unity.xr.management": "4.0.1",
         "com.unity.xr.legacyinputhelpers": "2.1.2",
         "com.unity.inputsystem": "1.4.2"
-      },
-      "hash": "4b6e86cb0045aef590181084754ef60d112498ac"
+      }
     },
     "jh.trilib.engine": {
       "version": "https://gogs.ghz-tech.com:8843/GHzGlass/TriLibXR.git",