Browse Source

Merge branch 'master' of https://gitee.com/slambb/smart-bow-infrared

slambb 10 months ago
parent
commit
13577e593d
60 changed files with 9014 additions and 3022 deletions
  1. 1 0
      Assets/BowArrow/InfraredCamera/InfraredDemo.cs
  2. 1 0
      Assets/BowArrow/Modules/InfraredGuider/InfraredLightGuider.cs
  3. 1 0
      Assets/BowArrow/Modules/InfraredGuider/InfraredLightGuider2.cs
  4. 3 8
      Assets/InfraredProject/InfraredCamera/Scripts/InfraredCameraHelper.cs
  5. 2 2
      Assets/InfraredProject/InfraredCamera/Scripts/ScreenLocate.cs
  6. 3 3
      Assets/InfraredProject/WebCamera/InfraredSpotSettings.asset
  7. 1 1
      Assets/InfraredProject/WebCamera/InfraredSpotSettings.asset.meta
  8. 1 1
      Assets/InfraredProject/WebCamera/Sample.meta
  9. 15 0
      Assets/InfraredProject/WebCamera/Sample/InfraredSpotSettings.asset
  10. 8 0
      Assets/InfraredProject/WebCamera/Sample/InfraredSpotSettings.asset.meta
  11. 7607 0
      Assets/InfraredProject/WebCamera/Sample/SampleWebCamera.unity
  12. 7 0
      Assets/InfraredProject/WebCamera/Sample/SampleWebCamera.unity.meta
  13. 2 1
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/Dbscan/DbscanPoint.cs
  14. 0 844
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredLocate.cs
  15. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredLocate.cs.meta
  16. 0 163
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/InfraredSpot.cs
  17. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/InfraredSpot.cs.meta
  18. 0 31
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/InfraredSpotSettings.cs
  19. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/InfraredSpotSettings.cs.meta
  20. 4 4
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/Old/KMeans.cs
  21. 2 1
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/Old/PixelArea.cs
  22. 2 1
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/Old/PixelSpotAreaOld.cs
  23. 0 238
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/PixelSpotArea.cs
  24. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/PixelSpotArea.cs.meta
  25. 0 136
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/PixelSpotArea_DbScan.cs
  26. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/PixelSpotArea_DbScan.cs.meta
  27. 0 5
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/LineIdentify/LineIdentified.cs
  28. 0 275
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/PerspectiveTransform.cs
  29. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/PerspectiveTransform.cs.meta
  30. 33 36
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/ScreenIdentification.cs
  31. 0 124
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/ScreenMap.cs
  32. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/ScreenMap.cs.meta
  33. 0 74
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/SimpleLocationEstimation.cs
  34. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/SimpleLocationEstimation.cs.meta
  35. 0 152
      Assets/InfraredProject/WebCamera/Script/ZIM/Other/OrdinalQuadrilateral.cs
  36. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/Other/OrdinalQuadrilateral.cs.meta
  37. 0 156
      Assets/InfraredProject/WebCamera/Script/ZIM/Other/QuadrilateralInCamera.cs
  38. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/Other/QuadrilateralInCamera.cs.meta
  39. 0 249
      Assets/InfraredProject/WebCamera/Script/ZIM/Other/UKFSharp/UnscentedKalmanFilter.cs
  40. 0 11
      Assets/InfraredProject/WebCamera/Script/ZIM/Other/UKFSharp/UnscentedKalmanFilter.cs.meta
  41. 155 88
      Assets/InfraredProject/WebCamera/Script/ZIM/ScreenLocate.cs
  42. 3 189
      Assets/InfraredProject/WebCamera/Script/ZIM/ZIMUnity/Extension.cs
  43. 1 18
      Assets/InfraredProject/WebCamera/Script/ZIM/ZIMUnity/ZIMMath.cs
  44. 10 10
      Assets/InfraredProject/WebCamera/Script/ZIM/o0Extension/o0Extension.cs
  45. 355 30
      Assets/InfraredProject/WebCamera/zimWebCamera.unity
  46. 1 2
      Assets/InfraredProject/o0/o0IdentifyLineLSD.cs
  47. 1 0
      Assets/InfraredProject/o0/zimIdentifyLineLSD.cs
  48. 8 0
      Assets/Plugins/o0InfraredLocate.meta
  49. 675 0
      Assets/Plugins/o0InfraredLocate/o0InfraredLocate.deps.json
  50. 7 0
      Assets/Plugins/o0InfraredLocate/o0InfraredLocate.deps.json.meta
  51. BIN
      Assets/Plugins/o0InfraredLocate/o0InfraredLocate.dll
  52. 33 0
      Assets/Plugins/o0InfraredLocate/o0InfraredLocate.dll.meta
  53. BIN
      Assets/Plugins/o0InfraredLocate/o0InfraredLocate.pdb
  54. 7 0
      Assets/Plugins/o0InfraredLocate/o0InfraredLocate.pdb.meta
  55. BIN
      Assets/Plugins/o0InfraredLocate/准心识别接口_v1.0_20241224.docx
  56. 7 0
      Assets/Plugins/o0InfraredLocate/准心识别接口_v1.0_20241224.docx.meta
  57. 2 1
      Assets/SmartBow/Resources/SmartBow/Prefabs/ZIM/BtnRecordInfrared.cs
  58. 4 9
      Assets/SmartBow/Resources/SmartBow/Prefabs/ZIM/PixelCheaker.cs
  59. 3 1
      Assets/SmartBow/Scripts/Views/InfraredViewParts/InfraredScreenPositioningView.cs
  60. 49 48
      Assets/SmartBow/Scripts/Views/InfraredViewParts/PointMarker.cs

+ 1 - 0
Assets/BowArrow/InfraredCamera/InfraredDemo.cs

@@ -9,6 +9,7 @@ using SLAMUVC;
 using System;
 using SmartBowSDK;
 using ZIM.Unity;
+using o0InfraredLocate.ZIM;
 
 public class InfraredDemo : JCUnityLib.ViewBase
 {

+ 1 - 0
Assets/BowArrow/Modules/InfraredGuider/InfraredLightGuider.cs

@@ -1,4 +1,5 @@
 using InfraredManager;
+using o0InfraredLocate.ZIM;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

+ 1 - 0
Assets/BowArrow/Modules/InfraredGuider/InfraredLightGuider2.cs

@@ -1,4 +1,5 @@
 using InfraredManager;
+using o0InfraredLocate.ZIM;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

+ 3 - 8
Assets/InfraredProject/InfraredCamera/Scripts/InfraredCameraHelper.cs

@@ -5,6 +5,7 @@ using System;
 using SLAMUVC;
 using UnityEngine.UI;
 using SmartBowSDK;
+using o0InfraredLocate.ZIM;
 
 namespace InfraredManager
 {
@@ -172,17 +173,11 @@ namespace InfraredManager
         /// <summary>
         /// 单点模式开关
         /// </summary>
-        public void SetSinglePoint(bool value)
-        {
-            _screenLocate.bSinglePoint = value;
-        }
+        public void SetSinglePoint(bool value) => _screenLocate.SetSinglePoint(value);
         /// <summary>
         /// 是否为单点模式
         /// </summary>
-        public bool IsSinglePoint()
-        {
-            return _screenLocate.bSinglePoint;
-        }
+        public bool IsSinglePoint() => _screenLocate.IsSinglePoint();
         /// <summary>
         /// 设置抖动过滤值
         /// </summary>

+ 2 - 2
Assets/InfraredProject/InfraredCamera/Scripts/ScreenLocate.cs

@@ -1,12 +1,12 @@
 using System.Collections.Generic;
 using UnityEngine;
-using ZIM;
 using ZIM.Unity;
+using o0InfraredLocate.ZIM;
 
 /// <summary>
 /// JC-补充接口
 /// </summary>
-public partial class ScreenLocate : MonoBehaviour
+public partial class ScreenLocate
 {
     public bool IsScreenLoateOK()
     {

+ 3 - 3
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/InfraredSpotSettings.asset → Assets/InfraredProject/WebCamera/InfraredSpotSettings.asset

@@ -9,7 +9,7 @@ MonoBehaviour:
   m_GameObject: {fileID: 0}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: a02457a34811484449c5aea53ab9df1b, type: 3}
+  m_Script: {fileID: -1634828626, guid: 9a174c712b8a1484c87eb33b30fe7b0c, type: 3}
   m_Name: InfraredSpotSettings
-  m_EditorClassIdentifier: Assembly-CSharp::InfraredSpotThreshold
-  RadiusThreshold: 60
+  m_EditorClassIdentifier: 
+  RadiusThreshold: 100

+ 1 - 1
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/InfraredSpotSettings.asset.meta → Assets/InfraredProject/WebCamera/InfraredSpotSettings.asset.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: ca2f3b215f8d9d64caed905436a89b86
+guid: 073a943fe7e589f40911c26a0638f264
 NativeFormatImporter:
   externalObjects: {}
   mainObjectFileID: 11400000

+ 1 - 1
Assets/InfraredProject/WebCamera/Script/ZIM/Other/UKFSharp.meta → Assets/InfraredProject/WebCamera/Sample.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 5c68fef15d79c9345bf9b6144c5a1465
+guid: 941bccc75c426a449a034c505f9da37b
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 15 - 0
Assets/InfraredProject/WebCamera/Sample/InfraredSpotSettings.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: -1634828626, guid: 9a174c712b8a1484c87eb33b30fe7b0c, type: 3}
+  m_Name: InfraredSpotSettings
+  m_EditorClassIdentifier: 
+  RadiusThreshold: 100

+ 8 - 0
Assets/InfraredProject/WebCamera/Sample/InfraredSpotSettings.asset.meta

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

+ 7607 - 0
Assets/InfraredProject/WebCamera/Sample/SampleWebCamera.unity

@@ -0,0 +1,7607 @@
+%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.212, g: 0.227, b: 0.259, a: 1}
+  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 0
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 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_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+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: 2
+    m_BakeResolution: 40
+    m_AtlasSize: 1024
+    m_AO: 0
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 1
+    m_CompAOExponentDirect: 0
+    m_ExtractAmbientOcclusion: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 1
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 256
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 2
+    m_BakeBackend: 1
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 512
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 256
+    m_PVREnvironmentReferencePointCount: 2048
+    m_PVRFilteringMode: 1
+    m_PVRDenoiserTypeDirect: 1
+    m_PVRDenoiserTypeIndirect: 1
+    m_PVRDenoiserTypeAO: 1
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVREnvironmentMIS: 1
+    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: 0}
+--- !u!196 &4
+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.16666667
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+    maxJobWorkers: 0
+    preserveTilesOutsideBounds: 0
+    debug:
+      m_Flags: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &5125264
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5125265}
+  - component: {fileID: 5125268}
+  - component: {fileID: 5125267}
+  - component: {fileID: 5125266}
+  m_Layer: 5
+  m_Name: Viewport
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5125265
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5125264}
+  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: 2011614147}
+  m_Father: {fileID: 1141370595}
+  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: -18, y: 0}
+  m_Pivot: {x: 0, y: 1}
+--- !u!114 &5125266
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5125264}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_ShowMaskGraphic: 0
+--- !u!114 &5125267
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5125264}
+  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: 10917, 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 &5125268
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5125264}
+  m_CullTransparentMesh: 1
+--- !u!1 &54605587
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 54605588}
+  - component: {fileID: 54605590}
+  - component: {fileID: 54605589}
+  m_Layer: 5
+  m_Name: Checkmark
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &54605588
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 54605587}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1731784227}
+  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: 40, y: 40}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &54605589
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 54605587}
+  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: 10901, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &54605590
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 54605587}
+  m_CullTransparentMesh: 1
+--- !u!1 &85546309
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 85546310}
+  - component: {fileID: 85546311}
+  m_Layer: 5
+  m_Name: Item
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &85546310
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 85546309}
+  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: 1639229245}
+  - {fileID: 170896897}
+  - {fileID: 1473555256}
+  m_Father: {fileID: 2011614147}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0.5}
+  m_AnchorMax: {x: 1, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &85546311
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 85546309}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 1639229246}
+  toggleTransition: 1
+  graphic: {fileID: 170896898}
+  m_Group: {fileID: 0}
+  onValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_IsOn: 1
+--- !u!1 &102676394
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 102676395}
+  - component: {fileID: 102676397}
+  - component: {fileID: 102676396}
+  m_Layer: 5
+  m_Name: Image
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &102676395
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 102676394}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 394028722}
+  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: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &102676396
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 102676394}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 0, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &102676397
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 102676394}
+  m_CullTransparentMesh: 1
+--- !u!1 &142442725
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 142442726}
+  - component: {fileID: 142442728}
+  - component: {fileID: 142442727}
+  m_Layer: 5
+  m_Name: Info2
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &142442726
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 142442725}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 14
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 131, y: -1225}
+  m_SizeDelta: {x: 160, y: 30}
+  m_Pivot: {x: 0, y: 1}
+--- !u!114 &142442727
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 142442725}
+  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: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 41
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 3
+    m_MaxSize: 50
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 1
+    m_VerticalOverflow: 1
+    m_LineSpacing: 1
+  m_Text: "\u7EFF\u8272\u4EE3\u8868\u624B\u52A8\u8BC6\u522B\u7684\u7EBF\u3001\u7EA2\u8272\u4EE3\u8868\u534A\u81EA\u52A8\u8BC6\u522B\u7684\u7EBF\u3001\u767D\u8272\u4EE3\u8868\u5168\u81EA\u52A8\u8BC6\u522B\u7684\u7EBF\u3001\u9EC4\u8272\u4EE3\u8868\u5907\u9009\u7EBF\u6BB5"
+--- !u!222 &142442728
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 142442725}
+  m_CullTransparentMesh: 1
+--- !u!1 &147698545
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 147698546}
+  - component: {fileID: 147698549}
+  - component: {fileID: 147698548}
+  - component: {fileID: 147698547}
+  m_Layer: 5
+  m_Name: BtnOpen
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &147698546
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 147698545}
+  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: 1102476130}
+  m_Father: {fileID: 1801784546}
+  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: 0, y: 50}
+  m_Pivot: {x: 0.5, y: 0}
+--- !u!114 &147698547
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 147698545}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 147698548}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 1867793103}
+        m_TargetAssemblyTypeName: zimWebCamera, Assembly-CSharp
+        m_MethodName: OnClick_Open
+        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 &147698548
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 147698545}
+  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 &147698549
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 147698545}
+  m_CullTransparentMesh: 1
+--- !u!1 &170896896
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 170896897}
+  - component: {fileID: 170896899}
+  - component: {fileID: 170896898}
+  m_Layer: 5
+  m_Name: Item Checkmark
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &170896897
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 170896896}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 85546310}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0.5}
+  m_AnchorMax: {x: 0, y: 0.5}
+  m_AnchoredPosition: {x: 10, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &170896898
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 170896896}
+  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: 10901, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &170896899
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 170896896}
+  m_CullTransparentMesh: 1
+--- !u!1 &192620634
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 192620635}
+  - component: {fileID: 192620637}
+  - component: {fileID: 192620636}
+  m_Layer: 5
+  m_Name: Arrow
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &192620635
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 192620634}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 999890265}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 1, y: 0.5}
+  m_AnchorMax: {x: 1, y: 0.5}
+  m_AnchoredPosition: {x: -15, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &192620636
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 192620634}
+  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: 10915, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &192620637
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 192620634}
+  m_CullTransparentMesh: 1
+--- !u!1 &228594325
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 228594326}
+  - component: {fileID: 228594329}
+  - component: {fileID: 228594328}
+  - component: {fileID: 228594327}
+  m_Layer: 5
+  m_Name: BtnScreenManual
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &228594326
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 228594325}
+  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: 1311645355}
+  m_Father: {fileID: 1946863619}
+  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: 1600, y: -50}
+  m_SizeDelta: {x: 640, y: 50}
+  m_Pivot: {x: 0.5, y: 0}
+--- !u!114 &228594327
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 228594325}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 228594328}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 1867793104}
+        m_TargetAssemblyTypeName: ScreenLocate, Assembly-CSharp
+        m_MethodName: BtnScreenLocateManual
+        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 &228594328
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 228594325}
+  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 &228594329
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 228594325}
+  m_CullTransparentMesh: 1
+--- !u!1 &299670349
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 299670350}
+  - component: {fileID: 299670352}
+  - component: {fileID: 299670351}
+  m_Layer: 5
+  m_Name: RawImage (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &299670350
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 299670349}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1759782642}
+  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: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &299670351
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 299670349}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &299670352
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 299670349}
+  m_CullTransparentMesh: 1
+--- !u!1 &382975160
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 382975161}
+  - component: {fileID: 382975163}
+  - component: {fileID: 382975162}
+  m_Layer: 5
+  m_Name: CrosshairInScreen
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &382975161
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 382975160}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 922494663}
+  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: 0}
+  m_SizeDelta: {x: 500, y: 500}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &382975162
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 382975160}
+  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: 0, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 2800000, guid: 24d1e577dc42aaf4ba6e64be26be3845, type: 3}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &382975163
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 382975160}
+  m_CullTransparentMesh: 1
+--- !u!1 &389764433
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 389764434}
+  - component: {fileID: 389764436}
+  - component: {fileID: 389764435}
+  m_Layer: 5
+  m_Name: CrosshairInCamera (Clone)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &389764434
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 389764433}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1793996698}
+  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: -509}
+  m_SizeDelta: {x: 300, y: 300}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &389764435
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 389764433}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 2800000, guid: 24d1e577dc42aaf4ba6e64be26be3845, type: 3}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &389764436
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 389764433}
+  m_CullTransparentMesh: 1
+--- !u!1 &394028721
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 394028722}
+  m_Layer: 5
+  m_Name: Edge
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &394028722
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 394028721}
+  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: 819462430}
+  - {fileID: 962801985}
+  - {fileID: 102676395}
+  m_Father: {fileID: 1867793102}
+  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!1 &424028710
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 424028711}
+  - component: {fileID: 424028713}
+  - component: {fileID: 424028712}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &424028711
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 424028710}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 577700188}
+  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 &424028712
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 424028710}
+  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: 36
+    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: "\u6D4B\u8BD5\u7EA2\u5916\u5C04\u706F"
+--- !u!222 &424028713
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 424028710}
+  m_CullTransparentMesh: 1
+--- !u!1 &437411983
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 437411984}
+  - component: {fileID: 437411986}
+  - component: {fileID: 437411985}
+  m_Layer: 5
+  m_Name: RawImage (2)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &437411984
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 437411983}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 713242658}
+  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: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &437411985
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 437411983}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &437411986
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 437411983}
+  m_CullTransparentMesh: 1
+--- !u!1 &455367824
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 455367825}
+  - component: {fileID: 455367827}
+  - component: {fileID: 455367826}
+  m_Layer: 5
+  m_Name: Text (Legacy)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &455367825
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 455367824}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1929426187}
+  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: -94.26497, y: 0}
+  m_SizeDelta: {x: -447.12994, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &455367826
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 455367824}
+  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: 36
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 3
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u6444\u50CF\u5934\u5E8F\u53F7\uFF1A"
+--- !u!222 &455367827
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 455367824}
+  m_CullTransparentMesh: 1
+--- !u!1 &476763547
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 476763548}
+  - component: {fileID: 476763551}
+  - component: {fileID: 476763550}
+  m_Layer: 5
+  m_Name: CameraImage5
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &476763548
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 476763547}
+  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: 1039630091}
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 9
+  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: 782, y: -318}
+  m_SizeDelta: {x: 720, y: 420}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &476763550
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 476763547}
+  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 &476763551
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 476763547}
+  m_CullTransparentMesh: 1
+--- !u!1 &493188447
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 493188450}
+  - component: {fileID: 493188449}
+  - component: {fileID: 493188448}
+  m_Layer: 5
+  m_Name: LogText
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!114 &493188448
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 493188447}
+  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: 28
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 1
+    m_VerticalOverflow: 1
+    m_LineSpacing: 1
+  m_Text: 
+--- !u!222 &493188449
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 493188447}
+  m_CullTransparentMesh: 1
+--- !u!224 &493188450
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 493188447}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 18
+  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: 781.9999, y: 441.49}
+  m_SizeDelta: {x: 720, y: 62.985}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &500784415
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 500784416}
+  - component: {fileID: 500784418}
+  - component: {fileID: 500784417}
+  m_Layer: 5
+  m_Name: Text (Legacy)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &500784416
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 500784415}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 682249273}
+  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: 21, y: 229}
+  m_SizeDelta: {x: 300, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &500784417
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 500784415}
+  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: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 41
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 10
+    m_MaxSize: 57
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "4\u3001\u534A\u81EA\u52A8+\u81EA\u52A8"
+--- !u!222 &500784418
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 500784415}
+  m_CullTransparentMesh: 1
+--- !u!1 &517576267
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 517576268}
+  - component: {fileID: 517576269}
+  m_Layer: 5
+  m_Name: ToggleFullScreen
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &517576268
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 517576267}
+  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: 1731784227}
+  - {fileID: 619252550}
+  m_Father: {fileID: 588275179}
+  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: -90, y: 566}
+  m_SizeDelta: {x: 160, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &517576269
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 517576267}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 1731784228}
+  toggleTransition: 1
+  graphic: {fileID: 54605589}
+  m_Group: {fileID: 0}
+  onValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_IsOn: 0
+--- !u!1 &557727040
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 557727041}
+  - component: {fileID: 557727043}
+  - component: {fileID: 557727042}
+  m_Layer: 5
+  m_Name: Info
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &557727041
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 557727040}
+  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: 1821259942}
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 13
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0.5}
+  m_AnchorMax: {x: 0, y: 0.5}
+  m_AnchoredPosition: {x: 538.99976, y: 520.9999}
+  m_SizeDelta: {x: 822, y: 60}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &557727042
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 557727040}
+  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: 40
+    m_FontStyle: 1
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 48
+    m_Alignment: 3
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u5148\u5B9A\u4F4D\u5C4F\u5E55"
+--- !u!222 &557727043
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 557727040}
+  m_CullTransparentMesh: 1
+--- !u!1 &577700187
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 577700188}
+  - component: {fileID: 577700191}
+  - component: {fileID: 577700190}
+  - component: {fileID: 577700189}
+  m_Layer: 5
+  m_Name: BtnScreenMap
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &577700188
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 577700187}
+  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: 424028711}
+  m_Father: {fileID: 1946863619}
+  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: 0, y: 50}
+  m_Pivot: {x: 0.5, y: 0}
+--- !u!114 &577700189
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 577700187}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 577700190}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 1867793104}
+        m_TargetAssemblyTypeName: ScreenLocate, Assembly-CSharp
+        m_MethodName: BtnScreenMap
+        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 &577700190
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 577700187}
+  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 &577700191
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 577700187}
+  m_CullTransparentMesh: 1
+--- !u!1 &588275178
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 588275179}
+  m_Layer: 5
+  m_Name: Settings
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &588275179
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 588275178}
+  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: 601288812}
+  - {fileID: 517576268}
+  - {fileID: 1812960952}
+  m_Father: {fileID: 1867793102}
+  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: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &601288811
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 601288812}
+  - component: {fileID: 601288813}
+  m_Layer: 5
+  m_Name: Save
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &601288812
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 601288811}
+  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: 1190139017}
+  - {fileID: 1120077961}
+  m_Father: {fileID: 588275179}
+  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: -90, y: 515}
+  m_SizeDelta: {x: 160, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &601288813
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 601288811}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 1190139018}
+  toggleTransition: 1
+  graphic: {fileID: 1384467929}
+  m_Group: {fileID: 0}
+  onValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_IsOn: 0
+--- !u!1 &614532336
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 614532337}
+  - component: {fileID: 614532339}
+  - component: {fileID: 614532338}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &614532337
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 614532336}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1142717919}
+  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 &614532338
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 614532336}
+  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: 36
+    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: "\u5173\u95ED\u6444\u50CF\u5934"
+--- !u!222 &614532339
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 614532336}
+  m_CullTransparentMesh: 1
+--- !u!1 &619252549
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 619252550}
+  - component: {fileID: 619252552}
+  - component: {fileID: 619252551}
+  m_Layer: 5
+  m_Name: Label
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &619252550
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 619252549}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 517576268}
+  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: 28.445, y: -11.119999}
+  m_SizeDelta: {x: -13.989996, y: 37.959995}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &619252551
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 619252549}
+  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: 32
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u5168\u5C4F"
+--- !u!222 &619252552
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 619252549}
+  m_CullTransparentMesh: 1
+--- !u!1 &641569779
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 641569780}
+  - component: {fileID: 641569782}
+  - component: {fileID: 641569781}
+  m_Layer: 5
+  m_Name: fps
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &641569780
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 641569779}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 20
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 100, y: -157}
+  m_SizeDelta: {x: 160, y: 30}
+  m_Pivot: {x: 0, y: 1}
+--- !u!114 &641569781
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 641569779}
+  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: 0, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 32
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 3
+    m_MaxSize: 40
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 1
+    m_VerticalOverflow: 1
+    m_LineSpacing: 1
+  m_Text: 
+--- !u!222 &641569782
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 641569779}
+  m_CullTransparentMesh: 1
+--- !u!1 &681002956
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 681002957}
+  - component: {fileID: 681002960}
+  - component: {fileID: 681002959}
+  - component: {fileID: 681002958}
+  m_Layer: 5
+  m_Name: CameraAutoLight
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &681002957
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 681002956}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2101632896}
+  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: -864, y: 0}
+  m_SizeDelta: {x: 720, y: 420}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &681002958
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 681002956}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 174d813985bd3f14fafed6022d673234, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  aspectMode: 1
+--- !u!114 &681002959
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 681002956}
+  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: 0.9716981, g: 0.75627446, b: 0.75627446, 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 &681002960
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 681002956}
+  m_CullTransparentMesh: 1
+--- !u!1 &682249272
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 682249273}
+  - component: {fileID: 682249276}
+  - component: {fileID: 682249275}
+  m_Layer: 5
+  m_Name: CameraImage3
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &682249273
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 682249272}
+  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: 1740452459998223283}
+  - {fileID: 500784416}
+  m_Father: {fileID: 1867793102}
+  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: -780, y: -318.00003}
+  m_SizeDelta: {x: 720, y: 420}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &682249275
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 682249272}
+  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 &682249276
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 682249272}
+  m_CullTransparentMesh: 1
+--- !u!1 &713242657
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 713242658}
+  - component: {fileID: 713242659}
+  m_Layer: 5
+  m_Name: ScreenQuad
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &713242658
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 713242657}
+  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: 1718554403}
+  - {fileID: 1810361247}
+  - {fileID: 437411984}
+  - {fileID: 968799190}
+  m_Father: {fileID: 1261583876}
+  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!222 &713242659
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 713242657}
+  m_CullTransparentMesh: 1
+--- !u!1 &819462429
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 819462430}
+  - component: {fileID: 819462432}
+  - component: {fileID: 819462431}
+  m_Layer: 5
+  m_Name: RawImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &819462430
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 819462429}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 394028722}
+  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 &819462431
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 819462429}
+  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 &819462432
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 819462429}
+  m_CullTransparentMesh: 1
+--- !u!1 &849339069
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 849339070}
+  - component: {fileID: 849339072}
+  - component: {fileID: 849339071}
+  m_Layer: 5
+  m_Name: Text (Legacy)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &849339070
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 849339069}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 19
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 130, y: -179}
+  m_SizeDelta: {x: 160, y: 30}
+  m_Pivot: {x: 0, y: 1}
+--- !u!114 &849339071
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 849339069}
+  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: 0, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 32
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 3
+    m_MaxSize: 40
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 1
+    m_VerticalOverflow: 1
+    m_LineSpacing: 1
+  m_Text: 
+--- !u!222 &849339072
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 849339069}
+  m_CullTransparentMesh: 1
+--- !u!1 &858464725
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 858464726}
+  - component: {fileID: 858464728}
+  - component: {fileID: 858464727}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &858464726
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 858464725}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1289810228}
+  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 &858464727
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 858464725}
+  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: 36
+    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: "\u5B9A\u4F4D\u5C4F\u5E55"
+--- !u!222 &858464728
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 858464725}
+  m_CullTransparentMesh: 1
+--- !u!1 &896342388
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 896342389}
+  - component: {fileID: 896342391}
+  - component: {fileID: 896342390}
+  m_Layer: 5
+  m_Name: Handle
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &896342389
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 896342388}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1819336722}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 0.2}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &896342390
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 896342388}
+  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 &896342391
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 896342388}
+  m_CullTransparentMesh: 1
+--- !u!1 &921473346
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 921473348}
+  - component: {fileID: 921473347}
+  m_Layer: 0
+  m_Name: Debug
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &921473347
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 921473346}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4f2ded6b4a0d6f6449cba281b752cc91, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!4 &921473348
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 921473346}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &922494662
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 922494663}
+  - component: {fileID: 922494665}
+  - component: {fileID: 922494664}
+  m_Layer: 5
+  m_Name: Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &922494663
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 922494662}
+  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: 1819346506}
+  - {fileID: 382975161}
+  - {fileID: 1092870242}
+  - {fileID: 1728164016}
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 16
+  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 &922494664
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 922494662}
+  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: 0, g: 0, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &922494665
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 922494662}
+  m_CullTransparentMesh: 1
+--- !u!1 &941124382
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 941124383}
+  - component: {fileID: 941124385}
+  - component: {fileID: 941124384}
+  m_Layer: 5
+  m_Name: CameraImage8
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &941124383
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 941124382}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 12
+  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: -1649, y: -418}
+  m_SizeDelta: {x: 720, y: 420}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &941124384
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 941124382}
+  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 &941124385
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 941124382}
+  m_CullTransparentMesh: 1
+--- !u!1 &943874010
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 943874011}
+  - component: {fileID: 943874013}
+  - component: {fileID: 943874012}
+  m_Layer: 5
+  m_Name: RawImage (3)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &943874011
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 943874010}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1759782642}
+  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: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &943874012
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 943874010}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &943874013
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 943874010}
+  m_CullTransparentMesh: 1
+--- !u!1 &962801984
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 962801985}
+  - component: {fileID: 962801987}
+  - component: {fileID: 962801986}
+  m_Layer: 5
+  m_Name: RawImage (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &962801985
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 962801984}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 394028722}
+  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}
+  m_SizeDelta: {x: -100, y: -100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &962801986
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 962801984}
+  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: 0.19215687, g: 0.3019608, b: 0.4745098, 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 &962801987
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 962801984}
+  m_CullTransparentMesh: 1
+--- !u!1 &968799189
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 968799190}
+  - component: {fileID: 968799192}
+  - component: {fileID: 968799191}
+  m_Layer: 5
+  m_Name: RawImage (3)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &968799190
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 968799189}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 713242658}
+  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: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &968799191
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 968799189}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &968799192
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 968799189}
+  m_CullTransparentMesh: 1
+--- !u!1 &999890264
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 999890265}
+  - component: {fileID: 999890268}
+  - component: {fileID: 999890267}
+  - component: {fileID: 999890266}
+  m_Layer: 5
+  m_Name: Dropdown (Legacy)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &999890265
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 999890264}
+  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: 1250056749}
+  - {fileID: 192620635}
+  - {fileID: 1141370595}
+  m_Father: {fileID: 1929426187}
+  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: 105.48508, y: 0}
+  m_SizeDelta: {x: -621.73016, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &999890266
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 999890264}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0d0b652f32a2cc243917e4028fa0f046, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 999890267}
+  m_Template: {fileID: 1141370595}
+  m_CaptionText: {fileID: 1250056750}
+  m_CaptionImage: {fileID: 0}
+  m_ItemText: {fileID: 1473555257}
+  m_ItemImage: {fileID: 0}
+  m_Value: 0
+  m_Options:
+    m_Options:
+    - m_Text: Cam 1
+      m_Image: {fileID: 0}
+    - m_Text: Cam 2
+      m_Image: {fileID: 0}
+    - m_Text: Cam 3
+      m_Image: {fileID: 0}
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_AlphaFadeSpeed: 0.15
+--- !u!114 &999890267
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 999890264}
+  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 &999890268
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 999890264}
+  m_CullTransparentMesh: 1
+--- !u!1 &1039630090
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1039630091}
+  - component: {fileID: 1039630093}
+  - component: {fileID: 1039630092}
+  m_Layer: 5
+  m_Name: Text (Legacy)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1039630091
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1039630090}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 476763548}
+  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: 22, y: 241}
+  m_SizeDelta: {x: 653.36, y: 119.9}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1039630092
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1039630090}
+  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: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 40
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 4
+    m_MaxSize: 57
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "6\u3001\u7ED3\u5408\u624B\u52A8\u5B9A\u4E49\u6570\u636E\u65F6\uFF0C\u534A\u81EA\u52A8\u8BC6\u522B\u5230\u7684\u5907\u9009\u7EBF\u6BB5"
+--- !u!222 &1039630093
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1039630090}
+  m_CullTransparentMesh: 1
+--- !u!1 &1092870241
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1092870242}
+  - component: {fileID: 1092870244}
+  - component: {fileID: 1092870243}
+  m_Layer: 5
+  m_Name: CrosshairInScreen (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &1092870242
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1092870241}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 922494663}
+  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: 0, y: 0}
+  m_SizeDelta: {x: 500, y: 500}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1092870243
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1092870241}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 2800000, guid: 24d1e577dc42aaf4ba6e64be26be3845, type: 3}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &1092870244
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1092870241}
+  m_CullTransparentMesh: 1
+--- !u!1 &1102476129
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1102476130}
+  - component: {fileID: 1102476132}
+  - component: {fileID: 1102476131}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1102476130
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1102476129}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 147698546}
+  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 &1102476131
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1102476129}
+  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: 36
+    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: "\u6253\u5F00\u6444\u50CF\u5934"
+--- !u!222 &1102476132
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1102476129}
+  m_CullTransparentMesh: 1
+--- !u!1 &1120077960
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1120077961}
+  - component: {fileID: 1120077963}
+  - component: {fileID: 1120077962}
+  m_Layer: 5
+  m_Name: Label
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1120077961
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1120077960}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 601288812}
+  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: 28.445, y: -11.119999}
+  m_SizeDelta: {x: -13.989996, y: 37.959995}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1120077962
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1120077960}
+  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: 32
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u4FDD\u5B58\u56FE\u7247"
+--- !u!222 &1120077963
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1120077960}
+  m_CullTransparentMesh: 1
+--- !u!1 &1123163642
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1123163643}
+  - component: {fileID: 1123163645}
+  - component: {fileID: 1123163644}
+  m_Layer: 5
+  m_Name: RawImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1123163643
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1123163642}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1759782642}
+  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: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1123163644
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1123163642}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &1123163645
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1123163642}
+  m_CullTransparentMesh: 1
+--- !u!1 &1141370594
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1141370595}
+  - component: {fileID: 1141370598}
+  - component: {fileID: 1141370597}
+  - component: {fileID: 1141370596}
+  m_Layer: 5
+  m_Name: Template
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &1141370595
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1141370594}
+  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: 5125265}
+  - {fileID: 1936914297}
+  m_Father: {fileID: 999890265}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 0}
+  m_AnchoredPosition: {x: 0, y: 2}
+  m_SizeDelta: {x: 0, y: 150}
+  m_Pivot: {x: 0.5, y: 1}
+--- !u!114 &1141370596
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1141370594}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Content: {fileID: 2011614147}
+  m_Horizontal: 0
+  m_Vertical: 1
+  m_MovementType: 2
+  m_Elasticity: 0.1
+  m_Inertia: 1
+  m_DecelerationRate: 0.135
+  m_ScrollSensitivity: 1
+  m_Viewport: {fileID: 5125265}
+  m_HorizontalScrollbar: {fileID: 0}
+  m_VerticalScrollbar: {fileID: 1936914298}
+  m_HorizontalScrollbarVisibility: 0
+  m_VerticalScrollbarVisibility: 2
+  m_HorizontalScrollbarSpacing: 0
+  m_VerticalScrollbarSpacing: -3
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!114 &1141370597
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1141370594}
+  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 &1141370598
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1141370594}
+  m_CullTransparentMesh: 1
+--- !u!1 &1142717918
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1142717919}
+  - component: {fileID: 1142717922}
+  - component: {fileID: 1142717921}
+  - component: {fileID: 1142717920}
+  m_Layer: 5
+  m_Name: BtnClose
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1142717919
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1142717918}
+  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: 614532337}
+  m_Father: {fileID: 1801784546}
+  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: 0, y: 50}
+  m_Pivot: {x: 0.5, y: 0}
+--- !u!114 &1142717920
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1142717918}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 1142717921}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 1867793103}
+        m_TargetAssemblyTypeName: zimWebCamera, Assembly-CSharp
+        m_MethodName: OnClick_Close
+        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 &1142717921
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1142717918}
+  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 &1142717922
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1142717918}
+  m_CullTransparentMesh: 1
+--- !u!1 &1190139016
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1190139017}
+  - component: {fileID: 1190139019}
+  - component: {fileID: 1190139018}
+  m_Layer: 5
+  m_Name: Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1190139017
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1190139016}
+  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: 1384467928}
+  m_Father: {fileID: 601288812}
+  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: 10, y: -10}
+  m_SizeDelta: {x: 40, y: 40}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1190139018
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1190139016}
+  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 &1190139019
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1190139016}
+  m_CullTransparentMesh: 1
+--- !u!1 &1220810727
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1220810728}
+  - component: {fileID: 1220810730}
+  - component: {fileID: 1220810729}
+  m_Layer: 5
+  m_Name: Text (Legacy)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1220810728
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1220810727}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2004094256}
+  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: 7, y: 226}
+  m_SizeDelta: {x: 725.97, y: 140}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1220810729
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1220810727}
+  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: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 39
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 10
+    m_MaxSize: 57
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "2\u3001\u672A\u4F7F\u7528\u624B\u52A8\u5B9A\u4E49\u6570\u636E\u65F6\uFF0C\u534A\u81EA\u52A8\u8BC6\u522B\u5230\u7684\u5168\u90E8\u7EBF\u6BB5"
+--- !u!222 &1220810730
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1220810727}
+  m_CullTransparentMesh: 1
+--- !u!1 &1250056748
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1250056749}
+  - component: {fileID: 1250056751}
+  - component: {fileID: 1250056750}
+  m_Layer: 5
+  m_Name: Label
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1250056749
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1250056748}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 999890265}
+  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: -7.5, y: -0.5}
+  m_SizeDelta: {x: -35, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1250056750
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1250056748}
+  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: 32
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 3
+    m_MaxSize: 300
+    m_Alignment: 3
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: Cam 1
+--- !u!222 &1250056751
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1250056748}
+  m_CullTransparentMesh: 1
+--- !u!1 &1261583875
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1261583876}
+  - component: {fileID: 1261583879}
+  - component: {fileID: 1261583878}
+  m_Layer: 5
+  m_Name: CameraImage4
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1261583876
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1261583875}
+  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: 713242658}
+  - {fileID: 1811249278}
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 8
+  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: -318.00003}
+  m_SizeDelta: {x: 720, y: 420}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1261583878
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1261583875}
+  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 &1261583879
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1261583875}
+  m_CullTransparentMesh: 1
+--- !u!1 &1289810227
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1289810228}
+  - component: {fileID: 1289810231}
+  - component: {fileID: 1289810230}
+  - component: {fileID: 1289810229}
+  m_Layer: 5
+  m_Name: BtnScreenManual (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1289810228
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1289810227}
+  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: 858464726}
+  m_Father: {fileID: 1946863619}
+  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: 0, y: 50}
+  m_Pivot: {x: 0.5, y: 0}
+--- !u!114 &1289810229
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1289810227}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 1289810230}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 1867793103}
+        m_TargetAssemblyTypeName: ZIMWebCamera, Assembly-CSharp
+        m_MethodName: OnClick_ScreenLocateManual
+        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 &1289810230
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1289810227}
+  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 &1289810231
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1289810227}
+  m_CullTransparentMesh: 1
+--- !u!1 &1309947136
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1309947137}
+  - component: {fileID: 1309947140}
+  - component: {fileID: 1309947139}
+  m_Layer: 5
+  m_Name: CameraImage6
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1309947137
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1309947136}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 10
+  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: -776, y: -927}
+  m_SizeDelta: {x: 720, y: 420}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1309947139
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1309947136}
+  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 &1309947140
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1309947136}
+  m_CullTransparentMesh: 1
+--- !u!1 &1311645354
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1311645355}
+  - component: {fileID: 1311645357}
+  - component: {fileID: 1311645356}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1311645355
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1311645354}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 228594326}
+  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 &1311645356
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1311645354}
+  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: 36
+    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: "\u624B\u52A8\u5B9A\u4F4D\u5C4F\u5E55"
+--- !u!222 &1311645357
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1311645354}
+  m_CullTransparentMesh: 1
+--- !u!1 &1337472476
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1337472477}
+  m_Layer: 5
+  m_Name: CameraMask
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1337472477
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1337472476}
+  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: 1645986109}
+  m_Father: {fileID: 2101632896}
+  m_RootOrder: 6
+  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!1 &1349123691
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1349123692}
+  - component: {fileID: 1349123694}
+  - component: {fileID: 1349123693}
+  m_Layer: 5
+  m_Name: CrosshairInCamera (Clone)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1349123692
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1349123691}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1361341703}
+  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: -493}
+  m_SizeDelta: {x: 300, y: 300}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1349123693
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1349123691}
+  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: 0, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 2800000, guid: 24d1e577dc42aaf4ba6e64be26be3845, type: 3}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &1349123694
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1349123691}
+  m_CullTransparentMesh: 1
+--- !u!1 &1361341702
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1361341703}
+  - component: {fileID: 1361341705}
+  - component: {fileID: 1361341704}
+  m_Layer: 5
+  m_Name: CrosshairInCamera
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &1361341703
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1361341702}
+  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: 1349123692}
+  m_Father: {fileID: 2101632896}
+  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: 0}
+  m_SizeDelta: {x: 300, y: 300}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1361341704
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1361341702}
+  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: 0, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 2800000, guid: 24d1e577dc42aaf4ba6e64be26be3845, type: 3}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &1361341705
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1361341702}
+  m_CullTransparentMesh: 1
+--- !u!1 &1384467927
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1384467928}
+  - component: {fileID: 1384467930}
+  - component: {fileID: 1384467929}
+  m_Layer: 5
+  m_Name: Checkmark
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1384467928
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1384467927}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1190139017}
+  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: 40, y: 40}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1384467929
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1384467927}
+  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: 10901, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1384467930
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1384467927}
+  m_CullTransparentMesh: 1
+--- !u!1 &1426786005
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1426786006}
+  - component: {fileID: 1426786009}
+  - component: {fileID: 1426786008}
+  m_Layer: 5
+  m_Name: CameraImage2
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1426786006
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1426786005}
+  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: 1688891193}
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 7
+  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: 781, y: 191}
+  m_SizeDelta: {x: 720, y: 420}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1426786008
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1426786005}
+  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 &1426786009
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1426786005}
+  m_CullTransparentMesh: 1
+--- !u!1 &1438266373
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1438266374}
+  m_Layer: 5
+  m_Name: InfraredScreenPositioningViewParent
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1438266374
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1438266373}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 15
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &1473555255
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1473555256}
+  - component: {fileID: 1473555258}
+  - component: {fileID: 1473555257}
+  m_Layer: 5
+  m_Name: Item Label
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1473555256
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1473555255}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 85546310}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 5, y: -0.5}
+  m_SizeDelta: {x: -30, y: -3}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1473555257
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1473555255}
+  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: 32
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 3
+    m_MaxSize: 40
+    m_Alignment: 3
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: Option A
+--- !u!222 &1473555258
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1473555255}
+  m_CullTransparentMesh: 1
+--- !u!1 &1588263170
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1588263171}
+  - component: {fileID: 1588263174}
+  - component: {fileID: 1588263173}
+  - component: {fileID: 1588263172}
+  m_Layer: 5
+  m_Name: BtnScreenLocate
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1588263171
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1588263170}
+  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: 1732438112}
+  m_Father: {fileID: 1946863619}
+  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: 50}
+  m_Pivot: {x: 0.5, y: 0}
+--- !u!114 &1588263172
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1588263170}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 0
+  m_TargetGraphic: {fileID: 1588263173}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 1867793104}
+        m_TargetAssemblyTypeName: ScreenLocate, Assembly-CSharp
+        m_MethodName: BtnScreenLocate
+        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 &1588263173
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1588263170}
+  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 &1588263174
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1588263170}
+  m_CullTransparentMesh: 1
+--- !u!1 &1639229244
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1639229245}
+  - component: {fileID: 1639229247}
+  - component: {fileID: 1639229246}
+  m_Layer: 5
+  m_Name: Item Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1639229245
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1639229244}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 85546310}
+  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 &1639229246
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1639229244}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, 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: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1639229247
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1639229244}
+  m_CullTransparentMesh: 1
+--- !u!1 &1645986108
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1645986109}
+  - component: {fileID: 1645986111}
+  - component: {fileID: 1645986110}
+  m_Layer: 5
+  m_Name: PixelCheaker
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1645986109
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1645986108}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1337472477}
+  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 &1645986110
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1645986108}
+  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: 1}
+  m_RaycastTarget: 0
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: f3b60078f3450d1459d9642ca6404c7d, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 0
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1645986111
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1645986108}
+  m_CullTransparentMesh: 1
+--- !u!1 &1688891192
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1688891193}
+  - component: {fileID: 1688891195}
+  - component: {fileID: 1688891194}
+  m_Layer: 5
+  m_Name: Text (Legacy)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1688891193
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1688891192}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1426786006}
+  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: 36, y: 230}
+  m_SizeDelta: {x: 500, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1688891194
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1688891192}
+  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: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 41
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 10
+    m_MaxSize: 57
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "3\u3001\u68C0\u6D4B\u5230\u7684\u5C4F\u5E55\u9ED1\u767D\u8272\u5DEE"
+--- !u!222 &1688891195
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1688891192}
+  m_CullTransparentMesh: 1
+--- !u!1 &1697954113
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1697954114}
+  - component: {fileID: 1697954116}
+  - component: {fileID: 1697954115}
+  m_Layer: 5
+  m_Name: FullScreenImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &1697954114
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1697954113}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 17
+  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 &1697954115
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1697954113}
+  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 &1697954116
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1697954113}
+  m_CullTransparentMesh: 1
+--- !u!1 &1718554402
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1718554403}
+  - component: {fileID: 1718554405}
+  - component: {fileID: 1718554404}
+  m_Layer: 5
+  m_Name: RawImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1718554403
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1718554402}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 713242658}
+  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: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1718554404
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1718554402}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &1718554405
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1718554402}
+  m_CullTransparentMesh: 1
+--- !u!1 &1728164015
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1728164016}
+  - component: {fileID: 1728164018}
+  - component: {fileID: 1728164017}
+  m_Layer: 5
+  m_Name: Image
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &1728164016
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1728164015}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 922494663}
+  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: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1728164017
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1728164015}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 0, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1728164018
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1728164015}
+  m_CullTransparentMesh: 1
+--- !u!1 &1731784226
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1731784227}
+  - component: {fileID: 1731784229}
+  - component: {fileID: 1731784228}
+  m_Layer: 5
+  m_Name: Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1731784227
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1731784226}
+  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: 54605588}
+  m_Father: {fileID: 517576268}
+  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: 10, y: -10}
+  m_SizeDelta: {x: 40, y: 40}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1731784228
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1731784226}
+  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 &1731784229
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1731784226}
+  m_CullTransparentMesh: 1
+--- !u!1 &1732438111
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1732438112}
+  - component: {fileID: 1732438114}
+  - component: {fileID: 1732438113}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1732438112
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1732438111}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1588263171}
+  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 &1732438113
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1732438111}
+  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: 7
+    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: "\u5C4F\u5E55\u5B9A\u4F4D\uFF08\u81EA\u52A8\uFF09"
+--- !u!222 &1732438114
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1732438111}
+  m_CullTransparentMesh: 1
+--- !u!1 &1738715395
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1738715396}
+  - component: {fileID: 1738715398}
+  - component: {fileID: 1738715397}
+  m_Layer: 5
+  m_Name: RawImage (2)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1738715396
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1738715395}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1759782642}
+  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: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1738715397
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1738715395}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &1738715398
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1738715395}
+  m_CullTransparentMesh: 1
+--- !u!1 &1759782641
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1759782642}
+  - component: {fileID: 1759782643}
+  m_Layer: 5
+  m_Name: ScreenQuad
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &1759782642
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1759782641}
+  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: 1123163643}
+  - {fileID: 299670350}
+  - {fileID: 1738715396}
+  - {fileID: 943874011}
+  m_Father: {fileID: 2101632896}
+  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!222 &1759782643
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1759782641}
+  m_CullTransparentMesh: 1
+--- !u!1 &1765021458
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1765021459}
+  - component: {fileID: 1765021461}
+  - component: {fileID: 1765021460}
+  m_Layer: 5
+  m_Name: Text (Legacy)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1765021459
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1765021458}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2101632896}
+  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: 71, y: 227}
+  m_SizeDelta: {x: 300, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1765021460
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1765021458}
+  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: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 41
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 10
+    m_MaxSize: 57
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "1\u3001\u624B\u52A8"
+--- !u!222 &1765021461
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1765021458}
+  m_CullTransparentMesh: 1
+--- !u!1 &1793996697
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1793996698}
+  - component: {fileID: 1793996700}
+  - component: {fileID: 1793996699}
+  m_Layer: 5
+  m_Name: CrosshairInCamera (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &1793996698
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1793996697}
+  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: 389764434}
+  m_Father: {fileID: 2101632896}
+  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: 0, y: 0}
+  m_SizeDelta: {x: 300, y: 300}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1793996699
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1793996697}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 2800000, guid: 24d1e577dc42aaf4ba6e64be26be3845, type: 3}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &1793996700
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1793996697}
+  m_CullTransparentMesh: 1
+--- !u!1 &1801784545
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1801784546}
+  - component: {fileID: 1801784547}
+  m_Layer: 5
+  m_Name: Btn0
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1801784546
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1801784545}
+  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: 1929426187}
+  - {fileID: 147698546}
+  - {fileID: 1142717919}
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1801784547
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1801784545}
+  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: 0
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 1
+  m_ChildForceExpandHeight: 0
+  m_ChildControlWidth: 1
+  m_ChildControlHeight: 0
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+  m_ReverseArrangement: 0
+--- !u!1 &1810361246
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1810361247}
+  - component: {fileID: 1810361249}
+  - component: {fileID: 1810361248}
+  m_Layer: 5
+  m_Name: RawImage (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1810361247
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1810361246}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 713242658}
+  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: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1810361248
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1810361246}
+  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: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &1810361249
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1810361246}
+  m_CullTransparentMesh: 1
+--- !u!1 &1811249277
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1811249278}
+  - component: {fileID: 1811249280}
+  - component: {fileID: 1811249279}
+  m_Layer: 5
+  m_Name: Text (Legacy)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1811249278
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1811249277}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1261583876}
+  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: 75, y: 229}
+  m_SizeDelta: {x: 500, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1811249279
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1811249277}
+  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: 0, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 41
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 10
+    m_MaxSize: 57
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "5\u3001\u56FE3\u548C\u56FE4\u53E0\u52A0"
+--- !u!222 &1811249280
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1811249277}
+  m_CullTransparentMesh: 1
+--- !u!224 &1812960952 stripped
+RectTransform:
+  m_CorrespondingSourceObject: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+  m_PrefabInstance: {fileID: 2414034270426155791}
+  m_PrefabAsset: {fileID: 0}
+--- !u!1 &1819336721
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1819336722}
+  m_Layer: 5
+  m_Name: Sliding Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1819336722
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1819336721}
+  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: 896342389}
+  m_Father: {fileID: 1936914297}
+  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: -20, y: -20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &1819346505
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1819346506}
+  - component: {fileID: 1819346508}
+  - component: {fileID: 1819346507}
+  m_Layer: 5
+  m_Name: Quad
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1819346506
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1819346505}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 922494663}
+  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 &1819346507
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1819346505}
+  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 &1819346508
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1819346505}
+  m_CullTransparentMesh: 1
+--- !u!1 &1821259941
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1821259942}
+  - component: {fileID: 1821259944}
+  - component: {fileID: 1821259943}
+  m_Layer: 5
+  m_Name: InfoDebug
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1821259942
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1821259941}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 557727041}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0.5}
+  m_AnchorMax: {x: 0, y: 0.5}
+  m_AnchoredPosition: {x: -214.62286, y: -1448.3071}
+  m_SizeDelta: {x: 286.5011, y: 416.2088}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1821259943
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1821259941}
+  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: 28
+    m_FontStyle: 1
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 48
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: Debug
+--- !u!222 &1821259944
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1821259941}
+  m_CullTransparentMesh: 1
+--- !u!1 &1867793098
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1867793102}
+  - component: {fileID: 1867793101}
+  - component: {fileID: 1867793100}
+  - component: {fileID: 1867793099}
+  - component: {fileID: 1867793103}
+  - component: {fileID: 1867793104}
+  m_Layer: 5
+  m_Name: WebCameraView
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1867793099
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1867793098}
+  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: 4294967295
+--- !u!114 &1867793100
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1867793098}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 1
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 2400, y: 1080}
+  m_ScreenMatchMode: 1
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+  m_PresetInfoIsWorld: 0
+--- !u!223 &1867793101
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1867793098}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 0
+  m_Camera: {fileID: 0}
+  m_PlaneDistance: 100
+  m_PixelPerfect: 0
+  m_ReceivesEvents: 1
+  m_OverrideSorting: 0
+  m_OverridePixelPerfect: 0
+  m_SortingBucketNormalizedSize: 0
+  m_VertexColorAlwaysGammaSpace: 0
+  m_AdditionalShaderChannelsFlag: 25
+  m_SortingLayerID: 0
+  m_SortingOrder: 0
+  m_TargetDisplay: 0
+--- !u!224 &1867793102
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1867793098}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0, y: 0, z: 0}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 394028722}
+  - {fileID: 588275179}
+  - {fileID: 1801784546}
+  - {fileID: 1946863619}
+  - {fileID: 682249273}
+  - {fileID: 2101632896}
+  - {fileID: 2004094256}
+  - {fileID: 1426786006}
+  - {fileID: 1261583876}
+  - {fileID: 476763548}
+  - {fileID: 1309947137}
+  - {fileID: 3098480069149916812}
+  - {fileID: 941124383}
+  - {fileID: 557727041}
+  - {fileID: 142442726}
+  - {fileID: 1438266374}
+  - {fileID: 922494663}
+  - {fileID: 1697954114}
+  - {fileID: 493188450}
+  - {fileID: 849339070}
+  - {fileID: 641569780}
+  m_Father: {fileID: 0}
+  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: 0, y: 0}
+  m_Pivot: {x: 0, y: 0}
+--- !u!114 &1867793103
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1867793098}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 69761566ec3b1054fb4eaf1a515fa3ce, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  dropdownIndex: {fileID: 999890266}
+  width: 1920
+  height: 1080
+  fps: 30
+  rawImage: {fileID: 2101632897}
+  rawImageSize: {fileID: 681002959}
+  maintainAspectRatio: {fileID: 681002958}
+  logText: {fileID: 493188448}
+  mParent: {fileID: 1438266374}
+--- !u!114 &1867793104
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1867793098}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: bbb133b9c79cd2d49970b410adbdf946, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  InfraredSpotSettings: {fileID: 11400000, guid: 17822ad3b6976fe4283b3e8588c964be, type: 2}
+  Info: {fileID: 557727042}
+  CrosshairInCamera:
+  - {fileID: 1361341703}
+  - {fileID: 1793996698}
+  CrosshairInScreen:
+  - {fileID: 382975161}
+  - {fileID: 1092870242}
+  ScreenQuad: {fileID: 1759782642}
+  SaveToggle: {fileID: 601288813}
+  FullScreenToggle: {fileID: 517576269}
+  UILineGenerator: {fileID: 1922585535}
+  ShowScreenQuad: 1
+  outputRawImages:
+  - {fileID: 2101632897}
+  - {fileID: 2004094257}
+  - {fileID: 1426786008}
+  - {fileID: 682249275}
+  - {fileID: 1261583878}
+  - {fileID: 476763550}
+  - {fileID: 1309947139}
+  - {fileID: 2452220216917731427}
+  FullScreenImage: {fileID: 1697954115}
+  ScreenPixelCheaker: {fileID: 0}
+  DebugScreenImages: []
+  DebugOnZIMDemo: 1
+  m_UITime: {fileID: 849339071}
+  updateInterval: 0.5
+  m_FPS: {fileID: 641569781}
+  filterDis: 3
+--- !u!1 &1922585531
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1922585532}
+  - component: {fileID: 1922585534}
+  - component: {fileID: 1922585535}
+  m_Layer: 0
+  m_Name: LineGenerator
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1922585532
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1922585531}
+  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: 1
+  m_Children: []
+  m_Father: {fileID: 2101632896}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1922585534
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1922585531}
+  m_CullTransparentMesh: 1
+--- !u!114 &1922585535
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1922585531}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3bd83e7684ce1a542bbd5e6d3120fe62, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 10306, guid: 0000000000000000f000000000000000, type: 0}
+  m_Color: {r: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 0
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  LineThickness: 4
+  Loop: 1
+  _points: []
+--- !u!1 &1929426186
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1929426187}
+  m_Layer: 5
+  m_Name: CameraIndex
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1929426187
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1929426186}
+  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: 455367825}
+  - {fileID: 999890265}
+  m_Father: {fileID: 1801784546}
+  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: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &1936914296
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1936914297}
+  - component: {fileID: 1936914300}
+  - component: {fileID: 1936914299}
+  - component: {fileID: 1936914298}
+  m_Layer: 5
+  m_Name: Scrollbar
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1936914297
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1936914296}
+  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: 1819336722}
+  m_Father: {fileID: 1141370595}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 1, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 20, y: 0}
+  m_Pivot: {x: 1, y: 1}
+--- !u!114 &1936914298
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1936914296}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 896342390}
+  m_HandleRect: {fileID: 896342389}
+  m_Direction: 2
+  m_Value: 0
+  m_Size: 0.2
+  m_NumberOfSteps: 0
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!114 &1936914299
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1936914296}
+  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: 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 &1936914300
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1936914296}
+  m_CullTransparentMesh: 1
+--- !u!1 &1946863618
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1946863619}
+  - component: {fileID: 1946863620}
+  m_Layer: 5
+  m_Name: Btn1
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1946863619
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1946863618}
+  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: 1588263171}
+  - {fileID: 577700188}
+  - {fileID: 228594326}
+  - {fileID: 1289810228}
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  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 &1946863620
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1946863618}
+  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: 0
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 1
+  m_ChildForceExpandHeight: 0
+  m_ChildControlWidth: 1
+  m_ChildControlHeight: 0
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+  m_ReverseArrangement: 0
+--- !u!1 &2001504855
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2001504858}
+  - component: {fileID: 2001504857}
+  - component: {fileID: 2001504856}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!81 &2001504856
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2001504855}
+  m_Enabled: 1
+--- !u!20 &2001504857
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2001504855}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 2
+  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+  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: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 1
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 1
+  m_AllowMSAA: 1
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!4 &2001504858
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2001504855}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &2004094255
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2004094256}
+  - component: {fileID: 2004094258}
+  - component: {fileID: 2004094257}
+  m_Layer: 5
+  m_Name: CameraImage1
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2004094256
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2004094255}
+  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: 1220810728}
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 6
+  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: 191}
+  m_SizeDelta: {x: 720, y: 420}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2004094257
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2004094255}
+  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 &2004094258
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2004094255}
+  m_CullTransparentMesh: 1
+--- !u!1 &2011614146
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2011614147}
+  m_Layer: 5
+  m_Name: Content
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2011614147
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2011614146}
+  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: 85546310}
+  m_Father: {fileID: 5125265}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 50}
+  m_Pivot: {x: 0.5, y: 1}
+--- !u!1 &2101632895
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2101632896}
+  - component: {fileID: 2101632898}
+  - component: {fileID: 2101632897}
+  m_Layer: 5
+  m_Name: CameraImage0
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2101632896
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2101632895}
+  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: 1759782642}
+  - {fileID: 1361341703}
+  - {fileID: 1793996698}
+  - {fileID: 681002957}
+  - {fileID: 1922585532}
+  - {fileID: 1765021459}
+  - {fileID: 1337472477}
+  m_Father: {fileID: 1867793102}
+  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: -780, y: 191}
+  m_SizeDelta: {x: 720, y: 420}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2101632897
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2101632895}
+  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 &2101632898
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2101632895}
+  m_CullTransparentMesh: 1
+--- !u!1 &1740452459998223282
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1740452459998223283}
+  m_Layer: 5
+  m_Name: CameraMask
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1740452459998223283
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1740452459998223282}
+  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: 4444241363306702546}
+  m_Father: {fileID: 682249273}
+  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!1001 &2414034270426155791
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    m_TransformParent: {fileID: 588275179}
+    m_Modifications:
+    - target: {fileID: 2414034268525707325, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_Value
+      value: 0.4
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268525707325, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_MinValue
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268525707325, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_OnValueChanged.m_PersistentCalls.m_Calls.Array.size
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_Pivot.x
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_Pivot.y
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_RootOrder
+      value: 2
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchorMax.x
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchorMax.y
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchorMin.x
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchorMin.y
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_SizeDelta.x
+      value: 100
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_SizeDelta.y
+      value: 100
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchoredPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchoredPosition.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336503, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268613336504, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_Name
+      value: SliderSetting
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268628162293, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchorMax.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268628162293, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchorMax.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034268628162293, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchorMin.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034269388536352, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchorMax.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2414034269388536352, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+      propertyPath: m_AnchorMax.y
+      value: 0
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: b9f12e22b4f19a24ab8ad4a1cf90cbc0, type: 3}
+--- !u!114 &2452220216917731427
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7995440998307172228}
+  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!224 &3098480069149916812
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7995440998307172228}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 11
+  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: 15, y: -922}
+  m_SizeDelta: {x: 720, y: 420}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &4444241363306702544
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4444241363306702547}
+  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: 1}
+  m_RaycastTarget: 0
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: f3b60078f3450d1459d9642ca6404c7d, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 0
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!224 &4444241363306702546
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4444241363306702547}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1740452459998223283}
+  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!1 &4444241363306702547
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4444241363306702546}
+  - component: {fileID: 4444241363306702551}
+  - component: {fileID: 4444241363306702544}
+  m_Layer: 5
+  m_Name: PixelCheaker
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!222 &4444241363306702551
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4444241363306702547}
+  m_CullTransparentMesh: 1
+--- !u!1 &7995440998307172228
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3098480069149916812}
+  - component: {fileID: 8554853341612612686}
+  - component: {fileID: 2452220216917731427}
+  m_Layer: 5
+  m_Name: CameraImage7
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!222 &8554853341612612686
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7995440998307172228}
+  m_CullTransparentMesh: 1

+ 7 - 0
Assets/InfraredProject/WebCamera/Sample/SampleWebCamera.unity.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ce5f926e3c2bc3442aac3c8b9b664cee
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 2 - 1
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/Dbscan/DbscanPoint.cs

@@ -1,4 +1,5 @@
-using UnityEngine;
+using o0InfraredLocate.ZIM;
+using UnityEngine;
 using ZIM;
 
 namespace DbscanImplementation

+ 0 - 844
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredLocate.cs

@@ -1,844 +0,0 @@
-using DbscanImplementation;
-using o0;
-using o0.Project;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.Serialization.Formatters;
-using System.Threading.Tasks;
-using UnityEngine;
-using UnityEngine.UI;
-using ZIM.Unity;
-using Color = UnityEngine.Color;
-using Debug = UnityEngine.Debug;
-
-namespace ZIM
-{
-    //class DescendingComparer<T> : IComparer<T>
-    //{
-    //    public int Compare(T x, T y)
-    //    {
-    //        return Comparer<T>.Default.Compare(y, x);
-    //    }
-    //}
-
-    public enum InfraredMatch
-    {
-        Nomatch = 0,
-        Match0 = 1,
-        Match1 = 2
-    }
-
-    // 支持2个红外点的识别
-    public class InfraredLocate
-    {
-        public static object locker = new object();
-
-        public static List<InfraredMatch> GetMatches(InfraredMatch im)
-        {
-            List<InfraredMatch> positions = new List<InfraredMatch>();
-            InfraredMatch bit = InfraredMatch.Match0;
-            while (bit <= im)
-            {
-                if ((im & bit) != 0)
-                {
-                    positions.Add(bit);
-                }
-                bit = (InfraredMatch)((int)bit << 1);
-            }
-            return positions;
-        }
-
-        readonly float[] spotBrightness = new float[] { 0.93f, 0.5f };      // 亮点阈值
-        int samplingScale = 1;
-        //const float circleVariance = 30f;
-        //const int brightAreaRadius = 30; 
-        //const int LeastBrightPoint = 10000;
-
-        SLAMUVC.UVCManager.CameraInfo mCameraInfo;
-        ScreenIdentification screenIdentification;
-        InfraredSpotSettings infraredSpotSettings;
-        //KMeans kMeans;
-        PixelCheaker ScreenPixelCheaker;
-
-        InfraredSpot[] InfraredSpots;
-        public InfraredSpot GetSpot(InfraredMatch match)
-        {
-            switch (match)
-            {
-                case InfraredMatch.Match0:
-                    return InfraredSpots[0];
-                case InfraredMatch.Match1:
-                    return InfraredSpots[1];
-                default:
-                    return null;
-            }
-        }
-
-        // 参数是 红外灯的亮度阈值,阈值越小能够检测到的亮度就越低
-        public void SetBrightnessThreshold(float brightnessThreshold = 0.93f)
-        {
-            spotBrightness[0] = brightnessThreshold; spotBrightness[1] = (float)Math.Min(Math.Exp(1.5 * brightnessThreshold - 1.8), brightnessThreshold);       // 周围泛光的亮度用指数函数直接算
-        }
-
-        public InfraredLocate(SLAMUVC.UVCManager.CameraInfo cameraInfo, ScreenIdentification infraredIdentification, InfraredSpotSettings infraredSpotSettings, PixelCheaker screenPixelCheaker)
-        {
-            this.mCameraInfo = cameraInfo;
-            this.screenIdentification = infraredIdentification;
-            this.infraredSpotSettings = infraredSpotSettings;
-            this.ScreenPixelCheaker = screenPixelCheaker;
-
-            //this.kMeans = new KMeans();
-            //samplingScale = 2;
-        }
-
-        readonly int CheakFrame = 10;
-
-        bool Infrared12Overlap = false;
-        int cheakCounter = 0;
-
-        public InfraredSpot[] UpdateSingle(Color[] cameraPixels)
-        {
-            // Debug.Log(cameraPixels.Length + ",  " + screenIdentification.Screen.QuadRect + " -----------------");
-            var spotArea = LocateToScreen(cameraPixels, screenIdentification.Screen.QuadRect);
-            return MatchInfraredRaySingle(spotArea);
-        }
-
-        // New, 通过透视映射计算红外点的相对位置, 返回的红外点根据半径 从大到小排序
-        public InfraredSpot[] Update(Color[] cameraPixels)
-        {
-            var spotArea = LocateToScreen(cameraPixels, screenIdentification.Screen.QuadRect);
-            return MatchInfraredRay(spotArea);
-        }
-
-        // New, 返回由大到小排序的点
-        public List<PixelSpotArea> LocateToScreen(Color[] pixels, Rect rect)
-        {
-            if (!screenIdentification.Screen.Active)
-                rect = new Rect(0, 0, screenIdentification.Size.x, screenIdentification.Size.y);
-
-            if (InfraredSpots == null)
-            {
-                InfraredSpots = new InfraredSpot[2] {
-                new InfraredSpot(screenIdentification.Screen, InfraredMatch.Match0),
-                new InfraredSpot(screenIdentification.Screen, InfraredMatch.Match1) };
-            }
-
-            //var watch = new System.Diagnostics.Stopwatch();
-            //watch.Start();
-            //var times = new List<double>() { 0.0 };
-
-            (int x, int y) rectMin = ((int)rect.min.x / samplingScale, (int)rect.min.y / samplingScale);
-            (int x, int y) rectMax = ((int)rect.max.x / samplingScale, (int)rect.max.y / samplingScale);
-
-            var spotPoint = new List<Vector2>(200);     // 预估的初始容量
-            var brightPoint = new List<Vector2>(1000);
-
-            Parallel.For(rectMin.x, rectMax.x, (i) =>
-            {
-                var points0 = new List<Vector2>(rectMax.y - rectMin.y);
-                var points1 = new List<Vector2>(rectMax.y - rectMin.y);
-                for (int j = rectMin.y; j < rectMax.y; j++)
-                {
-                    int ip = i * samplingScale;
-                    int jp = j * samplingScale;
-
-                    if (!screenIdentification.Screen.Active && ScreenPixelCheaker.OutArea2D(new Vector2(ip, jp), screenIdentification.Size))
-                        continue;
-
-                    var index = mCameraInfo.CoordToIndex(ip, jp);
-                    //var b = brightness[index];
-                    //var b = (int)Math.Round(ConvBrightness(brightness, (ip, jp)));
-                    var b = pixels[index].Brightness();
-
-                    if (b > spotBrightness[0])
-                    {
-                        points0.Add(new Vector2(ip, jp));
-                    }
-                    else if (b > spotBrightness[1])
-                    {
-                        points1.Add(new Vector2(ip, jp));
-                    }
-                }
-                lock (spotPoint)
-                {
-                    spotPoint.AddRange(points0);
-                    brightPoint.AddRange(points1);
-                }
-            });
-
-            //if (ScreenLocate.Main.DebugOnZIMDemo)
-            //{
-            //    if (spotPoint.Count > 400)     // 如果亮点太多,控制亮点数量在200左右
-            //    {
-            //        samplingScale = (int)Math.Ceiling(samplingScale * Math.Sqrt(spotPoint.Count / 400.0));
-            //        return new List<PixelSpotArea>();
-            //    }
-            //    else if (samplingScale > 1 && spotPoint.Count < 100)
-            //    {
-            //        samplingScale = Math.Max((int)Math.Ceiling(samplingScale * Math.Sqrt(spotPoint.Count / 200.0)), 1);
-            //        return new List<PixelSpotArea>();
-            //    }
-            //}
-
-            //times.Add(watch.ElapsedMilliseconds);
-            //UnityEngine.Debug.Log("time1: " + (times[times.Count - 1] - times[times.Count - 2]));
-
-            // 所有点映射到屏幕空间
-            Parallel.For(0, spotPoint.Count, (i) => spotPoint[i] = screenIdentification.Screen.TransformToScreen(spotPoint[i]));
-            Parallel.For(0, brightPoint.Count, (i) => brightPoint[i] = screenIdentification.Screen.TransformToScreen(brightPoint[i]));
-
-            // 筛掉屏幕外的点
-            var temp0 = new List<Vector2>(spotPoint.Count);
-            var temp1 = new List<Vector2>(spotPoint.Count);
-            foreach (var p in spotPoint)
-            {
-                if (screenIdentification.Screen.UVInScreen(p))
-                    temp0.Add(p);
-            }
-            foreach (var p in brightPoint)
-            {
-                if (screenIdentification.Screen.UVInScreen(p))
-                    temp1.Add(p);
-            }
-            spotPoint = temp0;
-            brightPoint = temp1;
-
-            if (spotPoint.Count > 0)
-            {
-                //times.Add(watch.ElapsedMilliseconds);
-                //UnityEngine.Debug.Log("time2: " + (times[times.Count - 1] - times[times.Count - 2]));
-
-                //var db = Dbscan.Run(spotPoint, ZIM.Unity.ZIMMath.LengthManhattan, samplingScale * 2, 3);
-                //var spotArea = DbscanToSpotAreas(db, brightPoint);
-                var spotArea = PixelSpotArea.Cluster(spotPoint, brightPoint, screenIdentification.Screen.UVInScreen);
-
-                if (ScreenLocate.Main.DebugOnZIMDemo)
-                    DebugAreas(spotArea);
-
-
-                //Debug.Log("db: " + db.Clusters.Count);
-                //Debug.Log("db noise: " + db.Noise.Count);
-                //foreach (var i in spotArea)
-                //{
-                //    Debug.Log("i.Radius" + i.Radius);
-                //}
-
-                //times.Add(watch.ElapsedMilliseconds);
-                //UnityEngine.Debug.Log("time3: " + (times[times.Count - 1] - times[times.Count - 2]));
-
-                return spotArea;
-
-                //半径再按透视修正一遍,降低一点常规角度下反射的影响
-                foreach (var i in spotArea)
-                {
-                    var r0 = i.Radius / 2 / mCameraInfo.CurrentWidth;
-                    var center = i.Centroid;
-                    var offset1 = center + new Vector2(i.Radius / 2, 0);
-                    var offset2 = center - new Vector2(i.Radius / 2, 0);
-                    var offset3 = center + new Vector2(0, i.Radius / 2);
-                    var offset4 = center - new Vector2(0, i.Radius / 2);
-                    var transR = ((screenIdentification.Screen.TransformToScreen(offset1) - screenIdentification.Screen.TransformToScreen(offset2)).magnitude +
-                        (screenIdentification.Screen.TransformToScreen(offset3) - screenIdentification.Screen.TransformToScreen(offset4)).magnitude) / 4;
-                    var r1 = transR / screenIdentification.Screen.UVSize.x;
-                    //Debug.Log(r1 / r0);
-                    i.Radius *= (float)Math.Pow(r1 / r0, 2);      // 摄像机位置不同参数也可能不同
-                }
-
-                //if (spotArea.Count == 1)
-                //Debug.Log($"{spotArea[0].MaxRadius}");
-
-                return spotArea;
-
-                //// 排序亮区
-                //spotArea.Sort((a, b) => b.MaxRadius.CompareTo(a.MaxRadius));
-                ////var areas = new SortedList<float, PixelSpotArea>(new DescendingComparer<float>());
-                ////foreach (var i in spotArea)
-                ////    areas.Add(i.MaxRadius, i);
-
-                //var result = new Vector2[spotArea.Count];
-                //foreach (var i in spotArea.Index())
-                //    result[i] = spotArea[i].Center;
-
-                //times.Add(watch.ElapsedMilliseconds);
-                //UnityEngine.Debug.Log("time6: " + (times[times.Count - 1] - times[times.Count - 2]));
-
-                //return result;
-            }
-
-            return new List<PixelSpotArea>();
-        }
-
-        private void DebugAreas(List<PixelSpotArea> areas)
-        {
-            ScreenLocate.Main.Info.transform.GetChild(0).GetComponent<Text>().text = $"areas.Count: {areas.Count}";
-            PixelSpotArea a0 = null;  // 表示最大半径的区域
-            PixelSpotArea a1 = null;  // 表示第二大半径的区域
-
-            foreach (var a in areas)
-            {
-                if (a0 == null || a.Radius > a0.Radius)
-                {
-                    a1 = a0;  // 更新第二大为之前最大
-                    a0 = a;   // 更新最大为当前的
-                }
-                else if (a1 == null || a.Radius > a1.Radius)
-                {
-                    a1 = a;   // 更新第二大
-                }
-            }
-
-            Texture2D texture = new Texture2D(ScreenLocate.Main.CameraSize.x, ScreenLocate.Main.CameraSize.y);
-            Color[] blackPixels = new Color[texture.width * texture.height];
-            for (int i = 0; i < blackPixels.Length; i++)
-                blackPixels[i] = Color.black;
-            texture.SetPixels(blackPixels);
-
-            if (a0 != null)
-            {
-                foreach (var p in a0.Pixels0)
-                    texture.SetPixel((int)p.x, (int)p.y, Color.yellow);
-                foreach (var p in a0.Pixels1)
-                    texture.SetPixel((int)p.x, (int)p.y, Color.white);
-            }
-            if (a1 != null)
-            {
-                foreach (var p in a1.Pixels0)
-                    texture.SetPixel((int)p.x, (int)p.y, Color.green);
-                foreach (var p in a1.Pixels1)
-                    texture.SetPixel((int)p.x, (int)p.y, Color.blue);
-            }
-
-            texture.Apply();
-            ScreenLocate.DebugTexture(6, texture);
-        }
-
-        private List<PixelSpotArea_DbScan> DbscanToSpotAreas(DbscanResult<Vector2> db, List<Vector2> brightPoint)
-        {
-            if (db.Clusters.Count == 0)
-                return new List<PixelSpotArea_DbScan>();
-
-            // 用dbscan的结果创建SpotArea,先用高亮区算一遍半径
-            var clusters = new List<PixelSpotArea_DbScan>();
-            var areaIncludeRadius = new List<(Vector2, float)>();
-            foreach (var i in db.Clusters.Values)
-            {
-                var area = new PixelSpotArea_DbScan(i);
-                areaIncludeRadius.Add((area.Centroid, area.Radius));
-                clusters.Add(area);
-            }
-            foreach (var i in db.Noise)
-                areaIncludeRadius.Add((i.Feature, 0));
-
-            // 将泛光点添加到最近的area
-            foreach (var i in brightPoint)
-            {
-                var index = FindNearestAreaIndex(i, areaIncludeRadius);
-                if (index < clusters.Count)
-                    clusters[index].Add1(i);
-            }
-            // 添加了泛光点后,重新计算半径
-            foreach (var i in clusters)
-                i.Radius = i.CalculateRadius();
-
-            return clusters;
-        }
-
-        private int FindNearestAreaIndex(Vector2 a, List<(Vector2, float)> areas)
-        {
-            if (areas == null || areas.Count == 0)
-                return -1;
-
-            int nearestIndex = 0;
-            float nearestDistance = Vector2.Distance(a, areas[0].Item1) - areas[0].Item2;
-
-            for (int i = 1; i < areas.Count; i++)
-            {
-                float distance = Vector2.Distance(a, areas[i].Item1) - areas[i].Item2;
-                if (distance < nearestDistance)
-                {
-                    nearestDistance = distance;
-                    nearestIndex = i;
-                }
-            }
-            return nearestIndex;
-        }
-
-        InfraredSpot[] MatchInfraredRaySingle(List<PixelSpotArea> spotArea)
-        {
-            var matchedArea = new Dictionary<InfraredMatch, PixelSpotArea>() { { InfraredMatch.Match0, null } };
-            var v0 = InfraredSpots[0].Verify(spotArea, matchedArea);
-
-            if (v0)
-            {
-                // 每隔20帧检查异常
-                //if (++cheakCounter >= CheakFrame)
-                //{
-                //    var maxArea = spotArea.Max((a, b) => a.Radius.CompareTo(b.Radius));
-                //    cheakCounter = 0;
-                //    if (matchedArea[InfraredMatch.Match0] != maxArea)
-                //    {
-                //        InfraredSpots[0].Reset();       // 防止异常
-                //    }
-                //}
-            }
-            else
-            {
-                if (spotArea.Count > 0)
-                {
-                    matchedArea[InfraredMatch.Match0] = spotArea.Max((a, b) => a.Radius.CompareTo(b.Radius));
-                }
-            }
-
-            foreach (var i in matchedArea)
-                GetSpot(i.Key).Update(i.Value);
-
-            return InfraredSpots;
-        }
-
-        InfraredSpot[] MatchInfraredRay(List<PixelSpotArea> spotArea)
-        {
-            var matchedArea = new Dictionary<InfraredMatch, PixelSpotArea>() { { InfraredMatch.Match0, null }, { InfraredMatch.Match1, null } };
-            var v0 = InfraredSpots[0].Verify(spotArea, matchedArea);
-            var v1 = InfraredSpots[1].Verify(spotArea, matchedArea);
-
-            if (!Infrared12Overlap)
-            {
-                if (!v0 && !v1)
-                {
-                    //Application.targetFrameRate = 1;
-                    //Debug.Log($"{Time.time}全失败 spotArea {spotArea.Count}");
-                    if (spotArea.Count == 0)
-                    {
-                        //InfraredSpots[0].UpdateByPredict();
-                        //InfraredSpots[1].UpdateByPredict();
-                    }
-                    else if (spotArea.Count == 1)
-                    {
-                        if (InfraredSpots[0].Predict != null && InfraredSpots[1].Predict == null)
-                        {
-                            matchedArea[InfraredMatch.Match0] = spotArea[0];
-                            //InfraredSpots[0].Update(spotArea[0]);
-                            //InfraredSpots[1].UpdateByPredict();
-                        }
-                        else if (InfraredSpots[1].Predict != null && InfraredSpots[0].Predict == null)
-                        {
-                            matchedArea[InfraredMatch.Match1] = spotArea[0];
-                        }
-                        else
-                        {
-                            if (spotArea[0].Radius > infraredSpotSettings.RadiusThreshold)
-                            {
-                                matchedArea[InfraredMatch.Match0] = spotArea[0];
-                            }
-                            else
-                            {
-                                matchedArea[InfraredMatch.Match1] = spotArea[0];
-                            }
-                        }
-                    }
-                    else
-                    {
-                        spotArea.Sort((a, b) => b.Radius.CompareTo(a.Radius));                    // 排序亮区
-                        matchedArea[InfraredMatch.Match0] = spotArea[0];
-                        matchedArea[InfraredMatch.Match1] = spotArea[1];
-                    }
-                }
-                else
-                {
-                    PixelSpotArea select = null;
-                    PixelSpotArea selectOther = null;
-                    InfraredMatch oneFailed = InfraredMatch.Nomatch;
-                    if (!v0)
-                    {
-                        select = matchedArea[InfraredMatch.Match1];
-                        //InfraredSpots[1].Update(select);
-                        oneFailed = InfraredMatch.Match0;
-                    }
-                    else if (!v1)
-                    {
-                        select = matchedArea[InfraredMatch.Match0];
-                        //InfraredSpots[0].Update(select);
-                        oneFailed = InfraredMatch.Match1;
-                    }
-
-                    if (oneFailed != InfraredMatch.Nomatch)
-                    {
-                        //Debug.LogWarning($"{Time.time}成功1个 {oneFailed}");
-                        spotArea.Sort((a, b) => b.Radius.CompareTo(a.Radius));                        // 排序亮区
-                        foreach (var i in spotArea)
-                        {
-                            if (i != select)
-                            {
-                                selectOther = i;
-                                break;
-                            }
-                        }
-                        matchedArea[oneFailed] = selectOther;
-                        //if (selectOther == null)
-                        //{
-                        //    GetSpot(oneFailed).UpdateByPredict();
-                        //}
-                        //else
-                        //{
-                        //    GetSpot(oneFailed).Update(selectOther);
-                        //}
-                    }
-                    else
-                    {
-                        //Debug.LogWarning($"{Time.time}成功2个");
-                        if (matchedArea[InfraredMatch.Match0] == matchedArea[InfraredMatch.Match1])
-                        {
-                            // 重叠
-                            Infrared12Overlap = true;
-                            //if (spotArea.Count == 1)
-                            //{
-                            //    Infrared12Overlap = true;
-
-                            //    InfraredSpots[0].Update(spotArea[0]);
-                            //    InfraredSpots[1].UpdateByPredict();
-                            //    return InfraredSpots;
-                            //}
-                            //else
-                            //{
-                            //    Infrared12Overlap = false;
-                            //    spotArea.Sort((a, b) => b.Radius.CompareTo(a.Radius));                    // 排序亮区
-                            //    InfraredSpots[0].Update(spotArea[0]);
-                            //    InfraredSpots[1].Update(spotArea[1]);
-                            //}
-                        }
-                        else //if (matchedArea[InfraredMatch.Match1] != matchedArea[InfraredMatch.Match2])
-                        {
-                            //Infrared12Overlap = false;
-                            //InfraredSpots[0].Update(matchedArea[InfraredMatch.Match0]);
-                            //InfraredSpots[1].Update(matchedArea[InfraredMatch.Match1]);
-
-                            // 每隔20帧更新阈值
-                            if (++cheakCounter >= CheakFrame)
-                            {
-                                //Debug.Log($"{Time.time}更新阈值2个");
-                                var middle = (matchedArea[InfraredMatch.Match0].Radius + matchedArea[InfraredMatch.Match1].Radius) / 2;
-                                infraredSpotSettings.UpdateThreshold(middle);
-                                cheakCounter = 0;
-                                if (matchedArea[InfraredMatch.Match0].Radius < middle)
-                                {
-                                    //Debug.Log($"{Time.time}大小异常");
-                                    InfraredSpots[0].Reset();       // 防止异常
-                                    InfraredSpots[1].Reset();
-                                }
-                            }
-                        }
-                    }
-
-                }
-            }
-
-            if (Infrared12Overlap)
-            {
-                if (v0)
-                {
-                    var overlapAera = matchedArea[InfraredMatch.Match0];
-                    (PixelSpotArea, float) split = (null, float.MaxValue);
-                    foreach (var i in spotArea)
-                    {
-                        if (i != overlapAera)
-                        {
-                            var distance = (i.Centroid - overlapAera.Centroid).magnitude;
-                            if (distance < overlapAera.Radius * 2 && distance < split.Item2)
-                            {
-                                split = (i, distance);
-                            }
-                        }
-                    }
-                    if (split.Item1 != null)
-                    {
-                        //InfraredSpots[0].Update(overlapAera);
-                        //InfraredSpots[1].Update(split.Item1);
-                        matchedArea[InfraredMatch.Match1] = split.Item1;
-                        InfraredSpots[1].Disappear = false;
-                        Infrared12Overlap = false;
-                    }
-                    else
-                    {
-                        if ((InfraredSpots[1].Predict.Value - overlapAera.Centroid).magnitude > overlapAera.Radius / 2)
-                            InfraredSpots[1].Disappear = true;
-
-                        //InfraredSpots[0].Update(overlapAera);
-                        if (InfraredSpots[1].Predict == null || InfraredSpots[1].Disappear)
-                        {
-                            //InfraredSpots[1].Update(overlapAera);
-                            matchedArea[InfraredMatch.Match1] = overlapAera;
-                            InfraredSpots[1].Predict = null;
-                        }
-                        else
-                        {
-                            matchedArea[InfraredMatch.Match1] = null;
-                            //InfraredSpots[1].UpdateByPredict();
-                        }
-
-                        //if (++cheakCounter >= 20 * cheakFrame)
-                        //{
-                        //    cheakCounter = 0;
-                        //    InfraredSpots[1].Reset();
-                        //    Infrared12Overlap = false;
-                        //}
-                    }
-                }
-                else
-                {
-                    //InfraredSpots[0].UpdateByPredict();
-                    //InfraredSpots[1].UpdateByPredict();
-                    matchedArea[InfraredMatch.Match1] = null;
-                }
-            }
-
-            foreach (var i in matchedArea)
-                GetSpot(i.Key).Update(i.Value);
-
-            return InfraredSpots;
-        }
-
-        // 亮度图是64位整形,返回卷积后的均值是float
-        float ConvBrightness(int[] pixels, (int x, int y) point, int kernel_size = 3)
-        {
-            var sum = 0f;
-            for (int i = point.x - kernel_size / 2; i <= point.x + kernel_size / 2; i++)
-            {
-                for (int j = point.y - kernel_size / 2; j <= point.y + kernel_size / 2; j++)
-                {
-                    var index = mCameraInfo.CoordToIndex(i, j);
-                    if (index > 0 && index < pixels.Length)       // 超出边缘不计算
-                        sum += pixels[index];
-                }
-            }
-            return sum / (kernel_size * kernel_size);
-        }
-
-        public List<Vector2> GetOld(int[] brightness)        // 取整后的亮度图
-        {
-            return LocateOld(brightness, new Rect(0, 0, mCameraInfo.CurrentWidth, mCameraInfo.CurrentHeight));
-        }
-        public List<Vector2> LocateOld(int[] brightness, Rect rect)
-        {
-            var brightPixelDic = new Dictionary<float, List<Vector2>>();
-            (int x, int y) origin = ((int)rect.min.x + 1, (int)rect.min.y + 1);
-            Parallel.For(origin.x / samplingScale, (origin.x + (int)rect.width) / samplingScale, (i) =>
-            {
-                for (int j = origin.y / samplingScale; j < (origin.y + rect.height) / samplingScale; j++)
-                {
-                    int ip = i * samplingScale;
-                    int jp = j * samplingScale;
-                    var index = mCameraInfo.CoordToIndex(ip, jp);
-                    //var b = brightness[index];
-                    //var b = (int)Math.Round(ConvBrightness(brightness, (ip, jp)));
-                    var b = ConvBrightness(brightness, (ip, jp), 3);
-
-                    if (b > 32)
-                    {
-                        lock (brightPixelDic)
-                        {
-                            if (brightPixelDic.TryGetValue(b, out List<Vector2> list))
-                                list.Add(new Vector2(ip, jp));
-                            else
-                                brightPixelDic.Add(b, new List<Vector2> { new Vector2(ip, jp) });
-                        }
-                    }
-                }
-            });
-
-            //Parallel.For(0, pixels.Length / 7, (i) =>
-            //{
-            //    i = i * 7;
-            //    var b = getBrightness(pixels[i]);
-            //    if (b >= maxBrightness)
-            //    {
-            //        lock (brightSpots)
-            //        {
-            //            if (b != maxBrightness)
-            //                brightSpots.Clear();
-            //            brightSpots.Add(indexToVector2(i));
-            //        }
-            //        maxBrightness = b;
-            //    }
-            //});
-
-            if (brightPixelDic.Count > 0)
-            {
-                // 取亮度最高的像素
-                var keys = brightPixelDic.Keys.ToList();
-                var maxIndex = o0.o0.MaxIndex(keys);
-                //keys.Sort((a, b) => -a.CompareTo(b));
-                var brightPixels = new List<Vector2>();
-                for (int i = 0; i < Math.Min(1, keys.Count); i++)
-                    brightPixels.AddRange(brightPixelDic[keys[maxIndex]]);
-
-                //Debug.Log("max brightness: " + keys[maxIndex]);
-                //Debug.Log("brightPixels.Count: " + brightPixels.Count);
-
-                //var testTexture = new Texture2D((int)_textureSize.x, (int)_textureSize.y);
-                //testTexture.wrapMode = TextureWrapMode.Clamp;
-                //testTexture.filterMode = FilterMode.Point;
-                //foreach (var i in brightPixels)
-                //    testTexture.SetPixel((int)i.x, (int)i.y, Color.black);
-                //testTexture.Apply();
-                //testImage.texture = testTexture;
-
-                var brightArea = new List<PixelCircleArea>() { new PixelCircleArea(brightPixels.First()) };
-                for (int i = 1; i < brightPixels.Count; i++)
-                {
-                    var p = brightPixels[i];
-                    var grid = PixelArea.GetGrid(p);
-                    var join = new SortedList<int, PixelCircleArea>();
-                    for (int j = 0; j < brightArea.Count; j++)
-                    {
-                        var area = brightArea[j];
-                        if (area.Include(grid))
-                            join.Add(j, area);
-                    }
-                    if (join.Count == 0)
-                        brightArea.Add(new PixelCircleArea(p));
-                    else if (join.Count == 1)
-                        join.First().Value.Add(p, grid);
-                    else
-                    {
-                        var combine = new PixelCircleArea(join.Values);
-                        combine.Add(p, grid);
-                        brightArea.Add(combine);
-                        for (int j = join.Count - 1; j >= 0; j--)
-                            brightArea.RemoveAt(join.ElementAt(j).Key);
-                    }
-
-                    //foreach (var j in brightArea)
-                    //{
-                    //    var offset = (p - j.Center);
-                    //    if (offset.magnitude < brightAreaRadius)     // 距离近的并入该区域
-                    //    {
-                    //        j.Pixels.Add(p);
-                    //        j.Center += offset / j.Pixels.Count;
-                    //        join = true;
-                    //        break;
-                    //    }
-                    //}
-                    //if (!join)
-                    //    brightArea.Add(new PixelArea(p));
-                }
-
-                //var sum = new Vector2(0, 0);
-                //foreach (var i in brightPixels)
-                //{
-                //    sum += i;
-                //}
-                //var middle = sum/brightPixels.Count;
-                //Debug.Log("brightArea.Count: " + brightArea.Count);
-
-                //if (brightArea.Count <= 1)
-                //    return brightArea.FirstOrDefault().Center;
-
-                //PixelArea maxBrightArea = brightArea.First();
-                //float maxCircleBrightness = 10000f;
-                var CircleAreas = new List<PixelCircleArea>();
-
-                for (int i = 0; i < brightArea.Count; i++)
-                {
-                    var area = brightArea[i];
-                    var value = area.CircleBrightness(out float variance, brightness, ConvBrightness, 3);
-                    //Debug.Log(counter + "Variance: " + variance);
-                    //Debug.Log(counter + "CircleBrightness: " + value);
-                    //Debug.Log(counter + "CircleRadius: " + area.MaxRadius);
-
-                    if (variance < 30)
-                    {
-                        CircleAreas.Add(area);
-                    }
-
-                    //if (maxCircleBrightness == 10000f) 
-                    //{
-                    //    maxCircleBrightness = value;
-                    //    maxBrightArea = area;
-                    //}
-                    //else if (maxCircleBrightness < value || (maxCircleBrightness == value && area.Pixels.Count > maxBrightArea.Pixels.Count)) 
-                    //{
-                    //    maxCircleBrightness = value;
-                    //    maxBrightArea = area;
-                    //}
-                }
-                //Debug.Log("CricleBrightness: " + maxCircleBrightness);
-
-                //Debug.Log(counter + "CircleAreas: " + CircleAreas.Count);
-                //counter++;
-                if (CircleAreas.Count == 0)
-                    return null;
-                if (CircleAreas.Count == 1)
-                    return new List<Vector2> { CircleAreas[0].Center };
-
-                CircleAreas.Sort((a, b) => b.MaxRadius.CompareTo(a.MaxRadius));
-                return new List<Vector2> { CircleAreas[0].Center, CircleAreas[1].Center };
-            }
-
-            return null;
-        }
-
-        //(int max, int second) MaxAreaIndex(Color[] pixels, List<PixelArea> list)
-        //{
-        //    var maxValue = float.MinValue;
-        //    var secondValue = float.MinValue;
-        //    var max = 0;
-        //    var second = 0;
-        //    foreach (var i in list.Index())
-        //    {
-        //        var value = list[i].TotalBrightness(pixels, camera.Vector2ToIndex, samplingScale * 2);
-        //        if (value > maxValue)
-        //        {
-        //            maxValue = value;
-        //            max = i;
-        //        }
-        //        else if (maxValue > secondValue)
-        //        {
-        //            secondValue = value;
-        //            second = i;
-        //        }
-        //    }
-        //    return (max, second);
-        //}
-
-        //float CricleVariance(int[] pixels, PixelArea area, int kernel_size = 3)
-        //{
-        //    var hash = new HashSet<(int, int)>();
-        //    foreach (var (cos,sin) in angleMathList)
-        //    {
-        //        var x = (int)Math.Round(area.Center.x + (area.MaxRadius + PixelArea.gridLength * 4) * cos);
-        //        var y = (int)Math.Round(area.Center.y + (area.MaxRadius + PixelArea.gridLength * 4) * sin);
-        //        hash.Add((x, y));
-        //    }
-        //    var avg = 0f;
-        //    foreach (var p in hash)
-        //    {
-        //        var value = ConvBrightness(pixels, p, kernel_size);
-        //        avg += value;
-        //    }
-        //    return avg / hash.Count;
-        //}
-
-        //class PixelArea
-        //{
-        //    public static int gridLength;
-        //    public static (int x, int y) gridSize;
-        //    public static (int x, int y) GetGrid(Vector2 v)
-        //    {
-        //        var m = (int)(v.x / gridLength);
-        //        var n = (int)(v.y / gridLength);
-        //        return (m, n);
-        //    }
-
-        //    public Vector2 Center;
-        //    public List<Vector2> Pixels;
-
-        //    public PixelArea(Vector2 location)
-        //    {
-        //        this.Center = location;
-        //        this.Pixels = new List<Vector2> { location };
-        //    }
-        //}
-    }
-}
-

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredLocate.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: d121e97ab2cdd2140a87bec76e3761e9
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 163
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/InfraredSpot.cs

@@ -1,163 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using UnityEngine;
-using ZIM.Unity;
-using Color = UnityEngine.Color;
-
-namespace ZIM
-{
-    public class InfraredSpot
-    {
-        // 达到该数量才完成初始化
-        //static int InitCount = 5;
-        static int MaxVerifyFailLimit = 20;
-        public static float MinVerifyLength = 240;
-
-        public static void RefreshMinVerifyLength(o0.Geometry2D.Float.Vector cameraSize)
-        {
-            MinVerifyLength = (cameraSize.x + cameraSize.y) / 20;
-        }
-
-        // 返回null代表没有点,范围在[0, 1]内
-        public Vector2? ScreenUV
-        {
-            get
-            {
-                if (ScreenLocation.HasValue)
-                {
-                    return screenMap.UVNormalized(ScreenLocation.Value);
-                }
-                else
-                {
-                    return null;
-                }
-            }
-        }
-        // 范围在摄像机的Size内
-        public Vector2? CameraLocation
-        {
-            get
-            {
-                if (ScreenLocation.HasValue)
-                {
-                    return screenMap.TransformToCamera(ScreenLocation.Value);
-                }
-                else
-                    return null;
-            }
-        }
-        public Vector2? Predict { get; set; }        // 为null时代表未初始化
-        public InfraredMatch Match { get; private set; }
-
-        public bool Disappear;
-
-        //PixelSpotArea verifyArea;
-        int verifyFailLimit;
-
-        List<PixelSpotArea> spots;
-        SimpleLocationEstimation estimation;
-        Vector2? ScreenLocation;
-        ScreenMap screenMap;
-
-        public InfraredSpot(ScreenMap screenMap, InfraredMatch match)
-        {
-            this.screenMap = screenMap;
-            Match = match;
-            spots = new List<PixelSpotArea>();
-            Reset();
-        }
-
-        public void Reset()
-        {
-            spots.Clear();
-            estimation = new SimpleLocationEstimation(0.5f);
-            ScreenLocation = null;
-            Predict = null;
-            Disappear = false;
-            //verifyArea = null;
-            verifyFailLimit = MaxVerifyFailLimit;
-        }
-
-        public bool Verify(List<PixelSpotArea> areas, Dictionary<InfraredMatch, PixelSpotArea> matchedArea)
-        {
-            if (Predict == null)    // 未初始化
-                return false;
-
-            PixelSpotArea select = null;
-            var minLength = float.MaxValue;
-            var predict = Predict.Value;
-            var refPoint = (predict + spots.Last().Centroid) / 2;       // 用预测点和最后一个点的中点来判断是否追踪到
-            foreach (var i in areas)
-            {
-                var len = (i.Centroid - refPoint).magnitude;
-                if (len < MinVerifyLength)
-                {
-                    if (len < minLength)        // 找到追踪到的,并且距离最近的spot
-                    {
-                        select = i;
-                        minLength = len;
-                    }
-                }
-            }
-
-            if (select == null)
-            {
-                //Debug.Log(verifyFailLimit);
-                verifyFailLimit--;
-                if (verifyFailLimit == 0)
-                    Reset();
-                return false;
-            }
-
-            //verifyArea = select;
-            matchedArea[Match] = select;
-            return true;
-        }
-
-        //public void UpdateByVerifyArea()
-        //{
-        //    Update(verifyArea);
-        //}
-
-        // 为null时采用预测点
-        public void Update(PixelSpotArea area)
-        {
-            if (area == null)
-            {
-                //throw new System.Exception("[InfraredSpot] Update Wrong");
-                UpdateByPredict();
-                return;
-            }
-
-            var predict = estimation.Update(area.Centroid);
-            ScreenLocation = area.Centroid * 0.8f + predict * 0.2f;     // 参考一点预测点,防止光标不稳定
-            spots.Add(area);
-            if (spots.Count > 15)
-            {
-                Predict = predict;
-                spots.RemoveAt(0);
-            }
-        }
-
-        void UpdateByPredict()
-        {
-            if (spots.Count != 0)
-            {
-                if (Predict == null)         // 还未初始化,直接Reset
-                    Reset();
-                else
-                {
-                    // 采用预测点,但超出屏幕则Reset
-                    if (screenMap.UVInScreen(Predict.Value))
-                    {
-                        ScreenLocation = Predict;
-                        var newP = estimation.Update(Predict.Value);
-                        Predict = newP;
-                    }
-                    else
-                        Reset();
-                }
-            }
-        }
-    }
-}

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/InfraredSpot.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 5383e127ec9892b41aa44e6326b35da9
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 31
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/InfraredSpotSettings.cs

@@ -1,31 +0,0 @@
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-using Unity.VisualScripting;
-using UnityEngine;
-
-[CreateAssetMenu(fileName = "InfraredSpotSettings", menuName = "ScriptableObjects/InfraredSpotSettings", order = 1)]
-public class InfraredSpotSettings : ScriptableObject
-{
-    public float RadiusThreshold = 100f;      // 初始阈值参考价值不大,每个环境都不一样?
-
-    List<float> data;
-
-    public InfraredSpotSettings()
-    {
-        data = new List<float>(50);
-        data.AddRange(Enumerable.Repeat(RadiusThreshold, 3));
-    }
-    public void UpdateThreshold(float data)
-    {
-        var sum = RadiusThreshold * this.data.Count() + data;
-        if (this.data.Count >= 100)
-        {
-            sum -= this.data[0];
-            this.data.RemoveAt(0);
-        }
-        this.data.Add(data);
-
-        RadiusThreshold = sum / this.data.Count();
-    }
-}

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/InfraredSpotSettings.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: a02457a34811484449c5aea53ab9df1b
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 4 - 4
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/Old/KMeans.cs

@@ -14,7 +14,7 @@ namespace ZIM
         public System.Random Rand = new System.Random();
 
         // 用轮廓系数评价K值
-        public List<PixelSpotAreaOld> Cluster(List<Vector2> spotPoint, List<Vector2> brightPoint, InfraredCount spotMaxCount, Func<Vector2, bool> PointFilter = null)
+        public List<PixelSpotAreaOld> InfraredSpotCluster(List<Vector2> spotPoint, List<Vector2> brightPoint, int spotMaxCount, Func<Vector2, bool> PointFilter = null)
         {
             if (PointFilter != null)    // 筛掉屏幕外的点
             {
@@ -35,10 +35,10 @@ namespace ZIM
             }
 
             // 从1-k,计算多次聚类,再评估选出best k
-            List<PixelSpotAreaOld>[] ClustersArray = new List<PixelSpotAreaOld>[(int)spotMaxCount];   // 各个K对应的Clusters
-            float[] silhouetteScores = new float[(int)spotMaxCount];                    // 轮廓系数
+            List<PixelSpotAreaOld>[] ClustersArray = new List<PixelSpotAreaOld>[spotMaxCount];   // 各个K对应的Clusters
+            float[] silhouetteScores = new float[spotMaxCount];                    // 轮廓系数
 
-            for (int i = 0; i < (int)spotMaxCount; i++)
+            for (int i = 0; i < spotMaxCount; i++)
             {
                 int k = i + 1;
                 var clusters = Cluster(spotPoint, brightPoint, k);

+ 2 - 1
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/Old/PixelArea.cs

@@ -1,4 +1,5 @@
 using o0;
+using o0InfraredLocate.ZIM;
 using System;
 using System.Collections.Generic;
 using System.Threading.Tasks;
@@ -118,7 +119,7 @@ namespace ZIM
                     var b = pixels[index].Brightness(64);
                     t += b;
                 }
-                lock (InfraredLocate.locker)
+                lock (InfraredLocate.Locker)
                 {
                     total += t;
                 }

+ 2 - 1
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/Old/PixelSpotAreaOld.cs

@@ -1,5 +1,6 @@
 using o0;
 using o0.Num;
+using o0InfraredLocate.ZIM;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -110,7 +111,7 @@ namespace ZIM
                     var b = pixels[index].Brightness(64);
                     t += b;
                 }
-                lock (InfraredLocate.locker)
+                lock (InfraredLocate.Locker)
                 {
                     total += t;
                 }

+ 0 - 238
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/PixelSpotArea.cs

@@ -1,238 +0,0 @@
-using o0;
-using o0.Num;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using UnityEngine;
-using ZIM.Unity;
-using Color = UnityEngine.Color;
-
-namespace ZIM
-{
-    // 亮区的点用来定位(计算center),泛光区域的点用来计算radius
-    public class PixelSpotArea
-    {
-        //public static float gridRatio0 = 6f / 1280;
-        //public static float gridRatio1 = 20f / 720;
-
-        public static int gridLength0 = 2;      // 亮区
-        public static int gridLength1 = 10;     // 边缘泛光
-
-        public static (int x, int y) GetGrid0(Vector2 v)
-        {
-            var m = (int)(v.x / gridLength0);
-            var n = (int)(v.y / gridLength0);
-            return (m, n);
-        }
-
-        public static (int x, int y) GetGrid1(Vector2 v)
-        {
-            var m = (int)(v.x / gridLength1);
-            var n = (int)(v.y / gridLength1);
-            return (m, n);
-        }
-
-        // 亮点聚类到区域
-        public static List<PixelSpotArea> Cluster(List<Vector2> spotPoint, List<Vector2> brightPoint, Func<Vector2, bool> PointFilter = null)
-        {
-            var spotArea = new List<PixelSpotArea>();
-            for (int i = 0; i < spotPoint.Count; i++)
-            {
-                var p = spotPoint[i];
-                if (PointFilter != null && !PointFilter(p))        // 筛选是否在屏幕内
-                    continue;
-
-                var grid = PixelSpotArea.GetGrid0(p);
-                var join = new SortedList<int, PixelSpotArea>();
-                for (int j = 0; j < spotArea.Count; j++)
-                {
-                    var area = spotArea[j];
-                    if (area.Include0(grid))
-                        join.Add(j, area);
-                }
-                if (join.Count == 0)
-                    spotArea.Add(new PixelSpotArea(p, grid, PixelSpotArea.GetGrid1(p)));
-                else if (join.Count == 1)
-                    join.First().Value.Join(p, grid, PixelSpotArea.GetGrid1(p));
-                else
-                {
-                    var combine = new PixelSpotArea(join.Values);
-                    combine.Join(p, grid, PixelSpotArea.GetGrid1(p));
-                    spotArea.Add(combine);
-                    for (int j = join.Count - 1; j >= 0; j--)
-                        spotArea.RemoveAt(join.ElementAt(j).Key);
-                }
-            }
-
-            if (spotArea.Count != 0)
-            {
-                // brightPoint合并到区域中
-                for (int i = 0; i < brightPoint.Count; i++)
-                {
-                    var p = brightPoint[i];
-                    var grid = PixelSpotArea.GetGrid1(p);
-                    for (int j = 0; j < spotArea.Count; j++)
-                    {
-                        var area = spotArea[j];
-                        if (area.Include1(grid))
-                            area.Add(p);
-                    }
-                }
-            }
-
-            return spotArea;
-        }
-
-        Vector2 centroid = default;       // 该项目里center不可能等于0,0
-        public Vector2 Centroid
-        {
-            get
-            {
-                if (centroid != default)
-                    return centroid;
-
-                foreach (var p in Pixels0)
-                {
-                    centroid += p;
-                }
-                return centroid /= Pixels0.Count;
-            }
-        }
-        float radius = 0;
-        public float Radius
-        {
-            set
-            {
-                radius = value;
-            }
-            get
-            {
-                if (radius != 0)
-                    return radius;
-
-                //var radiusDic = new Dictionary<int, float>() { { 0, 0 }, { 45, 0 }, { 90, 0 }, { 135, 0 }, { 180, 0 }, { 225, 0 }, { 270, 0 }, { 315, 0 } };
-                var radiusDic = new float[8];
-                foreach (var p in Pixels0)
-                {
-                    var dir = p - Centroid;
-                    var radius = dir.magnitude;
-                    var degreeI = radius < 0.00001f ? 0 : (int)(dir.DegreeToXAxis() / 45);
-                    if (degreeI > 7) degreeI = 0;       // 防止正好360度
-
-                    if (radius > radiusDic[degreeI])
-                        radiusDic[degreeI] = radius;
-                }
-
-                foreach (var p in Pixels1)
-                {
-                    var dir = p - Centroid;
-                    var radius = dir.magnitude;
-                    var degreeI = radius < 0.00001f ? 0 : (int)(dir.DegreeToXAxis() / 45);
-                    if (degreeI > 7) degreeI = 0;
-
-                    if (radius > radiusDic[degreeI])
-                        radiusDic[degreeI] = radius;
-                }
-                return radius = radiusDic.Mean();
-            }
-        }
-
-        public List<Vector2> Pixels0;
-        public List<Vector2> Pixels1;
-
-        HashSet<(int, int)> grids0;
-        HashSet<(int, int)> grids1;
-
-        public PixelSpotArea(Vector2 location, (int, int) grid0, (int, int) grid1)
-        {
-            Pixels0 = new List<Vector2>(1000);       // 预估的初始容量
-            Pixels1 = new List<Vector2>(5000);
-            this.grids0 = new HashSet<(int, int)>();        // hashset如果设置了太大的容量会降低效率
-            this.grids1 = new HashSet<(int, int)>();
-            Join(location, grid0, grid1);
-        }
-
-        public PixelSpotArea(IList<PixelSpotArea> areas)
-        {
-            Pixels0 = new List<Vector2>(1000);
-            Pixels1 = new List<Vector2>(5000);
-            grids0 = new HashSet<(int, int)>();
-            grids1 = new HashSet<(int, int)>();
-            foreach (var a in areas)
-            {
-                Pixels0.AddRange(a.Pixels0);
-                grids0.AddRange(a.grids0);
-                grids1.AddRange(a.grids1);
-                //Center += a.Center * a.SpotPointCount;
-                //SpotPointCount += a.SpotPointCount;
-            }
-            //Center /= SpotPointCount;
-        }
-
-        public bool Include0((int, int) grid) => grids0.Contains(grid);
-        public bool Include1((int, int) grid) => grids1.Contains(grid);
-
-        public void Join(Vector2 point) => Join(point, GetGrid0(point), GetGrid1(point));
-        public void Join(Vector2 point, (int x, int y) grid0, (int x, int y) grid1)
-        {
-            Pixels0.Add(point);
-            //SpotPointCount++;
-            //Center += (point - Center) / SpotPointCount;
-            grids0.AddRange(new (int, int)[]
-            {
-                    (grid0.x + -1, grid0.y +  0) , (grid0.x + 1 , grid0.y + 0),
-                    (grid0.x + 1,  grid0.y + -1) , (grid0.x + -1, grid0.y + 1),
-                    (grid0.x + 0,  grid0.y + -1) , (grid0.x + 0 , grid0.y + 1),
-                    (grid0.x + -1, grid0.y + -1) , (grid0.x + 1 , grid0.y + 1),
-                    grid0
-            });
-            grids1.AddRange(new (int, int)[]
-            {
-                    (grid1.x + -1, grid1.y +  0) , (grid1.x + 1 , grid1.y + 0),
-                    (grid1.x + 1,  grid1.y + -1) , (grid1.x + -1, grid1.y + 1),
-                    (grid1.x + 0,  grid1.y + -1) , (grid1.x + 0 , grid1.y + 1),
-                    (grid1.x + -1, grid1.y + -1) , (grid1.x + 1 , grid1.y + 1),
-                    grid1
-            });
-        }
-
-        // 不再join之后,才可以用add添加周围泛光
-        public void Add(Vector2 point)
-        {
-            //var radius = (point - Center).LengthManhattan();
-            //if (radius > MaxRadius)
-            //    MaxRadius = radius;
-            Pixels1.Add(point);
-            //var radius = (point - Center).LengthManhattan();
-            //if (radius > MaxRadius)
-            //    MaxRadius = radius;
-        }
-
-        public float TotalBrightness(Color[] pixels, Func<int, int, int> Vector2ToIndex, int outer_size = 3)
-        {
-            (int x, int y) rectMin = ((int)(Centroid.x - Radius - outer_size), (int)(Centroid.y - Radius - outer_size));
-            (int x, int y) rectMax = ((int)(Centroid.x + Radius + outer_size), (int)(Centroid.y + Radius + outer_size));
-
-            var total = 0f;
-            Parallel.For(rectMin.x, rectMax.x, (i) =>
-            {
-                var t = 0;
-                for (int j = rectMin.y; j < rectMax.y; j++)
-                {
-                    var index = Vector2ToIndex(i, j);
-                    var b = pixels[index].Brightness(64);
-                    t += b;
-                }
-                lock (InfraredLocate.locker)
-                {
-                    total += t;
-                }
-            });
-            //total /= (rectMax.y - rectMin.y) * (rectMax.x - rectMin.x);
-
-            return total;
-        }
-    }
-
-}

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/PixelSpotArea.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 593e81f9469ce1d489c5b091cd129347
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 136
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/PixelSpotArea_DbScan.cs

@@ -1,136 +0,0 @@
-using o0;
-using o0.Num;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using UnityEngine;
-using ZIM.Unity;
-using static ScreenLocate;
-using Color = UnityEngine.Color;
-
-namespace ZIM
-{
-    public interface IPixel<T>
-    {
-        // 像素坐标点
-        T Point { get;}
-    }
-
-    // 亮区的点用来定位(计算center),泛光区域的点用来计算radius
-    public class PixelSpotArea_DbScan
-    {
-        // 中心
-        Vector2 centroid = default;       // 该项目里center不可能等于0,0
-        public Vector2 Centroid
-        {
-            get
-            {
-                if (centroid != default)
-                    return centroid;
-
-                foreach (var p in Pixels0)
-                    centroid += p.Point;
-                return centroid /= Pixels0.Count;
-            }
-        }
-
-        // 亮区的半径,计算含泛光点
-        float radius = 0;
-        public float Radius
-        {
-            set
-            {
-                radius = value;
-            }
-            get
-            {
-                if (radius != 0)
-                    return radius;
-
-                return radius = CalculateRadius();
-            }
-        }
-        public float CalculateRadius()
-        {
-            //var radiusDic = new Dictionary<int, float>() { { 0, 0 }, { 45, 0 }, { 90, 0 }, { 135, 0 }, { 180, 0 }, { 225, 0 }, { 270, 0 }, { 315, 0 } };
-            var radiusDic = new float[8];
-            foreach (var p in Pixels0)
-            {
-                var dir = p.Point - Centroid;
-                var radius = dir.magnitude;
-                var degreeI = radius < 0.00001f ? 0 : (int)(dir.DegreeToXAxis() / 45);
-                if (degreeI > 7) degreeI = 0;       // 防止正好360度
-
-                if (radius > radiusDic[degreeI])
-                    radiusDic[degreeI] = radius;
-            }
-
-            foreach (var p in Pixels1)
-            {
-                var dir = p - Centroid;
-                var radius = dir.magnitude;
-                var degreeI = radius < 0.00001f ? 0 : (int)(dir.DegreeToXAxis() / 45);
-                if (degreeI > 7) degreeI = 0;
-
-                if (radius > radiusDic[degreeI])
-                    radiusDic[degreeI] = radius;
-            }
-            return radiusDic.Mean();
-        }
-
-        // 中心亮点
-        public List<IPixel<Vector2>> Pixels0 = new List<IPixel<Vector2>>();
-        // 泛光
-        public List<Vector2> Pixels1 = new List<Vector2>();
-
-        public PixelSpotArea_DbScan(IEnumerable<IPixel<Vector2>> p)        // kmeans中用随机点初始化,作为中心
-        {
-            Pixels0.AddRange(p);
-        }
-
-        // 中心亮点
-        public void Add0(IPixel<Vector2> p)
-        {
-            Pixels0.Add(p);
-        }
-
-        // 泛光
-        public void Add1(Vector2 point)
-        {
-            Pixels1.Add(point);
-        }
-
-        public void Clear()
-        {
-            Pixels0.Clear();
-            Pixels1.Clear();
-        }
-
-        public float TotalBrightness(Color[] pixels, Func<int, int, int> Vector2ToIndex, int outer_size = 3)
-        {
-            (int x, int y) rectMin = ((int)(Centroid.x - Radius - outer_size), (int)(Centroid.y - Radius - outer_size));
-            (int x, int y) rectMax = ((int)(Centroid.x + Radius + outer_size), (int)(Centroid.y + Radius + outer_size));
-
-            var total = 0f;
-            Parallel.For(rectMin.x, rectMax.x, (i) =>
-            {
-                var t = 0;
-                for (int j = rectMin.y; j < rectMax.y; j++)
-                {
-                    var index = Vector2ToIndex(i, j);
-                    var b = pixels[index].Brightness(64);
-                    t += b;
-                }
-                lock (InfraredLocate.locker)
-                {
-                    total += t;
-                }
-            });
-            //total /= (rectMax.y - rectMin.y) * (rectMax.x - rectMin.x);
-
-            return total;
-        }
-    }
-
-}

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredSpot/PixelSpotArea_DbScan.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 14094e24894f86145bf54897536727c8
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 5
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/LineIdentify/LineIdentified.cs

@@ -1,9 +1,4 @@
 using o0.Geometry2D.Float;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 
 namespace o0.Project
 {

+ 0 - 275
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/PerspectiveTransform.cs

@@ -1,275 +0,0 @@
-using System;
-using System.Diagnostics;
-using o0.Geometry2D.Float;
-
-// 其实这个类内部是用Double计算的
-namespace ZIM
-{
-    // 来源 https://web.archive.org/web/20150222120106/xenia.media.mit.edu/~cwren/interpolator/
-    public class ZIMPerspectiveTransform
-    {
-        // 变换矩阵
-        double[,] H;
-        double[,] InverseH;
-
-        public ZIMPerspectiveTransform(OrdinalQuadrilateral src, OrdinalQuadrilateral dst)
-        {
-            // 该算法点序为 左下角开始 顺时针
-            double[] X = new double[4] { src.A.x, src.C.x, src.D.x, src.B.x };
-            double[] Y = new double[4] { src.A.y, src.C.y, src.D.y, src.B.y };
-
-            double[] Xp = new double[4] { dst.A.x, dst.C.x, dst.D.x, dst.B.x };
-            double[] Yp = new double[4] { dst.A.y, dst.C.y, dst.D.y, dst.B.y };
-
-            TransformEstimate(X, Y, Xp, Yp);
-
-            //UnityEngine.Debug.Log(H.ToJson(true));
-            //UnityEngine.Debug.Log(H[0, 0]);
-            //UnityEngine.Debug.Log(H[0, 1]);
-            //UnityEngine.Debug.Log(H[0, 2]);
-        }
-
-        //public Vector Transform(Vector v)
-        //{
-        //    var result = Transform(v.x, v.y);
-        //    return new Vector((float)result.x, (float)result.y);
-        //}
-
-        public (int x, int y) TransformRound(int x, int y)
-        {
-            var result = Transform((double)x, (double)y);
-            return ((int)Math.Round(result.x), (int)Math.Round(result.y));
-        }
-
-        public (float x, float y) Transform(float x, float y)
-        {
-            var result = Transform((double)x, (double)y);
-            return ((float)result.x, (float)result.y);
-        }
-
-        public (double x, double y) Transform(double x, double y)
-        {
-            double t1 = H[0, 0] * x + H[0, 1] * y + H[0, 2];
-            double t2 = H[1, 0] * x + H[1, 1] * y + H[1, 2];
-            double t3 = H[2, 0] * x + H[2, 1] * y + H[2, 2];
-            return (t1 / t3, t2 / t3);
-        }
-
-        public (float x, float y) TransformInverse(float x, float y)
-        {
-            var result = TransformInverse((double)x, (double)y);
-            return ((float)result.x, (float)result.y);
-        }
-
-        public (double x, double y) TransformInverse(double x, double y)
-        {
-            double t1 = InverseH[0, 0] * x + InverseH[0, 1] * y + InverseH[0, 2];
-            double t2 = InverseH[1, 0] * x + InverseH[1, 1] * y + InverseH[1, 2];
-            double t3 = InverseH[2, 0] * x + InverseH[2, 1] * y + InverseH[2, 2];
-            return (t1 / t3, t2 / t3);
-        }
-
-        // Calculate matrix transform
-        void TransformEstimate(double[] X, double[] Y, double[] Xp, double[] Yp)
-        {
-            //double[] Xp = { 0, 0, 1280, 1280 };
-            //double[] Yp = { 0, 720, 720, 0 };
-            double[,] B = new double[8, 8];
-            double[,] D = new double[8, 1];
-
-            for (int i = 0; i < 4; i++)
-            {
-                B[i, 0] = X[i];
-                B[i, 1] = Y[i];
-                B[i, 2] = 1;
-                B[i, 6] = -X[i] * Xp[i];
-                B[i, 7] = -Y[i] * Xp[i];
-
-                B[i + 4, 3] = X[i];
-                B[i + 4, 4] = Y[i];
-                B[i + 4, 5] = 1;
-                B[i + 4, 6] = -X[i] * Yp[i];
-                B[i + 4, 7] = -Y[i] * Yp[i];
-            }
-
-            for (int i = 0; i < 4; i++)
-            {
-                D[i, 0] = Xp[i];
-                D[i + 4, 0] = Yp[i];
-            }
-
-            double[,] BTranspose = TransposeMatrix(B);
-            double[,] l = MatrixMultiply(MatrixMultiply(MatrixInverse(MatrixMultiply(BTranspose, B)), BTranspose), D);      // l 是8行1列的矩阵
-
-            H = new double[3, 3] { { l[0, 0], l[1, 0], l[2, 0] }, { l[3, 0], l[4, 0], l[5, 0] }, { l[6, 0], l[7, 0], 1 } };
-            InverseH = MatrixInverse(H);
-
-            // 测试代码
-            //var x1 = X[2];
-            //var y1 = Y[2];
-            //var x2 = X[0];
-            //var y2 = Y[0];
-
-            //// Plot the points and their transformed coordinates
-            //UnityEngine.Debug.Log("Plotting the points and their transformed coordinates...");
-            //for (double u = 0; u <= 1; u += 0.1)
-            //{
-            //    double x = u * x1 + (1 - u) * x2;
-            //    double y = u * y1 + (1 - u) * y2;
-            //    UnityEngine.Debug.Log($"Point ({x}, {y})");
-
-            //    double t1 = H[0, 0] * x + H[0, 1] * y + H[0, 2];
-            //    double t2 = H[1, 0] * x + H[1, 1] * y + H[1, 2];
-            //    double t3 = H[2, 0] * x + H[2, 1] * y + H[2, 2];
-            //    double tX = t1 / t3;
-            //    double tY = t2 / t3;
-            //    UnityEngine.Debug.Log($"Transformed point ({tX}, {tY})");
-            //}
-        }
-
-        static double[,] TransposeMatrix(double[,] matrix)
-        {
-            int rows = matrix.GetLength(0);
-            int cols = matrix.GetLength(1);
-            double[,] result = new double[cols, rows];
-
-            for (int i = 0; i < rows; i++)
-            {
-                for (int j = 0; j < cols; j++)
-                {
-                    result[j, i] = matrix[i, j];
-                }
-            }
-
-            return result;
-        }
-
-        static double[,] ReshapeMatrix(double[,] matrix, int rows, int cols)
-        {
-            int originalRows = matrix.GetLength(0);
-            int originalCols = matrix.GetLength(1);
-
-            if (originalRows * originalCols != rows * cols)
-            {
-                throw new Exception("Invalid reshape dimensions");
-            }
-
-            double[,] result = new double[rows, cols];
-            int rowIndex = 0;
-            int colIndex = 0;
-
-            for (int i = 0; i < originalRows; i++)
-            {
-                for (int j = 0; j < originalCols; j++)
-                {
-                    result[rowIndex, colIndex] = matrix[i, j];
-                    colIndex++;
-
-                    if (colIndex == cols)
-                    {
-                        colIndex = 0;
-                        rowIndex++;
-                    }
-                }
-            }
-
-            return result;
-        }
-
-        static double[,] ReshapeMatrix(double[] array, int rows, int cols)
-        {
-            double[,] result = new double[rows, cols];
-            int index = 0;
-
-            for (int j = 0; j < cols; j++)
-            {
-                for (int i = 0; i < rows; i++)
-                {
-                    result[i, j] = array[index];
-                    index++;
-                }
-            }
-
-            return result;
-        }
-
-        static double[,] MatrixMultiply(double[,] matrix1, double[,] matrix2)
-        {
-            int rows1 = matrix1.GetLength(0);
-            int cols1 = matrix1.GetLength(1);
-            int rows2 = matrix2.GetLength(0);
-            int cols2 = matrix2.GetLength(1);
-
-            if (cols1 != rows2)
-            {
-                throw new Exception("Invalid matrix dimensions");
-            }
-
-            double[,] result = new double[rows1, cols2];
-
-            for (int i = 0; i < rows1; i++)
-            {
-                for (int j = 0; j < cols2; j++)
-                {
-                    for (int k = 0; k < cols1; k++)
-                    {
-                        result[i, j] += matrix1[i, k] * matrix2[k, j];
-                    }
-                }
-            }
-
-            return result;
-        }
-
-        static double[,] MatrixInverse(double[,] matrix)
-        {
-            int n = matrix.GetLength(0);
-            double[,] augmentedMatrix = new double[n, 2 * n];
-
-            for (int i = 0; i < n; i++)
-            {
-                for (int j = 0; j < n; j++)
-                {
-                    augmentedMatrix[i, j] = matrix[i, j];
-                }
-
-                augmentedMatrix[i, i + n] = 1;
-            }
-
-            for (int i = 0; i < n; i++)
-            {
-                double pivot = augmentedMatrix[i, i];
-
-                for (int j = 0; j < 2 * n; j++)
-                {
-                    augmentedMatrix[i, j] /= pivot;
-                }
-
-                for (int k = 0; k < n; k++)
-                {
-                    if (k != i)
-                    {
-                        double factor = augmentedMatrix[k, i];
-
-                        for (int j = 0; j < 2 * n; j++)
-                        {
-                            augmentedMatrix[k, j] -= factor * augmentedMatrix[i, j];
-                        }
-                    }
-                }
-            }
-
-            double[,] inverseMatrix = new double[n, n];
-
-            for (int i = 0; i < n; i++)
-            {
-                for (int j = 0; j < n; j++)
-                {
-                    inverseMatrix[i, j] = augmentedMatrix[i, j + n];
-                }
-            }
-
-            return inverseMatrix;
-        }
-    }
-}

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/PerspectiveTransform.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 057edf2f645b28d49891378ad301325f
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 33 - 36
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/ScreenIdentification.cs

@@ -2,6 +2,8 @@
 
 using o0.Geometry2D.Float;
 using o0.Num;
+using o0InfraredLocate;
+using o0InfraredLocate.ZIM;
 using System;
 using System.Collections.Generic;
 using System.IO;
@@ -36,7 +38,8 @@ namespace o0.Project
         //static bool LocateSingleStep = false;
         static bool LocateSingleStep = true;
 
-        public Geometry2D.Vector<int> Size => ScreenLocate.Main.CameraSize;
+        public Vector Size => ScreenLocate.Main.CameraSize;
+        public Geometry.Vector<int> o0Size => new Geometry.Vector<int>((int)Size.x, (int)Size.y);
 
         public QuadrilateralInCamera QuadManual;
         public QuadrilateralInCamera QuadAuto;      // 全自动,可以给用户选择(赋值给Screen.QuadInCamera即生效)
@@ -80,9 +83,9 @@ namespace o0.Project
             };
         }
 
-        public ScreenIdentification()
+        public ScreenIdentification(o0InfraredCameraHandler cameraHandler)
         {
-            Screen = new ScreenMap();
+            Screen = new ScreenMap(cameraHandler);
             //OnLocateScreenEnter += () => Application.targetFrameRate = 30;      // 固定识别的帧率,确保摄像机拍到正确的画面
             //OnLocateScreenEnd += () => Application.targetFrameRate = 60;
         }
@@ -118,7 +121,7 @@ namespace o0.Project
         {
             if (ScreenLocate.Main.DebugScreenImages.Count != 0 && ScreenLocate.Main.DebugOnZIMDemo)     // 这段仅用于测试图片
             {
-                ScreenLocate.Main.CameraSize = new Geometry2D.Vector<int>(ScreenLocate.Main.DebugScreenImages[0].width, ScreenLocate.Main.DebugScreenImages[0].height);
+                ScreenLocate.Main.SetCameraSize(new Vector(ScreenLocate.Main.DebugScreenImages[0].width, ScreenLocate.Main.DebugScreenImages[0].height));
                 DebugImage(ScreenLocate.Main.DebugScreenImages);
                 Screen.QuadInCamera = quadTemp[0];
                 ScreenLocate.SetScreen(null);
@@ -256,12 +259,9 @@ namespace o0.Project
         public void CaptureBlack(Texture2D cam)
         {
             if (ScreenBlackTexture == null)
-                ScreenBlackTexture = new Geometry.Vector<float>[Size.x * Size.y];
-            //Debug.Log($"采样屏幕黑色,Texture2D size: {cam.Size()}, ScreenLocate size: ({Size.x}, {Size.y})");
-            //Debug.Log($"ScreenBlackTexture.Length: ({ScreenBlackTexture.Length})");
-
+                ScreenBlackTexture = new Geometry.Vector<float>[(int)(Size.x * Size.y)];
             var pixel = cam.GetPixels();
-            Parallel.For(0, Size.x * Size.y, i =>
+            Parallel.For(0, (int)(Size.x * Size.y), i =>
             {
                 var ip = pixel[i];
                 ScreenBlackTexture[i] += new Geometry.Vector<float>(ip.r / maxCapture, ip.g / maxCapture, ip.b / maxCapture);
@@ -271,12 +271,9 @@ namespace o0.Project
         public void CaptureWhite(Texture2D cam)
         {
             if (ScreenWhiteTexture == null)
-                ScreenWhiteTexture = new Geometry.Vector<float>[Size.x * Size.y];
-            //Debug.Log($"采样屏幕白色,Texture2D size: {cam.Size()}, ScreenLocate size: ({Size.x}, {Size.y})");
-            //Debug.Log($"ScreenWhiteTexture.Length: ({ScreenWhiteTexture.Length})");
-
+                ScreenWhiteTexture = new Geometry.Vector<float>[(int)(Size.x * Size.y)];
             var pixel = cam.GetPixels();
-            Parallel.For(0, Size.x * Size.y, i =>
+            Parallel.For(0, (int)(Size.x * Size.y), i =>
             {
                 var ip = pixel[i];
                 ScreenWhiteTexture[i] += new Geometry.Vector<float>(ip.r / maxCapture, ip.g / maxCapture, ip.b / maxCapture);
@@ -387,7 +384,7 @@ namespace o0.Project
                 delay--;
                 if (delay == 0)
                 {
-                    ScreenLocate.Main.CameraSize = new Geometry2D.Vector<int>(cam.width, cam.height);          // 记录当前的分辨率
+                    ScreenLocate.Main.SetCameraSize(new Vector(cam.width, cam.height));          // 记录当前的分辨率
                     Debug.Log("[ScreenIdentification] 采样纹理,记录采样分辨率: [" + Size.x + ", " + Size.y + "]");
                 }
                 return true;
@@ -540,7 +537,7 @@ namespace o0.Project
             {
                 if (l != null)
                 {
-                    o0Extension.DrawLine(drawLineMap.DrawLine(l, (x, y) => 1, new Geometry2D.Float.Vector(0, 10));
+                    o0Extension.DrawLine(drawLineMap.DrawLine(l, (x, y) => 1, new Vector(0, 10));
                     lineCount++;
                 }
             }
@@ -562,7 +559,7 @@ namespace o0.Project
             //var drawLineMap = new MatrixF2D(edge..Size.x, edge.Size.y);
             //var returnMaxLines = lines.Sub(0, 10);
             //foreach (var (line, sum, gradient) in returnMaxLines)
-            //    o0Extension.DrawLine(drawLineMap.DrawLine(line, (x, y) => 1, new Geometry2D.Float.Vector(0, 10));
+            //    o0Extension.DrawLine(drawLineMap.DrawLine(line, (x, y) => 1, new Vector(0, 10));
 
 
             ScreenLocate.DebugTexture(3, drawLineMap.ToTex());
@@ -628,9 +625,9 @@ namespace o0.Project
 
         float GetBrightness()
         {
-            UnityEngine.Color[] differPixel = new UnityEngine.Color[Size.x * Size.y];
+            UnityEngine.Color[] differPixel = new UnityEngine.Color[(int)(Size.x * Size.y)];
 
-            Parallel.For(0, Size.x * Size.y, i =>
+            Parallel.For(0, (int)(Size.x * Size.y), i =>
             {
                 var pi = ScreenWhiteTexture[i] - ScreenBlackTexture[i];
                 differPixel[i] = new UnityEngine.Color(pi.x, pi.y, pi.z);
@@ -649,7 +646,7 @@ namespace o0.Project
         // 转换成屏幕定位所需的纹理图像
         Texture2D ToLocateTex(UnityEngine.Color[] pixels)
         {
-            var ScreenLocateTex = new Texture2D(Size.x, Size.y);
+            var ScreenLocateTex = new Texture2D(o0Size.x, o0Size.y);
             ScreenLocateTex.SetPixels(pixels);
             ScreenLocateTex.Apply();
             //ScreenLocate.DebugTexture(2, ScreenLocateTex);
@@ -696,13 +693,13 @@ namespace o0.Project
             }
             else    // 获得屏幕差值
             {
-                var differPixel = new UnityEngine.Color[Size.x * Size.y];
-                var whitePixel = new UnityEngine.Color[Size.x * Size.y];
-                Parallel.For(0, Size.x, x =>
+                var differPixel = new UnityEngine.Color[(int)(Size.x * Size.y)];
+                var whitePixel = new UnityEngine.Color[(int)(Size.x * Size.y)];
+                Parallel.For(0, (int)Size.x, x =>
                 {
-                    for (int y = 0; y < Size.y; y++)
+                    for (int y = 0; y < (int)Size.y; y++)
                     {
-                        var i = y * Size.x + x;
+                        var i = y * (int)Size.x + x;
                         var d = ScreenWhiteTexture[i] - ScreenBlackTexture[i];
                         differPixel[i] = new UnityEngine.Color(d.x, d.y, d.z);
                         whitePixel[i] = new UnityEngine.Color(ScreenWhiteTexture[i].x, ScreenWhiteTexture[i].y, ScreenWhiteTexture[i].z);
@@ -838,48 +835,48 @@ namespace o0.Project
 
             #region 绘制 output texture
             // 绘制半自动
-            var ScreenQuadMap = new Matrix(Size, Tiling: true);     // 识别的到的屏幕四边形(半自动和自动在一张图上) 
+            var ScreenQuadMap = new Matrix(o0Size, Tiling: true);     // 识别的到的屏幕四边形(半自动和自动在一张图上) 
             foreach (var i in LineIdentifiedSemiAuto.Index())
             {
                 if (LastQuadSemiAutoState[i])
-                    o0Extension.DrawLine(ScreenQuadMap, LineIdentifiedSemiAuto[i].DrawLine, (x, y) => 5, new Geometry2D.Float.Vector(0, 10));
+                    o0Extension.DrawLine(ScreenQuadMap, LineIdentifiedSemiAuto[i].DrawLine, (x, y) => 5, new Vector(0, 10));
                 else
-                    o0Extension.DrawLine(ScreenQuadMap, LineIdentifiedSemiAuto[i].DrawLine, (x, y) => 3, new Geometry2D.Float.Vector(0, 6), true);
+                    o0Extension.DrawLine(ScreenQuadMap, LineIdentifiedSemiAuto[i].DrawLine, (x, y) => 3, new Vector(0, 6), true);
             } 
 
             // 绘制全自动
             foreach (var i in LineIdentifiedAuto.Index())
-                o0Extension.DrawLine(ScreenQuadMap, LineIdentifiedAuto[i].DrawLine, (x, y) => 4, new Geometry2D.Float.Vector(0, 4), true);
+                o0Extension.DrawLine(ScreenQuadMap, LineIdentifiedAuto[i].DrawLine, (x, y) => 4, new Vector(0, 4), true);
 
             Texture2D ScreenQuad = ScreenQuadMap.ToTexRGBA(FloatValueToColor);
             Texture2D ScreenQuadWithScreen = ScreenQuad.Overlay(ScreenLocateTexture);   // 叠加屏幕色差图
 
             // 绘制allLines
-            var allLinesMap = new Matrix(Size, Tiling: true);
+            var allLinesMap = new Matrix(o0Size, Tiling: true);
             foreach (var l in allLines)
             {
                 if (l.DrawLine != null)
-                    o0Extension.DrawLine(allLinesMap, l.DrawLine, (x, y) => 1, new Geometry2D.Float.Vector(0, 2), true);
+                    o0Extension.DrawLine(allLinesMap, l.DrawLine, (x, y) => 1, new Vector(0, 2), true);
             }
             var allLinesTex = allLinesMap.ToTexRGBA(FloatValueToColor);
             ScreenLocate.DebugTexture(1, allLinesTex);
 
             // 还需要输出一张识别结果图,包含干扰线段
-            var ChoosableLineMap = new Matrix(Size, Tiling: true);
+            var ChoosableLineMap = new Matrix(o0Size, Tiling: true);
             foreach (var l in possibleLines)
             {
                 if (l != null && !quadLinesSemiAuto.Contains(l) && !manualLines.Contains(l))
-                    o0Extension.DrawLine(ChoosableLineMap, l.DrawLine, (x, y) => 1, new Geometry2D.Float.Vector(0, 2), true); // 其他的备选线段
+                    o0Extension.DrawLine(ChoosableLineMap, l.DrawLine, (x, y) => 1, new Vector(0, 2), true); // 其他的备选线段
             }
             foreach (var l in LineIdentifiedSemiAuto)
             {
                 if (l != null)
-                    o0Extension.DrawLine(ChoosableLineMap, l.DrawLine, (x, y) => 5, new Geometry2D.Float.Vector(0, 5)); // 识别的结果
+                    o0Extension.DrawLine(ChoosableLineMap, l.DrawLine, (x, y) => 5, new Vector(0, 5)); // 识别的结果
             }
             if (manualLines != null)
             {
                 foreach (var l in manualLines)
-                    o0Extension.DrawLine(ChoosableLineMap, l.DrawLine, (x, y) => 3, new Geometry2D.Float.Vector(0, 2), true);     // 旧的屏幕线段(例如上次手动识别的)
+                    o0Extension.DrawLine(ChoosableLineMap, l.DrawLine, (x, y) => 3, new Vector(0, 2), true);     // 旧的屏幕线段(例如上次手动识别的)
             }
             Texture2D ChoosableLineTex = ChoosableLineMap.ToTexRGBA(FloatValueToColor);
             #endregion
@@ -969,7 +966,7 @@ namespace o0.Project
                 var points = new Vector[5] { allLines[i].Line.A, allLines[i].Line.A + dir, allLines[i].Line.A + dir * 2f, allLines[i].Line.A + dir * 3f, allLines[i].Line.B };  // A点、中间的点、B点
                 for (int pI = 0; pI < points.Length; pI++)
                 {
-                    if (!ScreenLocate.Main.ScreenPixelCheaker.OutArea2D(points[pI], Size))
+                    if (ScreenLocate.Main.ScreenPixelCheaker == null || !ScreenLocate.Main.ScreenPixelCheaker.OutArea2D(points[pI], Size)) 
                         InArea.Add(points[pI]);
                 }
 

+ 0 - 124
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/ScreenMap.cs

@@ -1,124 +0,0 @@
-using o0.Geometry2D.Float;
-using System;
-using UnityEngine;
-
-namespace ZIM.Unity
-{
-    // 摄像机的取景画面的纵横比设置(取景画面纵横比是否会根据分辨率变化)
-    public enum AspectRatioSetting
-    {
-        FixedAll,       // 高度和宽度都不变
-        FixedHeight,    // 高度固定
-        FixedWidth,     // 宽度固定
-    }
-
-    // 记录屏幕的位置,QuadInCamera表示屏幕4个点在摄像机画面中的坐标
-    // TransformToScreen可将摄像机空间的点映射到屏幕空间,反之用TransformToCamera
-    public class ScreenMap
-    {
-        public static AspectRatioSetting ViewAspectRatioSetting = AspectRatioSetting.FixedHeight;// 默认取景画面的高度保持不变,宽度随着分辨率变化
-
-        public Rect QuadRect { get; private set; }
-        public Vector2 UVSize { get; private set; }     // UV代表屏幕空间的坐标,UVSize代表屏幕坐标的取值范围
-        public bool Active;
-
-        QuadrilateralInCamera quadInCamera;     // 记录的分辨率和识别时的分辨率可能不同
-        public QuadrilateralInCamera QuadInCamera
-        {
-            get => quadInCamera;
-            set
-            {
-                quadInCamera = value;
-                InitByQuad();
-            }
-        }
-
-        // 当分辨率不同时,刷新分辨率并返回true,否则返回false
-        public bool RefreshCameraSize(Vector2 sizeNew) => RefreshCameraSize(sizeNew.o0Vector());
-        public bool RefreshCameraSize(Vector sizeNew)
-        {
-            if (QuadInCamera != null && QuadInCamera.CameraSize != sizeNew)
-            {
-                Debug.Log($"[ScreenMap]根据分辨率映射: from {QuadInCamera.SizeString} to ({sizeNew.x}, {sizeNew.y})");
-                QuadInCamera.ReSize(sizeNew, ViewAspectRatioSetting);
-                InitByQuad();
-                return true;
-            }
-            return false;
-        }
-
-        private void InitByQuad()
-        {
-            if (QuadInCamera != null)
-            {
-                var quad = QuadInCamera.Quad;
-                var x = Math.Min((quad.A - quad.B).Length, (quad.C - quad.D).Length);
-                var y = Math.Min((quad.A - quad.C).Length, (quad.B - quad.D).Length);
-                UVSize = new Vector2(x, y);
-                perspective = new ZIMPerspectiveTransform(quad, new OrdinalQuadrilateral(new Vector(0, 0), new Vector(x, 0), new Vector(0, y), new Vector(x, y)));
-
-                var aabb = quad.AABBRect();
-                QuadRect = new Rect(aabb.Item1.x, aabb.Item1.y, aabb.Item2.x - aabb.Item1.x, aabb.Item2.y - aabb.Item1.y);
-                Debug.Log("[ScreenMap] 应用屏幕识别数据");
-                //Debug.Log("QuadRect:" + QuadRect);
-
-                Active = true;
-            }
-            else
-            {
-                Active = false;
-            }
-        }
-
-        private ZIMPerspectiveTransform perspective;
-
-        public ScreenMap()
-        {
-
-        }
-
-        public ScreenMap(QuadrilateralInCamera quad)
-        {
-            QuadInCamera = quad;
-        }
-
-        public bool UVInScreen(Vector2 v)
-        {
-            return Active ? v.x > 0 && v.x < UVSize.x && v.y > 0 && v.y < UVSize.y : true;
-        }
-
-        // UV归一化到[0, 1]范围,仅用于输出最终结果
-        public Vector2 UVNormalized(Vector2 location)
-        {
-            return Active ? 
-                new Vector2(location.x / UVSize.x, location.y / UVSize.y) : 
-                new Vector2(location.x / ScreenLocate.Main.CameraSize.x, location.y / ScreenLocate.Main.CameraSize.y);
-        }
-
-        public Vector2 TransformToScreen(Vector2 vIn)
-        {
-            if (Active)
-            {
-                var v = perspective.Transform(vIn.x, vIn.y);
-                return new Vector2(v.x, v.y);
-            }
-            else
-            {
-                return vIn;
-            }
-        }
-
-        public Vector2 TransformToCamera(Vector2 vIn)
-        {
-            if (Active)
-            {
-                var v = perspective.TransformInverse(vIn.x, vIn.y);
-                return new Vector2(v.x, v.y);
-            }
-            else
-            {
-                return vIn;
-            }
-        }
-    }
-}

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/ScreenMap.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 28a800355e2b19d4e9cfa2b3077372d7
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 74
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/SimpleLocationEstimation.cs

@@ -1,74 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using UnityEngine;
-using UnscentedKalmanFilter;
-
-namespace ZIM
-{
-    // 固定时间间隔下,预测位置轨迹
-    public class SimpleLocationEstimation
-    {
-        //public bool Initialized;
-        public Vector2 Predict;
-
-        Vector2 LastLocation;
-        Vector2 LastSpeed;
-        Vector2 LastAcc;
-        float AccChangeScale;
-        List<Vector2> Locations;
-
-        // 卡尔曼滤波作用于速度
-        UKF filterx;
-        UKF filtery;
-
-        public SimpleLocationEstimation(float accChangeScale = 1)
-        {
-            Locations = new List<Vector2>();
-            AccChangeScale = accChangeScale;
-            filterx = new UKF();
-            filtery = new UKF();
-        }
-
-        public Vector2 Update(Vector2 loc)
-        {
-            if (Locations == null)
-            {
-                var newSpeed = loc - LastLocation;
-                var newAcc = newSpeed - LastSpeed;
-                var accPredict = newAcc + (newAcc - LastAcc) * AccChangeScale;
-                var speedPredict = newSpeed + accPredict;
-                //if (speedPredict.x * newSpeed.x < 0)
-                //    speedPredict.x = 0;
-                //if (speedPredict.y * newSpeed.y < 0)
-                //    speedPredict.y = 0;
-                //var LocationPredict = loc + speedPredict;
-
-                filterx.Update(new double[] { speedPredict.x });
-                filtery.Update(new double[] { speedPredict.y });
-
-                var LocationPredict = loc + new Vector2((float)filterx.getState()[0], (float)filtery.getState()[0]);
-
-                LastSpeed = newSpeed;
-                LastAcc = newAcc;
-                LastLocation = loc;
-                return Predict = LocationPredict;
-                //return Predict = new Vector2((float)filterx.getState()[0], (float)filtery.getState()[0]);
-            }
-            if (Locations.Count < 2)
-            {
-                Locations.Add(loc);
-            }
-            else
-            {
-                Locations.Add(loc);
-                var speed = new Vector2[] { Locations.ElementAt(1) - Locations.ElementAt(0), Locations.ElementAt(2) - Locations.ElementAt(1) };
-                LastLocation = loc;
-                LastSpeed = speed[1];
-                LastAcc = speed[1] - speed[0];
-                Locations = null;
-            }
-            return Predict = loc;
-        }
-
-    }
-}

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/SimpleLocationEstimation.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 93f7b0cb95588c44a9d26ddd586d4665
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 152
Assets/InfraredProject/WebCamera/Script/ZIM/Other/OrdinalQuadrilateral.cs

@@ -1,152 +0,0 @@
-using System;
-using System.Collections.Generic;
-using o0.Geometry2D.Float;
-using Unity.VisualScripting;
-
-namespace ZIM
-{
-    // 屏幕识别使用,固定的顶点顺序: 左下,右下,左上,右上,严格遵守
-    public class OrdinalQuadrilateral : Geometry<OrdinalQuadrilateral>
-    {
-        public Vector A;
-        public Vector B;
-        public Vector C;
-        public Vector D;
-
-        public override int Count => 4;
-
-        public OrdinalQuadrilateral(Vector a, Vector b, Vector c, Vector d)
-        {
-            this.A = a;
-            this.B = b;
-            this.C = c;
-            this.D = d;
-        }
-
-        public OrdinalQuadrilateral(IEnumerable<Vector> enumable)
-        {
-            var e = enumable.GetEnumerator();
-            this.A = e.MoveNext() ? e.Current : default;
-            this.B = e.MoveNext() ? e.Current : default;
-            this.C = e.MoveNext() ? e.Current : default;
-            this.D = e.MoveNext() ? e.Current : default;
-        }
-
-        public static OrdinalQuadrilateral Identity { get; } = new OrdinalQuadrilateral(new Vector(0, 0), new Vector(1, 0), new Vector(0, 1), new Vector(1, 1));
-
-        /// <summary>四边形的质心(顶点平均值)</summary>
-        public Vector Centroid => new Vector(A.x + B.x + C.x + D.x, A.y + B.y + C.y + D.y) / 4f;
-
-        public override Vector this[int index]
-        {
-            get
-            {
-                switch (index % Count)
-                {
-                    default:
-                    case 0:
-                        return A;
-                    case 1:
-                        return B;
-                    case 2:
-                        return C;
-                    case 3:
-                        return D;
-                }
-            }
-            set
-            {
-                switch (index % Count)
-                {
-                    default:
-                    case 0:
-                        A = value;
-                        break;
-                    case 1:
-                        B = value;
-                        break;
-                    case 2:
-                        C = value;
-                        break;
-                    case 3:
-                        D = value;
-                        break;
-                }
-            }
-        }
-
-        public override string ToString()
-        {
-            return $"[{A}, {B}, {C}, {D}]";
-        }
-
-        // AABB包围盒,返回矩形左下角和右上角的坐标
-        public (Vector, Vector) AABBRect()
-        {
-            float minX = this[0].x;
-            float maxX = this[0].x;
-            float minY = this[0].y;
-            float maxY = this[0].y;
-
-            for (int i = 1; i < Count; i++)
-            {
-                minX = Math.Min(minX, this[i].x);
-                maxX = Math.Max(maxX, this[i].x);
-                minY = Math.Min(minY, this[i].y);
-                maxY = Math.Max(maxY, this[i].y);
-            }
-
-            return (new Vector(minX, minY), new Vector(maxX, maxY));
-        }
-
-        public Vector InterpolationFactors(Vector p)
-        {
-            float u, v;
-            float _a = (C.x - D.x + B.x - A.x) * (A.y - C.y) - (C.y - D.y + B.y - A.y) * (A.x - C.x);
-            float _b = (D.x - C.x) * (A.y - C.y) - (D.y - C.y) * (A.x - C.x) + (p.x - C.x) * (C.y - D.y + B.y - A.y) - (p.y - C.y) * (C.x - D.x + B.x - A.x);
-            float _c = (p.x - C.x) * (D.y - C.y) - (p.y - C.y) * (D.x - C.x);
-            if (_a < float.Epsilon)
-            {
-                v = -_c / _b;
-            }
-            else
-            {
-                float delta = _b * _b - 4 * _a * _c;
-
-                if (delta < 0)
-                {
-                    return default;
-                    throw new Exception("Delta is smaller than zero.");
-                }
-
-                float sqrtDelta = (float)Math.Sqrt(delta);
-
-                v = (-_b + sqrtDelta) / (2 * _a);
-                if (v < 0 || v > 1)
-                    v = (-_b - sqrtDelta) / (2 * _a);
-            }
-            u = ((p.x - C.x) - (A.x - C.x) * v) / ((D.x - C.x) + (C.x - D.x + B.x - A.x) * v);
-
-            return new Vector(u, 1 - v);
-        }
-
-        public static OrdinalQuadrilateral Fit(IEnumerable<Vector> pixels, Vector textureSize)
-        {
-            Vector[] vertex = new Vector[4] { new Vector(0, 0), new Vector(textureSize.x, 0), new Vector(textureSize.y, 0), textureSize };
-            Vector[] dir = new Vector[4] { new Vector(1, 1).Normalized, new Vector(-1, 1).Normalized, new Vector(1, -1).Normalized, new Vector(-1, -1).Normalized };
-            (float, Vector)[] min = new (float, Vector)[4] { (float.MaxValue, default), (float.MaxValue, default), (float.MaxValue, default), (float.MaxValue, default) };
-
-            foreach (var i in pixels)
-            {
-                for (int j = 0; j < 4; j++)
-                {
-                    var len = (i - vertex[j]).Dot(dir[j]);
-                    if (len < min[j].Item1)
-                        min[j] = (len, i);
-                }
-            }
-
-            return new OrdinalQuadrilateral(min[0].Item2, min[1].Item2, min[2].Item2, min[3].Item2);
-        }
-    }
-}

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/Other/OrdinalQuadrilateral.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: d1f6cab6f7c30cb49bed9d0688f363c0
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 156
Assets/InfraredProject/WebCamera/Script/ZIM/Other/QuadrilateralInCamera.cs

@@ -1,156 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using o0.Geometry2D;
-using o0.Geometry2D.Float;
-using UnityEngine;
-
-namespace ZIM.Unity
-{
-    // 屏幕识别使用,记录摄像机画面内的四边形
-    public class QuadrilateralInCamera
-    {
-        public Vector CameraSize;
-        public OrdinalQuadrilateral Quad;
-
-        // 固定的顶点顺序: 左下,右下,左上,右上
-        public QuadrilateralInCamera(Vector2 a, Vector2 b, Vector2 c, Vector2 d, Vector2 cameraSize)
-        {
-            CameraSize = cameraSize.o0Vector();
-            Quad = new OrdinalQuadrilateral(a.o0Vector(), b.o0Vector(), c.o0Vector(), d.o0Vector());
-        }
-
-        // 固定的顶点顺序: 左下,右下,左上,右上
-        public QuadrilateralInCamera(Vector a, Vector b, Vector c, Vector d, Vector cameraSize)
-        {
-            CameraSize = cameraSize;
-            Quad = new OrdinalQuadrilateral(a, b, c, d);
-        }
-
-        // 固定的顶点顺序: 左下,右下,左上,右上
-        public QuadrilateralInCamera(IEnumerable<Vector> enumable, Vector cameraSize)
-        {
-            CameraSize = cameraSize;
-            Quad = new OrdinalQuadrilateral(enumable);
-        }
-
-        // 固定的顶点顺序: 左下,右下,左上,右上
-        public QuadrilateralInCamera(IEnumerable<Vector2> enumable, Vector cameraSize)
-        {
-            CameraSize = cameraSize;
-            Quad = new OrdinalQuadrilateral(enumable.Select((i => i.o0Vector())));
-        }
-
-        public QuadrilateralInCamera(OrdinalQuadrilateral quad, Vector cameraSize)
-        {
-            CameraSize = cameraSize;
-            Quad = quad;
-        }
-
-        public string SizeString => $"({CameraSize.x}, {CameraSize.y})";
-        public string QuadString => $"[({Quad.A.x}, {Quad.A.y}), ({Quad.B.x}, {Quad.B.y}), ({Quad.C.x}, {Quad.C.y}), ({Quad.D.x}, {Quad.D.y})]";
-        public override string ToString() => $"CameraSize: {SizeString}, Vertices: {QuadString}";
-
-        // 需要标准化的坐标(即数值范围0-1)时使用,会自动根据当前的CameraSize转换
-        private List<Vector> ScreenVertexListNormalized
-        {
-            get
-            {
-                return new List<Vector> {
-                    Quad.A / CameraSize,
-                    Quad.B / CameraSize,
-                    Quad.C / CameraSize,
-                    Quad.D / CameraSize
-                };
-            }
-            set
-            {
-                for (int i = 0; i < Quad.Count; i++)
-                    Quad[i] = value[i] * CameraSize;
-            }
-        }
-
-        // 这里是标准化坐标(即数值范围0-1)
-        public List<Vector2> GetUnityVertexNormalizedList()
-        {
-            return new List<Vector2>() {
-                new Vector2(Quad.A.x / CameraSize.x, Quad.A.y / CameraSize.y),
-                new Vector2(Quad.B.x / CameraSize.x, Quad.B.y / CameraSize.y),
-                new Vector2(Quad.C.x / CameraSize.x, Quad.C.y / CameraSize.y),
-                new Vector2(Quad.D.x / CameraSize.x, Quad.D.y / CameraSize.y)
-            };
-        }
-
-        // 线段顺序: 下、右、上、左
-        public Line[] GetLines() => new Line[4]
-        {
-            new Line(Quad.A, Quad.B),
-            new Line(Quad.B, Quad.D),
-            new Line(Quad.C, Quad.D),
-            new Line(Quad.A, Quad.C)
-        };
-
-        // 摄像机分辨率变化时调用
-        public void ReSize(Vector sizeNew, AspectRatioSetting viewAspectRatioSetting)
-        {
-            if (CameraSize != sizeNew)
-            {
-                float ratio;
-                Func<Vector, Vector> Translate;
-                List<Vector> vertices;
-                switch (viewAspectRatioSetting)
-                {
-                    case AspectRatioSetting.FixedAll:
-                        var scale = new Vector(sizeNew.x / CameraSize.x, sizeNew.y / CameraSize.y);
-                        CameraSize = sizeNew;
-                        for (int i = 0; i < Quad.Count; i++)
-                            Quad[i] *= scale;
-
-                        break;
-                    case AspectRatioSetting.FixedHeight:
-                        var wOld = CameraSize.x / CameraSize.y;                // 宽度比高度
-                        var wNew = sizeNew.x / sizeNew.y;
-                        ratio = wOld / wNew;
-                        Translate = (v) =>
-                        {
-                            var x = v.x - 0.5f;
-                            return new Vector(x * ratio + 0.5f, v.y);
-                        };
-                        vertices = ScreenVertexListNormalized;
-                        for (int i = 0; i < vertices.Count; i++)
-                            vertices[i] = Translate(vertices[i]);
-                        CameraSize = sizeNew;                           // 这里要先设置Size
-                        ScreenVertexListNormalized = vertices;
-
-                        break;
-                    case AspectRatioSetting.FixedWidth:
-                        var hOld = CameraSize.y / CameraSize.x;                // 高度比宽度
-                        var hNew = sizeNew.y / sizeNew.x;
-                        ratio = hOld / hNew;
-                        Translate = (v) =>
-                        {
-                            var y = v.y - 0.5f;
-                            return new Vector(v.x, y * ratio + 0.5f);
-                        };
-                        vertices = ScreenVertexListNormalized;
-                        for (int i = 0; i < vertices.Count; i++)
-                            vertices[i] = Translate(vertices[i]);
-                        CameraSize = sizeNew;
-                        ScreenVertexListNormalized = vertices;
-
-                        break;
-                }
-            }
-        }
-
-        // 四边形是否完整的在屏幕内
-        public bool IsQuadComplete()
-        {
-            if (Quad.A.x < Quad.B.x && Quad.A.y < Quad.C.y && Quad.B.y < Quad.D.y && Quad.C.x < Quad.D.x && Quad.A.x > 0 && Quad.A.y > 0 &&
-                Quad.B.x < CameraSize.x && Quad.B.y > 0 && Quad.C.x > 0 && Quad.C.y < CameraSize.y && Quad.D.x < CameraSize.x && Quad.D.y < CameraSize.y)
-                return true;
-            return false;
-        }
-
-    }
-}

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/Other/QuadrilateralInCamera.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 89517f7ca410af74d8b8a7bd93734b1b
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 249
Assets/InfraredProject/WebCamera/Script/ZIM/Other/UKFSharp/UnscentedKalmanFilter.cs

@@ -1,249 +0,0 @@
-using MathNet.Numerics.LinearAlgebra;
-using MathNet.Numerics.LinearAlgebra.Double;
-using MathNet.Numerics.LinearAlgebra.Factorization;
-using System;
-
-// from https://github.com/NickMightyKingdom/UKFSharp/tree/license
-namespace UnscentedKalmanFilter
-{
-	public class UKF
-	{
-		/// <summary>
-		/// States number
-		/// </summary>
-		private int L;
-
-		/// <summary>
-		/// Measurements number
-		/// </summary>
-		private int m;  
-
-		/// <summary>
-		/// The alpha coefficient, characterize sigma-points dispersion around mean
-		/// </summary>
-		private double alpha;  
-
-		/// <summary>
-		/// The ki.
-		/// </summary>
-		private double ki;
-
-		/// <summary>
-        /// The beta coefficient, characterize type of distribution (2 for normal one) 
-		/// </summary>
-		private double beta;
-
-		/// <summary>
-		/// Scale factor
-		/// </summary>
-		private double lambda;
-
-		/// <summary>
-		/// Scale factor
-		/// </summary>
-		private double c; 
-
-		/// <summary>
-		/// Means weights
-		/// </summary>
-		private Matrix<double> Wm; 
-
-		/// <summary>
-		/// Covariance weights
-		/// </summary>
-        private Matrix<double> Wc;
-
-        /// <summary>
-		/// State
-		/// </summary>
-        private Matrix<double> x;
-
-        /// <summary>
-		/// Covariance
-		/// </summary>
-        private Matrix<double> P;
-
-        /// <summary>
-		/// Std of process 
-		/// </summary>
-        private double q;
-
-        /// <summary>
-		/// Std of measurement 
-		/// </summary>
-        private double r;
-
-        /// <summary>
-		/// Covariance of process
-		/// </summary>
-        private Matrix<double> Q;
-
-        /// <summary>
-		/// Covariance of measurement 
-		/// </summary>
-        private Matrix<double> R;
-
-        /// <summary>
-        /// Constructor of Unscented Kalman Filter
-        /// </summary>
-        /// <param name="L">States number</param>
-        /// <param name="m">Measurements number</param>
-        public UKF(int L = 0)
-		{
-            this.L = L;
-		}
-
-        private void init()
-        {
-            q = 0.05;
-            r = 0.3; 
-
-            x = q * Matrix.Build.Random(L, 1); //initial state with noise
-            P = Matrix.Build.Diagonal(L, L, 1); //initial state covraiance
-
-            Q = Matrix.Build.Diagonal(L, L, q * q); //covariance of process
-            R = Matrix.Build.Dense(m, m, r * r); //covariance of measurement  
-
-            alpha = 1e-3f;
-            ki = 0;
-            beta = 2f;
-            lambda = alpha * alpha * (L + ki) - L;
-            c = L + lambda;
-
-            //weights for means
-            Wm = Matrix.Build.Dense(1, (2 * L + 1), 0.5 / c);
-            Wm[0, 0] = lambda / c;
-
-            //weights for covariance
-            Wc = Matrix.Build.Dense(1, (2 * L + 1));
-            Wm.CopyTo(Wc);
-            Wc[0, 0] = Wm[0, 0] + 1 - alpha * alpha + beta;
-
-            c = Math.Sqrt(c);
-        }
-
-        public void Update(double[] measurements)
-        {
-            if (m == 0)
-            {
-                var mNum = measurements.Length;
-                if (mNum > 0)
-                {
-                    m = mNum;
-                    if (L == 0) L = mNum;
-                    init();
-                }
-            }
-
-            var z = Matrix.Build.Dense(m, 1, 0);
-            z.SetColumn(0, measurements);
-
-            //sigma points around x
-            Matrix<double> X = GetSigmaPoints(x, P, c);
-
-            //unscented transformation of process
-            // X1=sigmas(x1,P1,c) - sigma points around x1
-            //X2=X1-x1(:,ones(1,size(X1,2))) - deviation of X1
-            Matrix<double>[] ut_f_matrices = UnscentedTransform(X, Wm, Wc, L, Q);
-            Matrix<double> x1 = ut_f_matrices[0];
-            Matrix<double> X1 = ut_f_matrices[1];
-            Matrix<double> P1 = ut_f_matrices[2];
-            Matrix<double> X2 = ut_f_matrices[3];
-
-            //unscented transformation of measurments
-            Matrix<double>[] ut_h_matrices = UnscentedTransform(X1, Wm, Wc, m, R);
-            Matrix<double> z1 = ut_h_matrices[0];
-            Matrix<double> Z1 = ut_h_matrices[1];
-            Matrix<double> P2 = ut_h_matrices[2];
-            Matrix<double> Z2 = ut_h_matrices[3];
-
-            //transformed cross-covariance
-            Matrix<double> P12 = (X2.Multiply(Matrix.Build.Diagonal(Wc.Row(0).ToArray()))).Multiply(Z2.Transpose());
-
-            Matrix<double> K = P12.Multiply(P2.Inverse());
-
-            //state update
-            x = x1.Add(K.Multiply(z.Subtract(z1)));
-            //covariance update 
-            P = P1.Subtract(K.Multiply(P12.Transpose()));
-        }
-
-        public double[] getState()
-        {
-            return x.ToColumnArrays()[0];
-        }
-
-        public double[,] getCovariance()
-        {
-            return P.ToArray();
-        }
-
-        /// <summary>
-        /// Unscented Transformation
-        /// </summary>
-        /// <param name="f">nonlinear map</param>
-        /// <param name="X">sigma points</param>
-        /// <param name="Wm">Weights for means</param>
-        /// <param name="Wc">Weights for covariance</param>
-        /// <param name="n">numer of outputs of f</param>
-        /// <param name="R">additive covariance</param>
-        /// <returns>[transformed mean, transformed smapling points, transformed covariance, transformed deviations</returns>
-        private Matrix<double>[] UnscentedTransform(Matrix<double> X, Matrix<double> Wm, Matrix<double> Wc, int n, Matrix<double> R)
-        {
-            int L = X.ColumnCount;
-            Matrix<double> y = Matrix.Build.Dense(n, 1, 0);
-            Matrix<double> Y = Matrix.Build.Dense(n, L, 0);
-
-            Matrix<double> row_in_X;
-            for (int k = 0; k < L; k++)
-            {
-                row_in_X = X.SubMatrix(0, X.RowCount, k, 1);
-                Y.SetSubMatrix(0, Y.RowCount, k, 1, row_in_X);
-                y = y.Add(Y.SubMatrix(0, Y.RowCount, k, 1).Multiply(Wm[0,k]));
-            }
-
-            Matrix<double> Y1 = Y.Subtract(y.Multiply(Matrix.Build.Dense(1,L,1)));
-            Matrix<double> P = Y1.Multiply(Matrix.Build.Diagonal(Wc.Row(0).ToArray()));
-            P = P.Multiply(Y1.Transpose());
-            P = P.Add(R);
-
-            Matrix<double>[] output = { y, Y, P, Y1 };
-            return output;
-        }
-
-        /// <summary>
-        /// Sigma points around reference point
-        /// </summary>
-        /// <param name="x">reference point</param>
-        /// <param name="P">covariance</param>
-        /// <param name="c">coefficient</param>
-        /// <returns>Sigma points</returns>
-        private Matrix<double> GetSigmaPoints(Matrix<double> x, Matrix<double> P, double c) 
-	    {
-            Matrix<double> A = P.Cholesky().Factor;
-
-	    	A = A.Multiply(c);
-	    	A = A.Transpose();
-
-	    	int n = x.RowCount;
-
-	    	Matrix<double> Y = Matrix.Build.Dense(n, n, 1);
-	    	for (int j=0; j<n; j++)  
-	    	{
-	    		Y.SetSubMatrix(0, n, j, 1, x);
-	    	}
-
-	    	Matrix<double> X = Matrix.Build.Dense(n,(2*n+1));
-	    	X.SetSubMatrix(0, n, 0, 1, x);
-
-	    	Matrix<double> Y_plus_A = Y.Add(A);	
-	    	X.SetSubMatrix(0, n, 1, n, Y_plus_A);
-	    	
-	    	Matrix<double> Y_minus_A = Y.Subtract(A);
-	    	X.SetSubMatrix(0, n, n+1, n, Y_minus_A);
-	    	
-	    	return X;
-	    }
-	}
-}
-

+ 0 - 11
Assets/InfraredProject/WebCamera/Script/ZIM/Other/UKFSharp/UnscentedKalmanFilter.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 22b8246cfcbfb724bafd65c430182a54
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 155 - 88
Assets/InfraredProject/WebCamera/Script/ZIM/ScreenLocate.cs

@@ -2,6 +2,9 @@
 
 using InfraredManager;
 using o0;
+using o0.Geometry2D.Float;
+using o0InfraredLocate.ZIM;
+using SixLabors.ImageSharp.PixelFormats;
 using SLAMUVC;
 using System;
 using System.Collections;
@@ -17,16 +20,11 @@ using Color = UnityEngine.Color;
 using Time = UnityEngine.Time;
 
 [RequireComponent(typeof(Canvas))]
-public partial class ScreenLocate : MonoBehaviour
+public partial class ScreenLocate : o0InfraredCameraHandler
 {
     public InfraredCameraHelper InfraredCameraHelper;
     private const string TAG = "ScreenLocate#";
 
-    public enum InfraredCount : int
-    {
-        Single = 1,
-        Double = 2
-    }
     enum Mode
     {
         InfraredLocate,
@@ -52,7 +50,6 @@ public partial class ScreenLocate : MonoBehaviour
     {
         get
         {
-            infraredCount = InfraredCount.Double;
             return infraredSpotBuffer;
         }
     }
@@ -61,12 +58,13 @@ public partial class ScreenLocate : MonoBehaviour
     {
         get
         {
-            infraredCount = InfraredCount.Single;
             return infraredSpotBuffer[0];
         }
     }
-    public InfraredSpot[] infraredSpotBuffer;
-    public string GetInfraredCount() { return infraredCount.ToString(); }
+    public InfraredSpot[] infraredSpotBuffer => infraredLocate.InfraredSpotBuffer;
+
+    // 当前 应用/生效 的屏幕四边形数据(QuadrilateralInCamera类)
+    public QuadrilateralInCamera CurrentScreenQuad => screenIdentification.Screen.QuadInCamera;
 
     /// <summary>
     /// 定位之后,可能有3种结果(手动、半自动、自动),从中选择一种作为最终识别到的屏幕。
@@ -74,6 +72,19 @@ public partial class ScreenLocate : MonoBehaviour
     /// </summary>
     public bool SelectScreenAfterLocate(ScreenIdentificationTag tag) => ScreenIdentification.SelectScreenAfterLocate(tag);
 
+    /// 上一次屏幕定位的情况, 还未识别(或识别失败)的时候返回值是null
+    public QuadrilateralInCamera LastQuadState(ScreenIdentificationTag tag)
+    {
+        QuadrilateralInCamera target = tag switch
+        {
+            ScreenLocate.ScreenIdentificationTag.Manual => ScreenIdentification.QuadManual,
+            ScreenLocate.ScreenIdentificationTag.SemiAuto => ScreenIdentification.QuadSemiAuto,
+            ScreenLocate.ScreenIdentificationTag.Auto => ScreenIdentification.QuadAuto,
+            _ => null
+        };
+        return target;
+    }
+
     /// <summary>
     /// 上一次半自动识别的情况, 还未识别的时候数组是null
     /// 通过索引获取布尔值,false代表这条边识别失败(回退应用了手动数据), 0-下、1-右、2-上、3-左
@@ -85,15 +96,27 @@ public partial class ScreenLocate : MonoBehaviour
     /// </summary>
     public Texture2D[] OutputTextures => outputTexture2D;
 
-    /// <summary>
-    /// CameraLocation 的偏移量
-    /// </summary>
-    public Vector2 CameraLocationOffset { get; set; } = new Vector2(0, 0);
+    public Vector2 CameraLocationOffset
+    {
+        get=>infraredLocate.CameraLocationOffset;
+        set{
+            infraredLocate.CameraLocationOffset = value;
+        }
+    }
+    public Vector2 UVOffset
+        {
+        get=>infraredLocate.UVOffset;
+        set{
+            infraredLocate.UVOffset = value;
+        }
+    }
     //用来记录最后一次更新的数据
     Vector2 OldCameraLocationOffset { get; set; } = new Vector2(0, 0);
-    public Vector2 UVOffset { get; set; } = new Vector2(0, 0);
-    //用来记录最后一次更新的数据
+        //用来记录最后一次更新的数据
     Vector2 OldUVOffset { get; set; } = new Vector2(0, 0);
+    
+    //是否单点显示
+    public bool bSinglePoint => infraredLocate.bSinglePoint;
 
     // public InfraredDemo InfraredDemoMain => FindObjectOfType<InfraredDemo>();
 
@@ -125,6 +148,7 @@ public partial class ScreenLocate : MonoBehaviour
     public RectTransform ScreenQuad;
     public Toggle SaveToggle;
     public Toggle FullScreenToggle;
+    public Toggle SingleToggle;
     public LineGenerator UILineGenerator;
 
     public bool ShowScreenQuad = false;
@@ -135,22 +159,19 @@ public partial class ScreenLocate : MonoBehaviour
     public RawImage FullScreenImage;
 
     public PixelCheaker ScreenPixelCheaker;
-    public InfraredSpotSettings InfraredSpotSettings;
-
-    // 全局记录当前算法中的CameraSize,红外识别和屏幕识别都会使用到
-    public o0.Geometry2D.Vector<int> CameraSize { get; set; }
 
     public List<Texture2D> DebugScreenImages = new List<Texture2D>();
     public bool DebugOnZIMDemo = false;
 
     // private SynchronizationContext mainContext;
 
-    //是否单点显示
-    public bool bSinglePoint = true;//默认单点识别
+    public float ReDoLocateCalibrationRatio { get; private set; }  // 半自动定位时校准的距离比例,以手动的结果来校准,离手动太远的线段会被舍弃
 
-    [NonSerialized] public InfraredCount infraredCount = InfraredCount.Single;  // 识别红外灯的数量,1个或者2个
+    public void SetCameraSize(Vector size) => cameraSize = size;
+    public override Vector CameraSize => cameraSize;
+    // 记录算法中的CameraSize,红外识别和屏幕识别都会使用到
+    Vector cameraSize;
 
-    public float ReDoLocateCalibrationRatio { get; private set; }  // 半自动定位时校准的距离比例,以手动的结果来校准,离手动太远的线段会被舍弃
 
     bool bIdentifyRed = true;//默认设备红色
 
@@ -320,11 +341,10 @@ public partial class ScreenLocate : MonoBehaviour
 
         if (DebugScreenImages.Count != 0 && DebugOnZIMDemo)
         {
-            screenIdentification = new o0.Project.ScreenIdentification();
+            screenIdentification = new o0.Project.ScreenIdentification(this);
             screenIdentification.LocateScreen();
         }
 
-        infraredCount = InfraredCount.Single;
         ReDoLocateCalibrationRatio = 0.125f;
 
         #region 性能检测相关
@@ -337,6 +357,41 @@ public partial class ScreenLocate : MonoBehaviour
         #endregion
     }
 
+    // 初始化算法
+    void AlgorithmInit()
+    {
+        if (screenIdentification == null)
+        {
+            screenIdentification = new o0.Project.ScreenIdentification(this);
+
+            Debug.Log("[ScreenLocate] 初始化屏幕识别");
+            //screenIdentification.OnLocateScreenEnter += OnLocateScreenEnter;
+            screenIdentification.OnLocateScreenEnd += OnLocateScreenEnd;
+
+            //初始化屏幕数据
+            InfraredCameraHelper.InitScreenLocateManual();
+        }
+        if (infraredLocate == null)
+        {
+            infraredLocate = new InfraredLocate(this, screenIdentification.Screen);
+            cameraSize = new Vector(getUVCCameraInfoSize.x, getUVCCameraInfoSize.y);
+            InfraredSpot.RefreshMinVerifyLength(new o0.Geometry2D.Float.Vector(getUVCCameraInfoSize.x, getUVCCameraInfoSize.y));
+
+            Debug.Log($"[ScreenLocate] 初始化红外灯识别, 当前相机分辨率: {CameraSize.x}×{CameraSize.y},红外算法追踪距离: {InfraredSpot.MinVerifyLength}");
+            //InfraredDemo 初始化
+            //float redfilterValue = PlayerPrefs.GetFloat("Init redFilterSliderValue", 0.8f);
+            //Debug.Log("Init Red filterValue:" + redfilterValue);
+            //infraredLocate.SetBrightnessThreshold(redfilterValue);     // 参数是 红外灯的亮度阈值,阈值越小能够检测到的亮度就越低,默认值是0.93
+
+            // UI相关
+            infraredLocate.SetSinglePoint(SingleToggle.isOn);
+            SingleToggle.onValueChanged.AddListener((i) =>
+            {
+                infraredLocate.SetSinglePoint(i);
+            });
+        }
+    }
+
     IEnumerator LateDestoryIEnum(UnityEngine.Object o)
     {
         if (o)
@@ -412,12 +467,8 @@ public partial class ScreenLocate : MonoBehaviour
     /// <param name="value"></param>
     public void SetInfraredLocateBrightnessThreshold(float value)
     {
-
         if (infraredLocate != null)
-        {
-            if (value >= 0 && value <= 1)
-                infraredLocate.SetBrightnessThreshold(value);     // 参数是 红外灯的亮度阈值,阈值越小能够检测到的亮度就越低,默认值是0.93
-        }
+            infraredLocate.SetBrightnessThreshold(value);     // 参数是 红外灯的亮度阈值,阈值越小能够检测到的亮度就越低,默认值是0.93
     }
 
     void Update()
@@ -436,29 +487,7 @@ public partial class ScreenLocate : MonoBehaviour
 
         if (mUVCCameraInfo == null) return;
 
-        if (screenIdentification == null)
-        {
-            screenIdentification = new o0.Project.ScreenIdentification();
-
-            Debug.Log("[ScreenLocate] 初始化屏幕识别");
-            //screenIdentification.OnLocateScreenEnter += OnLocateScreenEnter;
-            screenIdentification.OnLocateScreenEnd += OnLocateScreenEnd;
-
-            //初始化屏幕数据
-            InfraredCameraHelper.InitScreenLocateManual();
-        }
-        if (infraredLocate == null)
-        {
-            infraredLocate = new InfraredLocate(mUVCCameraInfo, screenIdentification, InfraredSpotSettings, ScreenPixelCheaker);
-            CameraSize = new o0.Geometry2D.Vector<int>((int)getUVCCameraInfoSize.x, (int)getUVCCameraInfoSize.y);
-            InfraredSpot.RefreshMinVerifyLength(new o0.Geometry2D.Float.Vector(getUVCCameraInfoSize.x, getUVCCameraInfoSize.y));
-
-            Debug.Log($"[ScreenLocate] 初始化红外灯识别, 当前相机分辨率: {CameraSize.x}×{CameraSize.y},红外算法追踪距离: {InfraredSpot.MinVerifyLength}");
-            //InfraredDemo 初始化
-            //float redfilterValue = PlayerPrefs.GetFloat("Init redFilterSliderValue", 0.8f);
-            //Debug.Log("Init Red filterValue:" + redfilterValue);
-            //infraredLocate.SetBrightnessThreshold(redfilterValue);     // 参数是 红外灯的亮度阈值,阈值越小能够检测到的亮度就越低,默认值是0.93
-        }
+        AlgorithmInit();
 
         /* New*/
         //Debug.Log((mUVCCameraInfo != null) +" = "+ mUVCCameraInfo.IsPreviewing + " = "+ screenIdentification.Screen.Active);
@@ -527,11 +556,8 @@ public partial class ScreenLocate : MonoBehaviour
                 // 获取像素,用于后续操作
                 var pixels = mUVCTexture2D.GetPixels();       // 从左往右、从下往上
 
-                AutoLightPixels(pixels, CameraSize.x, CameraSize.y);
-                if (bSinglePoint)
-                    infraredSpotBuffer = infraredLocate.UpdateSingle(pixels);
-                else
-                    infraredSpotBuffer = infraredLocate.Update(pixels);
+                AutoLightPixels(pixels, CameraWidth, CameraHeight);
+                InfraredUpdate(pixels);
 
                 if (mode == Mode.ScreenLocateManual)
                 {
@@ -733,15 +759,23 @@ public partial class ScreenLocate : MonoBehaviour
         }
     }
 
+    public void InfraredUpdate(Color[] cameraPixels)
+    {
+        infraredLocate.InfraredUpdate(cameraPixels);
+
+        if (DebugOnZIMDemo)
+            DebugPixelSpotArea(infraredLocate.DebugAreas);
+    }
+
     private bool RefreshCameraSize()
     {
-        var sizeNew = new o0.Geometry2D.Vector<int>((int)getUVCCameraInfoSize.x, (int)getUVCCameraInfoSize.y);
+        var sizeNew = new Vector(getUVCCameraInfoSize.x, getUVCCameraInfoSize.y);
         var sizeNewFloat = getUVCCameraInfoSize.o0Vector();
         if (sizeNew != CameraSize || (screenIdentification?.Screen?.QuadInCamera != null && sizeNewFloat != screenIdentification.Screen.QuadInCamera.CameraSize)) 
         {
             Debug.Log($"<color=aqua>[ScreenLocate] 分辨率变化,刷新分辨率(from {CameraSize.x}×{CameraSize.y} to {sizeNew.x}×{sizeNew.y}), 是否有屏幕数据: {screenIdentification.Screen.QuadInCamera != null}, 是否有手动数据: {screenIdentification.QuadManual != null}</color>");
             // 同步相机分辨率
-            CameraSize = sizeNew;
+            cameraSize = sizeNew;
             
             screenIdentification.Screen.RefreshCameraSize(sizeNewFloat);
             screenIdentification.QuadAuto?.ReSize(sizeNewFloat, ScreenMap.ViewAspectRatioSetting);
@@ -786,7 +820,54 @@ public partial class ScreenLocate : MonoBehaviour
         if (Vector2.Distance(np, _targetPoints2[index]) >= filterDis)
         {
             _targetPoints2[index] = np;
-            InfraredCameraHelper.InvokeOnPositionUpdate2(_targetPoints2[index], index);
+            InfraredCameraHelper?.InvokeOnPositionUpdate2(_targetPoints2[index], index);
+        }
+    }
+
+    public void DebugPixelSpotArea(List<PixelSpotArea> areas)
+    {
+        if (areas!=null)
+        {
+            Info.transform.GetChild(0).GetComponent<Text>().text = $"areas.Count: {areas.Count}";
+            PixelSpotArea a0 = null;  // 表示最大半径的区域
+            PixelSpotArea a1 = null;  // 表示第二大半径的区域
+
+            foreach (var a in areas)
+            {
+                if (a0 == null || a.Radius > a0.Radius)
+                {
+                    a1 = a0;  // 更新第二大为之前最大
+                    a0 = a;   // 更新最大为当前的
+                }
+                else if (a1 == null || a.Radius > a1.Radius)
+                {
+                    a1 = a;   // 更新第二大
+                }
+            }
+
+            Texture2D texture = new Texture2D(CameraWidth, CameraHeight);
+            Color[] blackPixels = new Color[texture.width * texture.height];
+            for (int i = 0; i < blackPixels.Length; i++)
+                blackPixels[i] = Color.black;
+            texture.SetPixels(blackPixels);
+
+            if (a0 != null)
+            {
+                foreach (var p in a0.Pixels0)
+                    texture.SetPixel((int)p.x, (int)p.y, Color.yellow);
+                foreach (var p in a0.Pixels1)
+                    texture.SetPixel((int)p.x, (int)p.y, Color.white);
+            }
+            if (a1 != null)
+            {
+                foreach (var p in a1.Pixels0)
+                    texture.SetPixel((int)p.x, (int)p.y, Color.green);
+                foreach (var p in a1.Pixels1)
+                    texture.SetPixel((int)p.x, (int)p.y, Color.blue);
+            }
+
+            texture.Apply();
+            DebugTexture(6, texture);
         }
     }
 
@@ -803,7 +884,7 @@ public partial class ScreenLocate : MonoBehaviour
         if (DebugScreenImages.Count != 0)
         {
             //screenIdentification = new o0.Project.ScreenIdentification();
-            CameraSize = new o0.Geometry2D.Vector<int>(DebugScreenImages[0].width, DebugScreenImages[0].height);
+            cameraSize = new Vector(DebugScreenImages[0].width, DebugScreenImages[0].height);
             WebCamIsReady(DebugScreenImages[0]);
 
             CreateUVCTexture2DIfNeeded();
@@ -1089,21 +1170,15 @@ public partial class ScreenLocate : MonoBehaviour
 
     }
 
-    public Vector2 AdjustPointsOffset(Vector2 inputPoint, string type = "CameraLocation")
-    {
-        // 计算从原始中心到输入点的偏移量
-        if (type == "CameraLocation")
-        {
-            OldCameraLocationOffset = CameraLocationOffset = inputPoint - screenIdentification.Screen.TransformToCamera(new Vector2(0.5f, 0.5f) * screenIdentification.Screen.UVSize);
-            return CameraLocationOffset;
-        }
-        else
-        {
-            //ScreenUV
-            OldUVOffset = UVOffset = inputPoint - new Vector2(0.5f, 0.5f);
-            return UVOffset;
-        }
-    }
+    public void SetSinglePoint(bool value)=> infraredLocate.SetSinglePoint(value);
+    public bool IsSinglePoint() => infraredLocate.IsSinglePoint();
+
+    public Vector2 AdjustPointsOffset(Vector2 inputPoint, string type = "CameraLocation") => infraredLocate.GetCenterOffset(inputPoint, type);
+    /// <summary>
+    /// 重置偏移量
+    /// </summary>
+    public void ResetPointsOffest() => infraredLocate.ResetCenterOffset();
+
     /// <summary>
     /// 初始化记录值
     /// </summary>
@@ -1126,14 +1201,6 @@ public partial class ScreenLocate : MonoBehaviour
         }
     }
     /// <summary>
-    /// 重置偏移量
-    /// </summary>
-    public void ResetPointsOffest()
-    {
-        CameraLocationOffset = Vector2.zero;
-        UVOffset = Vector2.zero;
-    }
-    /// <summary>
     /// 撤销操作,
     /// </summary>
     public void RevokePointsOffest() {
@@ -1176,7 +1243,7 @@ public partial class ScreenLocate : MonoBehaviour
             foreach (var i in CrosshairInScreen)
                 i.gameObject.SetActive(false);
             FullScreenImage.gameObject.SetActive(false);
-            ScreenPixelCheaker.HideImage();
+            ScreenPixelCheaker?.HideImage();
             //Info.transform.SetSiblingIndex(transform.childCount - 4);
             this.mode = Mode.InfraredLocate;
 
@@ -1188,7 +1255,7 @@ public partial class ScreenLocate : MonoBehaviour
         {
             Info.text = "左键单击屏幕 左下角";
             FullScreenImage.gameObject.SetActive(true);
-            ScreenPixelCheaker.ShowImage();
+            ScreenPixelCheaker?.ShowImage();
             //Info.transform.SetSiblingIndex(transform.childCount - 1);
 
             // var newTex = WebCamera.webCamTexture.AutoLight(10);

+ 3 - 189
Assets/InfraredProject/WebCamera/Script/ZIM/ZIMUnity/Extension.cs

@@ -1,4 +1,5 @@
 using o0.Geometry2D.Float;
+using o0InfraredLocate.ZIM;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -11,15 +12,6 @@ namespace ZIM.Unity
 {
     public static partial class Extension
     {
-        public static Vector2 UnityVector(this Vector v)
-        {
-            return new Vector2(v.x, v.y);
-        }
-
-        public static Vector o0Vector(this Vector2 v)
-        {
-            return new Vector(v.x, v.y);
-        }
 
         public static UnityEngine.Color UnityColor(this o0.Color c)
         {
@@ -31,154 +23,16 @@ namespace ZIM.Unity
             return new o0.Color(c.r, c.g, c.b, c.a);
         }
 
-        public static Color RGBMutiply(this UnityEngine.Color c, float multiplier)
-        {
-            return new Color(c.r * multiplier, c.g * multiplier, c.b * multiplier, c.a);
-        }
-
-        public static Vector2 Size(this Texture tex) => new Vector2(tex.width, tex.height);
-
-        private static Dictionary<Color, string> colorNames = new Dictionary<Color, string>()
-        {
-            { Color.red, "Red" },
-            { Color.green, "Green" },
-            { Color.blue, "Blue" },
-            { Color.black, "Black" },
-            { Color.white, "White" },
-            { Color.yellow, "Yellow" },
-            { Color.cyan, "Cyan" },
-            { Color.magenta, "Magenta" },
-            // Add more predefined colors here
-        };
-        public static string GetColorName(this UnityEngine.Color c)
-        {
-            if (colorNames.TryGetValue(c, out var name))
-                return name;
-            return c.ToString();
-        }
-        public static string GetColorName(this UnityEngine.Color? c)
-        {
-            if (c == null)
-                return "null";
-            return c.Value.GetColorName();
-        }
-
-        public static float Brightness(this Color c)
-        {
-            return 0.59f * c.r + 0.3f * c.g + 0.11f * c.b;    // 红色为主
-        }
-
-        public static float Lightness(this Color c)
-        {
-            return Mathf.Max(c.r, c.g, c.b);
-        }
-
-        // 转换为整数再计算
-        public static int Brightness(this Color c, int colorBits)
-        {
-            colorBits -= 1;
-            int r = (int)(c.r * colorBits);
-            int g = (int)(c.g * colorBits);
-            int b = (int)(c.b * colorBits);
-            return (int)(0.59f * r + 0.3f * g + 0.11f * b);    // 红色为主
-        }
-
-        // a 融合b,颜色直接相加
-        public static Texture2D Merge(this Texture2D a, Texture2D b)
-        {
-            if (a.width != b.width || a.height != b.height)
-                throw new InvalidOperationException("尺寸不同无法合并texture");
-
-            var pixel0 = a.GetPixels();
-            var pixel1 = b.GetPixels();
-            for (int i = 0; i < pixel0.Length; i++)
-                pixel0[i] += pixel1[i];
-            var texAdd = new Texture2D(a.width, a.height);
-            texAdd.SetPixels(pixel0);
-            texAdd.Apply();
-            return texAdd;
-        }
-
-        // a 覆盖 b,会剔除a的黑色背景
-        public static Texture2D Overlay(this Texture2D a, Texture2D b)
-        {
-            if (a.width != b.width || a.height != b.height)
-                throw new InvalidOperationException("尺寸不同无法叠加texture");
-
-            var pixel0 = a.GetPixels();
-            var pixel1 = b.GetPixels();
-            for (int i = 0; i < pixel0.Length; i++)
-            {
-                float newA = (float)(Math.Clamp((pixel0[i].Lightness() - 0.2) / 0.6, 0, 1) * pixel0[i].a);
-                pixel0[i] = pixel0[i].RGBMutiply(newA) + pixel1[i] * (1 - newA);
-            }
-            var texAdd = new Texture2D(a.width, a.height);
-            texAdd.SetPixels(pixel0);
-            texAdd.Apply();
-            return texAdd;
-        }
-
-        // 长度平方,0-1
-        public static float LengthSquare(this Color c) => (c.r * c.r + c.g * c.g + c.b * c.b) / 3;
-
-        // 像素坐标映射到Unity局部坐标
-        public static Vector2 pixelToLocalPosition_AnchorCenter(this Vector2 pixel, Vector2 size, Rect dstRect)
-        {
-            var xp = pixel.x / size.x - 0.5f;
-            var yp = pixel.y / size.y - 0.5f;
-            //var origin = rawImage.anchoredPosition;
-            return new Vector2(dstRect.width * xp, dstRect.height * yp);
-        }
-        public static Vector2 pixelToLocalPosition_AnchorCenter(this Vector pixel, Vector size, Rect dstRect)
-        {
-            var xp = pixel.x / size.x - 0.5f;
-            var yp = pixel.y / size.y - 0.5f;
-            //var origin = rawImage.anchoredPosition;
-            return new Vector2(dstRect.width * xp, dstRect.height * yp);
-        }
-        // Unity局部坐标转回像素坐标
-        public static Vector2 localPositionToPixel_AnchorCenter(this Vector2 localPosition, Vector2 size, Rect dstRect)
-        {
-            var xp = localPosition.x / dstRect.width + 0.5f;
-            var yp = localPosition.y / dstRect.height + 0.5f;
-            return new Vector2(xp * size.x, yp * size.y);
-        }
-
-
-        // 像素坐标映射到Unity局部坐标
-        public static Vector2 pixelToLocalPosition_AnchorCenter(this Vector2 pixel, o0.Geometry2D.Vector<int> size, Rect dstRect)
-        {
-            var xp = pixel.x / size.x - 0.5f;
-            var yp = pixel.y / size.y - 0.5f;
-            //var origin = rawImage.anchoredPosition;
-            return new Vector2(dstRect.width * xp, dstRect.height * yp);
-        }
-
-        public static Vector2 pixelToLocalPosition_AnchorLeftBottom(this Vector2 pixel, o0.Geometry2D.Vector<int> size, Rect dstRect)
-        {
-            var xp = pixel.x / size.x;
-            var yp = pixel.y / size.y;
-            //var origin = rawImage.anchoredPosition;
-            return new Vector2(dstRect.width * xp, dstRect.height * yp);
-        }
-
-        public static float DegreeToXAxis(this Vector2 v)
-        {
-            var a = v.x > 0 ? Math.Atan(v.y / v.x) * 180 / Math.PI : 180 + Math.Atan(v.y / v.x) * 180 / Math.PI;
-            a = a < 0 ? 360 + a : a;
-            return (float)a;
-        }
-
         public static Texture2D zimAutoLightSimple(this WebCamTexture texture)
         {
             var pixel = texture.GetPixels();
-            return zimAutoLightSimple(pixel, texture.width, texture.height);
+            return pixel.zimAutoLightSimple(texture.width, texture.height);
         }
 
         public static Texture2D zimAutoLightSimple(this Texture2D texture)
         {
             var pixel = texture.GetPixels();
-            return zimAutoLightSimple(pixel, texture.width, texture.height);
+            return pixel.zimAutoLightSimple(texture.width, texture.height);
         }
 
         public static Vector2 Size(this Texture2D texture)
@@ -204,46 +58,6 @@ namespace ZIM.Unity
             return tex;
         }
 
-        // 效率高,效果一般,benny写的效果更好
-        public static Texture2D zimAutoLightSimple(this Color[] pixel, int width, int height)
-        {
-            Color[] p = new Color[pixel.Length];
-
-            var brightness256 = new int[256];
-            for (int i = 0; i < width / 7; i++)     // 间隔采样,得到256色彩下的直方图
-            {
-                for (int j = 0; j < height / 7; j++)
-                {
-                    var index = j * 7 * width + i * 7;
-                    var b = pixel[index].Brightness(256);
-                    brightness256[b]++;
-                }
-            }
-            var limit = (int)(width * height / 49 * 0.001f);    // 取亮度大约在前0.1%的值(不取最大的因为可能会被个别亮点影响)
-            int select = 255;
-            for (; select >= 0; select--)
-            {
-                limit -= brightness256[select];
-                if (limit <= 0)
-                    break;
-            }
-            var scale = 0.85f / (select / 256f);        // 找到高亮的像素,计算放大系数
-
-            //var avgBrightness = 0f;
-            //Parallel.For(0, pixel.Length / 256, (i) => avgBrightness += pixel[i * 256].Brightness());
-            //avgBrightness /= pixel.Length / 256;
-            //var scale = 1 / avgBrightness / 2f;
-
-            if (float.IsInfinity(scale))
-                return null;
-            Parallel.For(0, p.Length, (i) => p[i] = pixel[i].RGBMutiply(scale));
-
-            var tex = new Texture2D(width, height);
-            tex.SetPixels(p);
-            tex.Apply();
-            return tex;
-        }
-
         public static Texture2D zimAutoLight(this WebCamTexture texture)
         {
             var pixel = texture.GetPixels();

+ 1 - 18
Assets/InfraredProject/WebCamera/Script/ZIM/ZIMUnity/ZIMMath.cs

@@ -6,16 +6,6 @@ namespace ZIM.Unity
 {
     public static partial class ZIMMath
     {
-        // 向量与x轴的夹角,返回0-360度
-        public static float DegreeToXAxis(this Vector v)
-        {
-            //var a = v.x > 0 ? Math.Atan(v.y / v.x) * 180 / Math.PI : 180 + Math.Atan(v.y / v.x) * 180 / Math.PI;
-            var a = Math.Atan2(v.y, v.x) * 180 / Math.PI;
-            if (a < 0)
-                a += 360;
-            return (float)a;
-        }
-
         // Projects a vector onto another vector.
         public static Vector2 Project(this Vector2 vector, Vector2 onNormal)
         {
@@ -29,13 +19,6 @@ namespace ZIM.Unity
         public static float LengthManhattan(this Vector2 v) => Math.Abs(v.x) + Math.Abs(v.y);
         public static double LengthManhattan(Vector2 v1, Vector2 v2) => (v1 - v2).LengthManhattan();
 
-        // 可以用于判断点位V于直线AB哪一侧
-        // return的值 等于0: 点在线上,大于0: 三角形ABV是逆时针,小于0: 三角形ABV是顺时针 (注:Line的构造函数会修改AB的顺序)
-        public static float LineCrossWithPoint(this Line l, Vector v)
-        {
-            var ld = l.B - l.A;
-            var vd = v - l.A;
-            return ld.x * vd.y - ld.y * vd.x;
-        }
+
     }
 }

+ 10 - 10
Assets/InfraredProject/WebCamera/Script/ZIM/o0Extension/o0Extension.cs

@@ -5,17 +5,17 @@ namespace o0.Project
 {
     internal class o0Extension
     {
-        public static void DrawLine(Matrix matrix, Line line, Func<int, int, float> setValue, Geometry2D.Float.Vector size = default, bool dashedLine = false)
+        public static void DrawLine(Matrix matrix, Line line, Func<int, int, float> setValue, Vector size = default, bool dashedLine = false)
         {
             if (line == null || matrix == null)
                 return;
             if (size == default)
-                size = new Geometry2D.Float.Vector(0, 1);
+                size = new Vector(0, 1);
             if (size.x != 0)
             {
                 var halfExtLength = size.x / 2;
-                var offset = new Geometry2D.Float.Vector(halfExtLength / line.Length * (line.B.x - line.A.x), halfExtLength / line.Length * (line.B.y - line.A.y));
-                line = new Geometry2D.Float.Line(line.A - offset, line.B + offset);
+                var offset = new Vector(halfExtLength / line.Length * (line.B.x - line.A.x), halfExtLength / line.Length * (line.B.y - line.A.y));
+                line = new Line(line.A - offset, line.B + offset);
             }
 
             void _draw(int x, int y)
@@ -51,10 +51,10 @@ namespace o0.Project
                         _draw(x, y);
                 return;
             }
-            var upOffset = new Geometry2D.Float.Vector(halfWidth / line.Length * (line.A.y - line.B.y), halfWidth / line.Length * (line.B.x - line.A.x));
+            var upOffset = new Vector(halfWidth / line.Length * (line.A.y - line.B.y), halfWidth / line.Length * (line.B.x - line.A.x));
             if (upOffset.y < 0)
                 upOffset = -upOffset;
-            Geometry2D.Float.Vector up, down, left, right;
+            Vector up, down, left, right;
             if (upOffset.x < 0)//0-90度
             {
                 up = line.B + upOffset;
@@ -69,10 +69,10 @@ namespace o0.Project
                 left = line.A - upOffset;
                 right = line.B + upOffset;
             }
-            var topLeft = new Geometry2D.Float.Line(left, up);
-            var bottomLeft = new Geometry2D.Float.Line(left, down);
-            var topRight = new Geometry2D.Float.Line(up, right);
-            var bottomRight = new Geometry2D.Float.Line(down, right);
+            var topLeft = new Line(left, up);
+            var bottomLeft = new Line(left, down);
+            var topRight = new Line(up, right);
+            var bottomRight = new Line(down, right);
 
             var topLeftXToYRate = topLeft.XToYRate;
             var bottomLeftXToYRate = bottomLeft.XToYRate;

File diff suppressed because it is too large
+ 355 - 30
Assets/InfraredProject/WebCamera/zimWebCamera.unity


+ 1 - 2
Assets/InfraredProject/o0/o0IdentifyLineLSD.cs

@@ -1,5 +1,4 @@
-using o0.Geometry;
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;

+ 1 - 0
Assets/InfraredProject/o0/zimIdentifyLineLSD.cs

@@ -6,6 +6,7 @@ using UnityEngine;
 using o0.Geometry2D.Float;
 using ZIM.Unity;
 using o0.Num;
+using o0InfraredLocate.ZIM;
 
 namespace o0.Project
 {

+ 8 - 0
Assets/Plugins/o0InfraredLocate.meta

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

+ 675 - 0
Assets/Plugins/o0InfraredLocate/o0InfraredLocate.deps.json

@@ -0,0 +1,675 @@
+{
+  "runtimeTarget": {
+    "name": ".NETStandard,Version=v2.0/",
+    "signature": ""
+  },
+  "compilationOptions": {},
+  "targets": {
+    ".NETStandard,Version=v2.0": {},
+    ".NETStandard,Version=v2.0/": {
+      "o0InfraredLocate/1.0.0": {
+        "dependencies": {
+          "NETStandard.Library": "2.0.3",
+          "MathNet.Numerics": "4.15.0.0",
+          "o0NetLib": "1.0.0.0",
+          "UnityEditor.CoreModule": "0.0.0.0",
+          "UnityEngine.CoreModule": "0.0.0.0"
+        },
+        "runtime": {
+          "o0InfraredLocate.dll": {}
+        }
+      },
+      "Microsoft.NETCore.Platforms/1.1.0": {},
+      "NETStandard.Library/2.0.3": {
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0"
+        }
+      },
+      "MathNet.Numerics/4.15.0.0": {
+        "runtime": {
+          "MathNet.Numerics.dll": {
+            "assemblyVersion": "4.15.0.0",
+            "fileVersion": "4.15.0.0"
+          }
+        }
+      },
+      "o0NetLib/1.0.0.0": {
+        "runtime": {
+          "o0NetLib.dll": {
+            "assemblyVersion": "1.0.0.0",
+            "fileVersion": "1.0.0.0"
+          }
+        }
+      },
+      "UnityEditor.CoreModule/0.0.0.0": {
+        "runtime": {
+          "UnityEditor.CoreModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.CoreModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.CoreModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.SharedInternalsModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.SharedInternalsModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.IMGUIModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.IMGUIModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.UIElementsModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.UIElementsModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.TerrainModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.TerrainModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.PhysicsModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.PhysicsModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.UnityAnalyticsCommonModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.UnityAnalyticsCommonModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.AnimationModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.AnimationModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.TilemapModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.TilemapModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.ParticleSystemModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.ParticleSystemModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.TextRenderingModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.TextRenderingModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "Unity.Cecil/0.10.0.0": {
+        "runtime": {
+          "Unity.Cecil.dll": {
+            "assemblyVersion": "0.10.0.0",
+            "fileVersion": "0.10.0.0"
+          }
+        }
+      },
+      "UnityEngine.VideoModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.VideoModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.AudioModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.AudioModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.AssetBundleModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.AssetBundleModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.InputLegacyModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.InputLegacyModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.Physics2DModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.Physics2DModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.XRModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.XRModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.VRModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.VRModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.UIModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.UIModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.ClothModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.ClothModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.DirectorModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.DirectorModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.VirtualTexturingModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.VirtualTexturingModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.AIModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.AIModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.StreamingModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.StreamingModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.WindModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.WindModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.GridModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.GridModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.TerrainPhysicsModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.TerrainPhysicsModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.VehiclesModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.VehiclesModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.SpriteMaskModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.SpriteMaskModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.UnityAnalyticsModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.UnityAnalyticsModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.SubsystemsModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.SubsystemsModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.VFXModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.VFXModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.SpriteShapeModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.SpriteShapeModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.ImageConversionModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.ImageConversionModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.UnityConnectModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.UnityConnectModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.PerformanceReportingModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.PerformanceReportingModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.JSONSerializeModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.JSONSerializeModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.AccessibilityModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.AccessibilityModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.UnityWebRequestModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.UnityWebRequestModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.ScreenCaptureModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.ScreenCaptureModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.UNETModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.UNETModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.UIElementsNativeModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.UIElementsNativeModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.TextCoreTextEngineModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.TextCoreTextEngineModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      },
+      "UnityEngine.TextCoreFontEngineModule/0.0.0.0": {
+        "runtime": {
+          "UnityEngine.TextCoreFontEngineModule.dll": {
+            "assemblyVersion": "0.0.0.0",
+            "fileVersion": "0.0.0.0"
+          }
+        }
+      }
+    }
+  },
+  "libraries": {
+    "o0InfraredLocate/1.0.0": {
+      "type": "project",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "Microsoft.NETCore.Platforms/1.1.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==",
+      "path": "microsoft.netcore.platforms/1.1.0",
+      "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512"
+    },
+    "NETStandard.Library/2.0.3": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
+      "path": "netstandard.library/2.0.3",
+      "hashPath": "netstandard.library.2.0.3.nupkg.sha512"
+    },
+    "MathNet.Numerics/4.15.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "o0NetLib/1.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEditor.CoreModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.CoreModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.SharedInternalsModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.IMGUIModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.UIElementsModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.TerrainModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.PhysicsModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.UnityAnalyticsCommonModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.AnimationModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.TilemapModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.ParticleSystemModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.TextRenderingModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "Unity.Cecil/0.10.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.VideoModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.AudioModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.AssetBundleModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.InputLegacyModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.Physics2DModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.XRModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.VRModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.UIModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.ClothModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.DirectorModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.VirtualTexturingModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.AIModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.StreamingModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.WindModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.GridModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.TerrainPhysicsModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.VehiclesModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.SpriteMaskModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.UnityAnalyticsModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.SubsystemsModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.VFXModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.SpriteShapeModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.ImageConversionModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.UnityConnectModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.PerformanceReportingModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.JSONSerializeModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.AccessibilityModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.UnityWebRequestModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.ScreenCaptureModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.UNETModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.UIElementsNativeModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.TextCoreTextEngineModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "UnityEngine.TextCoreFontEngineModule/0.0.0.0": {
+      "type": "reference",
+      "serviceable": false,
+      "sha512": ""
+    }
+  }
+}

+ 7 - 0
Assets/Plugins/o0InfraredLocate/o0InfraredLocate.deps.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e7536714bfffe4c46a2a699d5e59d177
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/Plugins/o0InfraredLocate/o0InfraredLocate.dll


+ 33 - 0
Assets/Plugins/o0InfraredLocate/o0InfraredLocate.dll.meta

@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: 9a174c712b8a1484c87eb33b30fe7b0c
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      Any: 
+    second:
+      enabled: 1
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        DefaultValueInitialized: true
+  - first:
+      Windows Store Apps: WindowsStoreApps
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/Plugins/o0InfraredLocate/o0InfraredLocate.pdb


+ 7 - 0
Assets/Plugins/o0InfraredLocate/o0InfraredLocate.pdb.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5bd739fdc1a8d79478da821b99a1f263
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/Plugins/o0InfraredLocate/准心识别接口_v1.0_20241224.docx


+ 7 - 0
Assets/Plugins/o0InfraredLocate/准心识别接口_v1.0_20241224.docx.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e98ab858dcdaa824b9986821fc4c69ac
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 2 - 1
Assets/SmartBow/Resources/SmartBow/Prefabs/ZIM/BtnRecordInfrared.cs

@@ -1,4 +1,5 @@
-using System.Collections;
+using o0InfraredLocate.ZIM;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using UnityEngine;

+ 4 - 9
Assets/SmartBow/Resources/SmartBow/Prefabs/ZIM/PixelCheaker.cs

@@ -1,13 +1,10 @@
-using o0.Geometry2D;
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using Unity.VisualScripting;
+using o0.Geometry2D.Float;
+using o0InfraredLocate.ZIM;
 using UnityEngine;
 using UnityEngine.UI;
 
 // 用椭圆标记要识别的区域,区域外的像素会被剔除
-public class PixelCheaker : MonoBehaviour
+public class PixelCheaker : MonoBehaviour, IPixelCheaker
 {
     public Image Bordermage;            // 椭圆的图片
     public RectTransform BorderArea;    // 椭圆的大小区域,调整这个gameobject的scale作为椭圆的区域
@@ -22,9 +19,8 @@ public class PixelCheaker : MonoBehaviour
     //public bool OutArea2D(Vector2 pixelPosition, Vector<int> imageSize, out float f) => OutArea2D(new Vector2(pixelPosition.x / imageSize.x, pixelPosition.y / imageSize.y), out f);
     //public bool OutArea2D(Vector2 pixelPosition, Vector2 imageSize, out float f) => OutArea2D(pixelPosition / imageSize, out f);
     //public bool OutArea2D(o0.Geometry2D.Float.Vector pixelPosition, Vector<int> imageSize, out float f) => OutArea2D(new Vector2(pixelPosition.x / imageSize.x, pixelPosition.y / imageSize.y), out f);
-    public bool OutArea2D(Vector2 pixelPosition, Vector<int> imageSize) => OutArea2D(new Vector2(pixelPosition.x / imageSize.x, pixelPosition.y / imageSize.y));
     public bool OutArea2D(Vector2 pixelPosition, Vector2 imageSize) => OutArea2D(pixelPosition / imageSize);
-    public bool OutArea2D(o0.Geometry2D.Float.Vector pixelPosition, Vector<int> imageSize) => OutArea2D(new Vector2(pixelPosition.x / imageSize.x, pixelPosition.y / imageSize.y));
+    public bool OutArea2D(Vector pixelPosition, Vector imageSize)=> OutArea2D(new Vector2(pixelPosition.x / imageSize.x, pixelPosition.y / imageSize.y));
 
     // out 椭圆的距离系数,越大表示离椭圆越远
     //private bool OutArea2D(Vector2 pixelUV, out float f)
@@ -51,5 +47,4 @@ public class PixelCheaker : MonoBehaviour
 
     public void ShowImage() => Bordermage.enabled = true;
     public void HideImage() => Bordermage.enabled = false;
-
 }

+ 3 - 1
Assets/SmartBow/Scripts/Views/InfraredViewParts/InfraredScreenPositioningView.cs

@@ -12,6 +12,7 @@ using Org.BouncyCastle.Asn1.Crmf;
 using ZIM.Unity;
 using o0.Project;
 using UnityEngine.SceneManagement;
+using o0InfraredLocate.ZIM;
 
 public enum ScreenPositioningStep { 
   None, //
@@ -23,6 +24,7 @@ public enum ScreenPositioningStep {
   Successful,//结果选择界面
 }
 
+
 public class LinePosition
 {
     public int index;
@@ -313,7 +315,7 @@ public class InfraredScreenPositioningView : JCUnityLib.ViewBase
             markerPointsLine.MyFanWidth = line.MyFanWidth = infraredDemo.fanWidth.Get();
 
 
-            ZIM.Unity.QuadrilateralInCamera screen = ScreenLocate.Main.ScreenIdentification.Screen.QuadInCamera;
+            QuadrilateralInCamera screen = ScreenLocate.Main.ScreenIdentification.Screen.QuadInCamera;
             CurrentUILineGenerator.Points = infraredDemo.ConvertQuadToPoints(screen, ScreenLocate.Main.getUVCCameraInfoSize);
 
         }

+ 49 - 48
Assets/SmartBow/Scripts/Views/InfraredViewParts/PointMarker.cs

@@ -1,36 +1,37 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 using UnityEngine.UI;
 using System.Collections.Generic;
 using System;
 using ZIM.Unity;
 using System.Linq;
+using o0InfraredLocate.ZIM;
 
 public class PointMarker : MonoBehaviour
 {
-    //public Text instructionText; // 用于显示提示文字
-    [Tooltip("标记页面标题提示")]
+    //public Text instructionText; // 鐢ㄤ簬鏄剧ず鎻愮ず鏂囧瓧
+    [Tooltip("鏍囪�椤甸潰鏍囬�鎻愮ず")]
     [SerializeField] TextAutoLanguage2 instructionText;
-    public Button undoButton;    // 撤回按钮
-    public Button completeButton; // 完成按钮
-    public bool bComplete = false;// 是否完成
-    public GameObject markerPrefab; // 用于表示标记的UI元素,可能是一个小图标(如枪)
+    public Button undoButton;    // 鎾ゅ洖鎸夐挳
+    public Button completeButton; // 瀹屾垚鎸夐挳
+    public bool bComplete = false;// 鏄�惁瀹屾垚
+    public GameObject markerPrefab; // 鐢ㄤ簬琛ㄧず鏍囪�鐨刄I鍏冪礌锛屽彲鑳芥槸涓€涓�皬鍥炬爣锛堝�鏋�級
 
-    // 新增父对象,用于存放标记的物体
-    public Transform markerParent; // 标记物体的父对象(例如Canvas中的一个空物体)
+    // 鏂板�鐖跺�璞★紝鐢ㄤ簬瀛樻斁鏍囪�鐨勭墿浣�
+    public Transform markerParent; // 鏍囪�鐗╀綋鐨勭埗瀵硅薄锛堜緥濡侰anvas涓�殑涓€涓�┖鐗╀綋锛�
 
-    public Image[] hintImages; // 依次存放左上、右上、右下、左下四个提示图片
+    public Image[] hintImages; // 渚濇�瀛樻斁宸︿笂銆佸彸涓娿€佸彸涓嬨€佸乏涓嬪洓涓�彁绀哄浘鐗�
 
     Vector2 oldPoint = Vector2.zero;
     private List<Vector2> markedPoints = new List<Vector2>();
-    // { "左上", "右上", "右下", "左下" }
+    // { "宸︿笂", "鍙充笂", "鍙充笅", "宸︿笅" }
     private string[] directions = { "TipTopLeft", "TipTopRight", "TipBottomRight", "TipBottomLeft" };
-    private int currentPointIndex = 0; // 当前需要标记的点的索引
-    private List<GameObject> markerObjects = new List<GameObject>(); // 记录标记物体
+    private int currentPointIndex = 0; // 褰撳墠闇€瑕佹爣璁扮殑鐐圭殑绱㈠紩
+    private List<GameObject> markerObjects = new List<GameObject>(); // 璁板綍鏍囪�鐗╀綋
 
     [SerializeField] InfraredScreenPositioningView infraredScreenPositioningView;
 
-    [Tooltip("存在校准数据时候显示")]
-    [SerializeField] ZIM.LineGenerator line;//开始显示屏幕线条
+    [Tooltip("瀛樺湪鏍″噯鏁版嵁鏃跺€欐樉绀�")]
+    [SerializeField] ZIM.LineGenerator line;//寮€濮嬫樉绀哄睆骞曠嚎鏉�
 
 
     void Start()
@@ -39,10 +40,10 @@ public class PointMarker : MonoBehaviour
 
         UpdateInstruction();
         undoButton.onClick.AddListener(UndoLastPoint);
-        completeButton.onClick.AddListener(CompletePoint); // 初始化时隐藏完成按钮
+        completeButton.onClick.AddListener(CompletePoint); // 鍒濆�鍖栨椂闅愯棌瀹屾垚鎸夐挳
         bComplete = false;
 
-        // 初始化时,显示第一个提示图片,其余隐藏
+        // 鍒濆�鍖栨椂锛屾樉绀虹�涓€涓�彁绀哄浘鐗囷紝鍏朵綑闅愯棌
         ShowHintImage(0);
 
     }
@@ -51,15 +52,15 @@ public class PointMarker : MonoBehaviour
         if (AimHandler.ins) AimHandler.ins.OnCrossBtnEvent -= OnRecordInfrared;
     }
     private float lastClickTime = 0f;
-    private float doubleClickThreshold = 0.3f; // 双击间隔时间,单位:秒
+    private float doubleClickThreshold = 0.3f; // 鍙屽嚮闂撮殧鏃堕棿锛屽崟浣嶏細绉�
     void Update()
     {
-        if (Input.GetMouseButtonDown(0)) // 检测左键按下
+        if (Input.GetMouseButtonDown(0)) // 妫€娴嬪乏閿�寜涓�
         {
             float currentTime = Time.time;
             if (currentTime - lastClickTime <= doubleClickThreshold)
             {
-                // 双击检测成功,执行触发逻辑
+                // 鍙屽嚮妫€娴嬫垚鍔燂紝鎵ц�瑙﹀彂閫昏緫
                 if (currentPointIndex >= 4) return;
 
                 var mouse = Input.mousePosition;
@@ -71,10 +72,10 @@ public class PointMarker : MonoBehaviour
                 Vector2 pos = new Vector2(u * ScreenLocate.Main.getUVCTexture.width, v * ScreenLocate.Main.getUVCTexture.height);
                 //markedPoints.Add(pos);
                 oldPoint = new Vector2(u, v);
-                // 设置标记的位置
+                // 璁剧疆鏍囪�鐨勪綅缃�
                 MarkPoint(new Vector2(u, v).pixelToLocalPosition_AnchorCenter(new Vector2(1, 1), markerParent.GetComponent<RectTransform>().rect));
             }
-            lastClickTime = currentTime; // 更新上一次点击时间
+            lastClickTime = currentTime; // 鏇存柊涓婁竴娆$偣鍑绘椂闂�
         }
         //#if UNITY_EDITOR
         //if (Input.GetKeyDown(KeyCode.Alpha6) || Input.GetMouseButtonDown(1))
@@ -90,13 +91,13 @@ public class PointMarker : MonoBehaviour
         //    v = Math.Clamp(v, 0, 1);
         //    Vector2 pos = new Vector2(u * ScreenLocate.Main.getUVCTexture.width, v * ScreenLocate.Main.getUVCTexture.height);
         //    markedPoints.Add(pos);
-        //    // 设置标记的位置
+        //    // 璁剧疆鏍囪�鐨勪綅缃�
         //    MarkPoint(new Vector2(u, v).pixelToLocalPosition_AnchorCenter(new Vector2(1, 1), markerParent.GetComponent<RectTransform>().rect));
         //}
         //#endif
     }
     /// <summary>
-    /// 记录红外点
+    /// 璁板綍绾㈠�鐐�
     /// </summary>
     public void OnRecordInfrared()
     {
@@ -113,26 +114,26 @@ public class PointMarker : MonoBehaviour
     void MarkPoint(Vector2 point)
     {
         if (!infraredScreenPositioningView.IsPointInMaskLine(point)) {
-            Debug.Log("不在梯形内部!");
+            Debug.Log("涓嶅湪姊�舰鍐呴儴锛�");
             instructionText.SetTextKey("TipMarkerError");
             return;
         }
-        // 创建标记物体,并将其作为markerParent的子对象
+        // 鍒涘缓鏍囪�鐗╀綋锛屽苟灏嗗叾浣滀负markerParent鐨勫瓙瀵硅薄
         GameObject marker = Instantiate(markerPrefab, markerParent);
         marker.SetActive(true);
         marker.transform.localPosition = point;
         markerObjects.Add(marker);
-        //绘制连线
+        //缁樺埗杩炵嚎
         markedPoints.Add(point);
         UpdateLine();
 
-        // 隐藏当前的提示图片,显示下一个提示图片
+        // 闅愯棌褰撳墠鐨勬彁绀哄浘鐗囷紝鏄剧ず涓嬩竴涓�彁绀哄浘鐗�
         currentPointIndex++;
         ShowHintImage(currentPointIndex);
 
         UpdateInstruction();
 
-        // 如果已经标记了四个点,显示完成按钮
+        // 濡傛灉宸茬粡鏍囪�浜嗗洓涓�偣锛屾樉绀哄畬鎴愭寜閽�
         if (currentPointIndex == 4)
         {
             Vector2[] points = { 
@@ -142,7 +143,7 @@ public class PointMarker : MonoBehaviour
                 markerObjects[3].transform.localPosition, 
             };
             bool result = infraredScreenPositioningView.IsValidQuadrilateral(points);
-            Debug.Log(result ? "是有效的四边形" : "不是有效的四边形");
+            Debug.Log(result ? "鏄�湁鏁堢殑鍥涜竟褰�" : "涓嶆槸鏈夋晥鐨勫洓杈瑰舰");
             if (result)
             {
                 instructionText.SetTextKey("TipMarkComplete");
@@ -150,7 +151,7 @@ public class PointMarker : MonoBehaviour
                 bComplete = true;
             }
             else {
-                //不是有效是四边形时候,回退 一个
+                //涓嶆槸鏈夋晥鏄�洓杈瑰舰鏃跺€欙紝鍥為€€ 涓€涓�
                 //instructionText.SetTextKey("TipMarkerError");
                 PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("TipQuadError"));
                 UndoLastPoint();
@@ -162,29 +163,29 @@ public class PointMarker : MonoBehaviour
     {
         if (currentPointIndex > 0)
         {
-            // 移除最后一个标记的点
+            // 绉婚櫎鏈€鍚庝竴涓�爣璁扮殑鐐�
             markedPoints.RemoveAt(markedPoints.Count - 1);
             UpdateLine();
-            // 删除最后一个标记的物体
+            // 鍒犻櫎鏈€鍚庝竴涓�爣璁扮殑鐗╀綋
             Destroy(markerObjects[markerObjects.Count - 1]);
             markerObjects.RemoveAt(markerObjects.Count - 1);
 
-            // 回退到上一个提示图片
+            // 鍥為€€鍒颁笂涓€涓�彁绀哄浘鐗�
             currentPointIndex--;
             ShowHintImage(currentPointIndex);
 
             UpdateInstruction();
         }
 
-        // 隐藏完成按钮
+        // 闅愯棌瀹屾垚鎸夐挳
         bComplete = false;
     }
     /// <summary>
-    /// 移除全部标记,选择自动和半自动数据界面返回时候调用
+    /// 绉婚櫎鍏ㄩ儴鏍囪�锛岄€夋嫨鑷�姩鍜屽崐鑷�姩鏁版嵁鐣岄潰杩斿洖鏃跺€欒皟鐢�
     /// </summary>
     public void UndoAllPoints()
     {
-        // 移除所有标记物体
+        // 绉婚櫎鎵€鏈夋爣璁扮墿浣�
         foreach (var marker in markerObjects)
         {
             Destroy(marker);
@@ -193,21 +194,21 @@ public class PointMarker : MonoBehaviour
 
         markedPoints.Clear();
         UpdateLine();
-        // 重置索引
+        // 閲嶇疆绱㈠紩
         currentPointIndex = 0;
 
-        // 更新提示图片和说明
+        // 鏇存柊鎻愮ず鍥剧墖鍜岃�鏄�
         ShowHintImage(currentPointIndex);
         UpdateInstruction();
 
-        // 隐藏完成按钮
+        // 闅愯棌瀹屾垚鎸夐挳
         bComplete = false;
     }
 
     void UpdateLine() {
         if (line.gameObject.activeSelf) {
             RectTransform rectTransform = markerParent as RectTransform;
-            Vector2 pivot = rectTransform.pivot; // 获取父物体的 pivot 值
+            Vector2 pivot = rectTransform.pivot; // 鑾峰彇鐖剁墿浣撶殑 pivot 鍊�
             Vector2 texSize = rectTransform.rect.size;
             line.Points = InfraredDemo._ins.ConvertPointsToCoordinates(markedPoints.ToArray(), texSize, pivot);
         }
@@ -222,7 +223,7 @@ public class PointMarker : MonoBehaviour
         }
     }
 
-    // 显示当前需要的提示图片,并隐藏其余提示图片
+    // 鏄剧ず褰撳墠闇€瑕佺殑鎻愮ず鍥剧墖锛屽苟闅愯棌鍏朵綑鎻愮ず鍥剧墖
     void ShowHintImage(int index)
     {
         for (int i = 0; i < hintImages.Length; i++)
@@ -234,7 +235,7 @@ public class PointMarker : MonoBehaviour
         }
     }
     /// <summary>
-    /// 如果没有数据时候,可能需要隐藏渲染
+    /// 濡傛灉娌℃湁鏁版嵁鏃跺€欙紝鍙�兘闇€瑕侀殣钘忔覆鏌�
     /// </summary>
     /// <param name="bShow"></param>
     public void ShowHintImageParent(bool bShow)
@@ -246,12 +247,12 @@ public class PointMarker : MonoBehaviour
     }
     void CompletePoint() {
         if (!bComplete) {
-            //Debug.Log("未完成");
-            //todo,加提示
+            //Debug.Log("鏈�畬鎴�");
+            //todo锛屽姞鎻愮ず
             PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("Incomplete"));
             return;
         }
-        //完成,下一步
+        //瀹屾垚锛屼笅涓€姝�
         for (int i = 0; i < 4; i++)
         {
             int index = i;
@@ -259,9 +260,9 @@ public class PointMarker : MonoBehaviour
         }
         infraredScreenPositioningView.onFinishManualToAutomatic();
 
-        ////清空数据
+        ////娓呯┖鏁版嵁
         //currentPointIndex = 0;
-        ////清空生成的数据
+        ////娓呯┖鐢熸垚鐨勬暟鎹�
         //markerObjects.Clear();
         //foreach (Transform i in markerParent.transform)
         //    Destroy(i.gameObject);

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