Forráskód Böngészése

使用新方式进行加载

“hujiajun” 1 éve
szülő
commit
00ce3e54c0
100 módosított fájl, 4144 hozzáadás és 0 törlés
  1. 8 0
      Runtime/SDK.meta
  2. 124 0
      Runtime/SDK/AllMoveEvent.cs
  3. 11 0
      Runtime/SDK/AllMoveEvent.cs.meta
  4. 8 0
      Runtime/SDK/Common.meta
  5. 8 0
      Runtime/SDK/Common/Base.meta
  6. 8 0
      Runtime/SDK/Common/Base/AndroidPlugin.meta
  7. 164 0
      Runtime/SDK/Common/Base/AndroidPlugin/AndroidPluginBase.cs
  8. 11 0
      Runtime/SDK/Common/Base/AndroidPlugin/AndroidPluginBase.cs.meta
  9. 8 0
      Runtime/SDK/Common/Base/Axis.meta
  10. 929 0
      Runtime/SDK/Common/Base/Axis/Axis.prefab
  11. 7 0
      Runtime/SDK/Common/Base/Axis/Axis.prefab.meta
  12. 8 0
      Runtime/SDK/Common/Base/Config.meta
  13. 8 0
      Runtime/SDK/Common/Base/Config/Base.meta
  14. 66 0
      Runtime/SDK/Common/Base/Config/Base/ConfigBase.cs
  15. 11 0
      Runtime/SDK/Common/Base/Config/Base/ConfigBase.cs.meta
  16. 8 0
      Runtime/SDK/Common/Base/Config/Implement.meta
  17. 12 0
      Runtime/SDK/Common/Base/Config/Implement/CommonConfig.cs
  18. 11 0
      Runtime/SDK/Common/Base/Config/Implement/CommonConfig.cs.meta
  19. 8 0
      Runtime/SDK/Common/Base/ConfigFile.meta
  20. 293 0
      Runtime/SDK/Common/Base/ConfigFile/ConfigFile.cs
  21. 11 0
      Runtime/SDK/Common/Base/ConfigFile/ConfigFile.cs.meta
  22. 8 0
      Runtime/SDK/Common/Base/DeviceInfo.meta
  23. 8 0
      Runtime/SDK/Common/Base/DeviceInfo/Scripts.meta
  24. 66 0
      Runtime/SDK/Common/Base/DeviceInfo/Scripts/DeviceInfo.cs
  25. 13 0
      Runtime/SDK/Common/Base/DeviceInfo/Scripts/DeviceInfo.cs.meta
  26. 8 0
      Runtime/SDK/Common/Base/Editor.meta
  27. 8 0
      Runtime/SDK/Common/Base/Editor/Base.meta
  28. 22 0
      Runtime/SDK/Common/Base/Editor/Base/MenuBase.cs
  29. 11 0
      Runtime/SDK/Common/Base/Editor/Base/MenuBase.cs.meta
  30. 8 0
      Runtime/SDK/Common/Base/Editor/BuildSettings.meta
  31. 7 0
      Runtime/SDK/Common/Base/Editor/BuildSettings/ParmScriptableObject.cs
  32. 11 0
      Runtime/SDK/Common/Base/Editor/BuildSettings/ParmScriptableObject.cs.meta
  33. 530 0
      Runtime/SDK/Common/Base/Editor/BuildSettings/SDKSettings.cs
  34. 11 0
      Runtime/SDK/Common/Base/Editor/BuildSettings/SDKSettings.cs.meta
  35. 8 0
      Runtime/SDK/Common/Base/Log.meta
  36. 69 0
      Runtime/SDK/Common/Base/Log/DebugMy.cs
  37. 11 0
      Runtime/SDK/Common/Base/Log/DebugMy.cs.meta
  38. 8 0
      Runtime/SDK/Common/Base/SCLifeCycle.meta
  39. 13 0
      Runtime/SDK/Common/Base/SCLifeCycle/ISCLifeCycle.cs
  40. 11 0
      Runtime/SDK/Common/Base/SCLifeCycle/ISCLifeCycle.cs.meta
  41. 46 0
      Runtime/SDK/Common/Base/SCLifeCycle/SCLifeCycle.cs
  42. 11 0
      Runtime/SDK/Common/Base/SCLifeCycle/SCLifeCycle.cs.meta
  43. 39 0
      Runtime/SDK/Common/Base/SCLifeCycle/SCLifeCycleMono.cs
  44. 11 0
      Runtime/SDK/Common/Base/SCLifeCycle/SCLifeCycleMono.cs.meta
  45. 8 0
      Runtime/SDK/Common/Base/SCModel.meta
  46. 52 0
      Runtime/SDK/Common/Base/SCModel/ISCModule.cs
  47. 11 0
      Runtime/SDK/Common/Base/SCModel/ISCModule.cs.meta
  48. 341 0
      Runtime/SDK/Common/Base/SCModel/SCModule.cs
  49. 11 0
      Runtime/SDK/Common/Base/SCModel/SCModule.cs.meta
  50. 354 0
      Runtime/SDK/Common/Base/SCModel/SCModuleMono.cs
  51. 11 0
      Runtime/SDK/Common/Base/SCModel/SCModuleMono.cs.meta
  52. 8 0
      Runtime/SDK/Common/Base/Singleton.meta
  53. 25 0
      Runtime/SDK/Common/Base/Singleton/Singleton.cs
  54. 11 0
      Runtime/SDK/Common/Base/Singleton/Singleton.cs.meta
  55. 42 0
      Runtime/SDK/Common/Base/Singleton/SingletonMono.cs
  56. 11 0
      Runtime/SDK/Common/Base/Singleton/SingletonMono.cs.meta
  57. 8 0
      Runtime/SDK/Common/Base/SpecificationType.meta
  58. 8 0
      Runtime/SDK/Common/Base/SpecificationType/SpecificationType.cs
  59. 11 0
      Runtime/SDK/Common/Base/SpecificationType/SpecificationType.cs.meta
  60. 8 0
      Runtime/SDK/Common/Base/TrackMode.meta
  61. 12 0
      Runtime/SDK/Common/Base/TrackMode/TrackMode.cs
  62. 11 0
      Runtime/SDK/Common/Base/TrackMode/TrackMode.cs.meta
  63. 8 0
      Runtime/SDK/Common/Base/WebRquest.meta
  64. 8 0
      Runtime/SDK/Common/Base/WebRquest/Base.meta
  65. 128 0
      Runtime/SDK/Common/Base/WebRquest/Base/WebRequestBase.cs
  66. 11 0
      Runtime/SDK/Common/Base/WebRquest/Base/WebRequestBase.cs.meta
  67. 40 0
      Runtime/SDK/Common/Base/WebRquest/Base/WebRequestServerBase.cs
  68. 11 0
      Runtime/SDK/Common/Base/WebRquest/Base/WebRequestServerBase.cs.meta
  69. 8 0
      Runtime/SDK/Common/Base/XRType.meta
  70. 14 0
      Runtime/SDK/Common/Base/XRType/XRType.cs
  71. 11 0
      Runtime/SDK/Common/Base/XRType/XRType.cs.meta
  72. 8 0
      Runtime/SDK/Common/StandardAssets.meta
  73. 8 0
      Runtime/SDK/Common/StandardAssets/Audio.meta
  74. BIN
      Runtime/SDK/Common/StandardAssets/Audio/ButtonPress.wav
  75. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/ButtonPress.wav.meta
  76. BIN
      Runtime/SDK/Common/StandardAssets/Audio/ButtonUnpress.wav
  77. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/ButtonUnpress.wav.meta
  78. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Manipulation_End.wav
  79. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Manipulation_End.wav.meta
  80. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Manipulation_Start.wav
  81. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Manipulation_Start.wav.meta
  82. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Move_End.wav
  83. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Move_End.wav.meta
  84. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Move_Start.wav
  85. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Move_Start.wav.meta
  86. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Notification.wav
  87. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Notification.wav.meta
  88. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Rotate_Start.wav
  89. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Rotate_Start.wav.meta
  90. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Rotate_Stop.wav
  91. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Rotate_Stop.wav.meta
  92. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Scale_Start.wav
  93. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Scale_Start.wav.meta
  94. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Scale_Stop.wav
  95. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Scale_Stop.wav.meta
  96. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Select_Main.wav
  97. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Select_Main.wav.meta
  98. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Select_Secondary.wav
  99. 22 0
      Runtime/SDK/Common/StandardAssets/Audio/Select_Secondary.wav.meta
  100. BIN
      Runtime/SDK/Common/StandardAssets/Audio/Shell_Click_In.wav

+ 8 - 0
Runtime/SDK.meta

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

+ 124 - 0
Runtime/SDK/AllMoveEvent.cs

@@ -0,0 +1,124 @@
+using SC.XR.Unity.Module_InputSystem;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class AllMoveEvent : MonoBehaviour
+{
+    // Start is called before the first frame update
+    void Start()
+    {
+        DispatcherBase.KeyDownDelegateRegister(downEvent);
+        DispatcherBase.KeyUpDelegateRegister(upEvent);
+
+    }
+
+    InputDevicePartBase NowPart;
+    GameObject pz;
+
+    private void upEvent(InputKeyCode keyCode, InputDevicePartBase part)
+    {
+        if (part.inputDataBase.SCPointEventData.pointerCurrentRaycast.gameObject != null && (part.inputDataBase.SCPointEventData.pointerCurrentRaycast.gameObject.GetComponent<BoxCollider>() == null || part.inputDataBase.SCPointEventData.pointerCurrentRaycast.gameObject.GetComponent<ManipulationHandler>() == null))
+        {
+            checkMoveUp(pz, part);
+        }
+        pz = null;
+        NowPart = null;
+    }
+
+    public void checkMoveUp(GameObject obj, InputDevicePartBase part)
+    {
+        if (obj)
+        {
+            ManipulationHandler m = obj.GetComponent<ManipulationHandler>();
+            if (m != null)
+            {
+                if (!m.enabled)
+                {
+                    return;
+                }
+                if (!m.isParentDrag && !obj.name.Contains("Root") && !obj.name.Contains("BoundingBox"))
+                {
+                    m.OnPointerUp(part.inputDataBase.SCPointEventData);
+
+                }
+            }
+            else
+            {
+                if (obj.transform.parent != null && !obj.name.Contains("Root") && !obj.name.Contains("BoundingBox"))
+                    checkMoveUp(obj.transform.parent.gameObject, part);
+            }
+        }
+    }
+
+    private void downEvent(InputKeyCode keyCode, InputDevicePartBase part)
+    {
+        if (part.inputDataBase.SCPointEventData.pointerCurrentRaycast.gameObject != null && (part.inputDataBase.SCPointEventData.pointerCurrentRaycast.gameObject.GetComponent<BoxCollider>() == null || part.inputDataBase.SCPointEventData.pointerCurrentRaycast.gameObject.GetComponent<ManipulationHandler>() == null))
+        {
+            checkMoveDown(part.inputDataBase.SCPointEventData.pointerCurrentRaycast.gameObject, part);
+        }
+        NowPart = part;
+    }
+
+    public void checkMoveDown(GameObject obj, InputDevicePartBase part)
+    {
+        if (obj)
+        {
+            ManipulationHandler m = obj.GetComponent<ManipulationHandler>();
+                if (m != null)
+            {
+                if (!m.enabled)
+                {
+                    return;
+                }
+                    if (!m.isParentDrag && !obj.name.Contains("Root") && !obj.name.Contains("BoundingBox"))
+                {
+                    m.OnPointerDown(part.inputDataBase.SCPointEventData);
+                    pz = obj;
+                }
+            }
+            else
+            {
+                if (obj.transform.parent != null && !obj.name.Contains("Root") && !obj.name.Contains("BoundingBox"))
+                    checkMoveDown(obj.transform.parent.gameObject, part);
+            }
+        }
+    }
+
+
+    // Update is called once per frame
+    void Update()
+    {
+        if (NowPart != null && pz != null)
+        {
+
+            checkMoveDrag(pz, NowPart);
+        }
+
+    }
+    public void checkMoveDrag(GameObject obj, InputDevicePartBase part)
+    {
+        if (obj)
+        {
+            ManipulationHandler m = obj.GetComponent<ManipulationHandler>();
+            if (m != null && !obj.name.Contains("Root") && !obj.name.Contains("BoundingBox"))
+            {
+                if (!m.enabled)
+                {
+                    return;
+                }
+                if (!m.isParentDrag)
+                    m.OnDrag(part.inputDataBase.SCPointEventData);
+            }
+            else
+            {
+                if (obj.transform.parent != null && !obj.name.Contains("Root") && !obj.name.Contains("BoundingBox"))
+                {
+
+                    checkMoveDrag(obj.transform.parent.gameObject, part);
+                }
+            }
+        }
+    }
+}

+ 11 - 0
Runtime/SDK/AllMoveEvent.cs.meta

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

+ 8 - 0
Runtime/SDK/Common.meta

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

+ 8 - 0
Runtime/SDK/Common/Base.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/AndroidPlugin.meta

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

+ 164 - 0
Runtime/SDK/Common/Base/AndroidPlugin/AndroidPluginBase.cs

@@ -0,0 +1,164 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace SC.XR.Unity {
+    public abstract class AndroidPluginBase:  SCModule {
+
+        private static AndroidJavaObject mCurrentActivity = null;
+        private static AndroidJavaClass mUnityPlayerClass = null;
+        private static AndroidJavaObject mContext = null;
+        public static AndroidJavaObject CurrentActivity {
+            get {
+                if(Application.platform == RuntimePlatform.Android) {
+                    if(mCurrentActivity == null && UnityPlayerClass != null) {
+                        mCurrentActivity = UnityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
+                    }
+                }
+                return mCurrentActivity;
+            }
+        }
+        public static AndroidJavaClass UnityPlayerClass {
+            get {
+                if(Application.platform == RuntimePlatform.Android) {
+                    if(mUnityPlayerClass == null) {
+                        mUnityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
+                    }
+                }
+                return mUnityPlayerClass;
+            }
+        }
+        public static AndroidJavaObject Context {
+            get {
+                if(Application.platform == RuntimePlatform.Android) {
+                    if(mContext == null) {
+                        mContext = CurrentActivityFunctionCall<AndroidJavaObject>("getApplicationContext");
+                    }
+                }
+                return mContext;
+            }
+        }
+
+        protected static List<AndroidJavaProxy> androidListernerList = new List<AndroidJavaProxy>();
+
+        public static void AddListener(string setCallBackFunctionName, AndroidJavaProxy callBack) {
+            if(Application.platform == RuntimePlatform.Android) {
+                CurrentActivity.Call(setCallBackFunctionName, callBack);
+                androidListernerList.Add(callBack);
+            }
+        }
+
+        public static void ObjectAddListener(AndroidJavaObject androidObject,string setCallBackFunctionName, AndroidJavaProxy callBack) {
+            if(Application.platform == RuntimePlatform.Android) {
+                if(androidObject != null) {
+                    androidObject.Call(setCallBackFunctionName, callBack);
+                    androidListernerList.Add(callBack);
+                }
+            }
+        }
+
+        public static AndroidJavaClass GetAndroidJavaClass(string classPatch) {
+            if(Application.platform == RuntimePlatform.Android) {
+                try {
+                    return new AndroidJavaClass(classPatch);
+                } catch(Exception e) {
+                    Debug.LogError(e);
+                }
+            }
+            return null;
+        }
+        /// <summary>
+        /// 实例方法
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="androidJavaObject"></param>
+        /// <param name="callName"></param>
+        /// <param name="args"></param>
+        /// <returns></returns>
+        public static T ObjectFunctionCall<T>(AndroidJavaObject androidJavaObject, string callName, params object[] args) {
+            if(androidJavaObject != null) {
+                try {
+                    return androidJavaObject.Call<T>(callName, args);
+                } catch(Exception e) {
+                    Debug.LogError(e);
+                }
+            }
+            return default(T);
+        }
+        public static void ObjectFunctionCall(AndroidJavaObject androidJavaObject, string callName, params object[] args) {
+            if(androidJavaObject != null) {
+                try {
+                    androidJavaObject.Call(callName, args);
+                } catch(Exception e) {
+                    Debug.LogError(e);
+                }
+            }
+        }
+        public static T ObjectFunctionCall2<T>(AndroidJavaObject androidJavaObject, string callName, object args) {
+            if(androidJavaObject != null) {
+                try {
+                    return androidJavaObject.Call<T>(callName, args);
+                } catch(Exception e) {
+                    Debug.LogError(e);
+                }
+            }
+            return default(T);
+        }
+        public static void ObjectFunctionCall2(AndroidJavaObject androidJavaObject, string callName, object args) {
+            if(androidJavaObject != null) {
+                try {
+                    androidJavaObject.Call(callName, args);
+                } catch(Exception e) {
+                    Debug.LogError(e);
+                }
+            }
+        }
+
+        public static T CurrentActivityFunctionCall<T>(string callName, params object[] args) {
+            if(CurrentActivity != null) {
+                try {
+                    return CurrentActivity.Call<T>(callName, args);
+                } catch(Exception e) {
+                    Debug.LogError(e);
+                }
+            }
+            return default(T);
+        }
+        public static void CurrentActivityFunctionCall(string callName, params object[] args) {
+            if(CurrentActivity != null) {
+                try {
+                    CurrentActivity.Call(callName, args);
+                } catch(Exception e) {
+                    Debug.LogError(e);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 类方法
+        /// </summary>
+        /// <param name="androidJavaClass"></param>
+        /// <param name="callName"></param>
+        /// <param name="args"></param>
+        public static void ClassFunctionCallStatic(AndroidJavaClass androidJavaClass, string callName, params object[] args) {
+            if(androidJavaClass != null) {
+                try {
+                    androidJavaClass.CallStatic(callName, args);
+                } catch(Exception e) {
+                    Debug.LogError(e);
+                }
+            }
+        }
+        public static T ClassFunctionCallStatic<T>(AndroidJavaClass androidJavaClass, string callName, params object[] args) {
+            if(androidJavaClass != null) {
+                try {
+                    return androidJavaClass.CallStatic<T>(callName, args);
+                } catch(Exception e) {
+                    Debug.LogError(e);
+                }
+            }
+            return default(T);
+        }
+
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/AndroidPlugin/AndroidPluginBase.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/Axis.meta

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

+ 929 - 0
Runtime/SDK/Common/Base/Axis/Axis.prefab

@@ -0,0 +1,929 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &4398149315688698726
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4398149315688698725}
+  - component: {fileID: 4398149315688698729}
+  - component: {fileID: 4398149315688698730}
+  - component: {fileID: 4398149315688698731}
+  - component: {fileID: 4398149315688698724}
+  m_Layer: 0
+  m_Name: Text (TMP) (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4398149315688698725
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149315688698726}
+  m_LocalRotation: {x: -0, y: 0.7071068, z: -0, w: 0.7071068}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 10, y: 0.099999994, z: 10}
+  m_Children: []
+  m_Father: {fileID: 4398149317126291122}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0.659}
+  m_SizeDelta: {x: 20, y: 5}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!23 &4398149315688698729
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149315688698726}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 0
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!33 &4398149315688698730
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149315688698726}
+  m_Mesh: {fileID: 0}
+--- !u!222 &4398149315688698731
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149315688698726}
+  m_CullTransparentMesh: 0
+--- !u!114 &4398149315688698724
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149315688698726}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_text: Y
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_outlineColor:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_textAlignment: 514
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_firstOverflowCharacterIndex: -1
+  m_linkedTextComponent: {fileID: 0}
+  m_isLinkedTextComponent: 0
+  m_isTextTruncated: 0
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 0
+  m_isCullingEnabled: 0
+  m_ignoreRectMaskCulling: 0
+  m_ignoreCulling: 1
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_firstVisibleCharacter: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 6.0850434, y: 0, z: 5.834351, w: 0}
+  m_textInfo:
+    textComponent: {fileID: 4398149315688698724}
+    characterCount: 1
+    spriteCount: 0
+    spaceCount: 0
+    wordCount: 1
+    linkCount: 0
+    lineCount: 1
+    pageCount: 1
+    materialCount: 1
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_spriteAnimator: {fileID: 0}
+  m_hasFontAssetChanged: 0
+  m_renderer: {fileID: 4398149315688698729}
+  m_subTextObjects:
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  m_maskType: 0
+--- !u!1 &4398149316041367016
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4398149316041367023}
+  - component: {fileID: 4398149316041367027}
+  - component: {fileID: 4398149316041367020}
+  - component: {fileID: 4398149316041367021}
+  - component: {fileID: 4398149316041367022}
+  m_Layer: 0
+  m_Name: Text (TMP)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4398149316041367023
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316041367016}
+  m_LocalRotation: {x: -0, y: 0.7071068, z: -0, w: 0.7071068}
+  m_LocalPosition: {x: 0, y: 0, z: 0.32349998}
+  m_LocalScale: {x: 0.100000046, y: 10, z: 10}
+  m_Children: []
+  m_Father: {fileID: 4398149316856413770}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 90, 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: 20, y: 5}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!23 &4398149316041367027
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316041367016}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 0
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!33 &4398149316041367020
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316041367016}
+  m_Mesh: {fileID: 0}
+--- !u!222 &4398149316041367021
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316041367016}
+  m_CullTransparentMesh: 0
+--- !u!114 &4398149316041367022
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316041367016}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_text: Z
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_outlineColor:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_textAlignment: 514
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_firstOverflowCharacterIndex: -1
+  m_linkedTextComponent: {fileID: 0}
+  m_isLinkedTextComponent: 0
+  m_isTextTruncated: 0
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 0
+  m_isCullingEnabled: 0
+  m_ignoreRectMaskCulling: 0
+  m_ignoreCulling: 1
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_firstVisibleCharacter: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 6.0850434, y: 0, z: 5.834351, w: 0}
+  m_textInfo:
+    textComponent: {fileID: 4398149316041367022}
+    characterCount: 1
+    spriteCount: 0
+    spaceCount: 0
+    wordCount: 1
+    linkCount: 0
+    lineCount: 1
+    pageCount: 1
+    materialCount: 1
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_spriteAnimator: {fileID: 0}
+  m_hasFontAssetChanged: 0
+  m_renderer: {fileID: 4398149316041367027}
+  m_subTextObjects:
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  m_maskType: 0
+--- !u!1 &4398149316644824652
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4398149316644824663}
+  - component: {fileID: 4398149316644824656}
+  - component: {fileID: 4398149316644824657}
+  - component: {fileID: 4398149316644824658}
+  - component: {fileID: 4398149316644824659}
+  m_Layer: 0
+  m_Name: Text (TMP) (2)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4398149316644824663
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316644824652}
+  m_LocalRotation: {x: -0, y: -0.7071068, z: -0, w: 0.7071068}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 10, y: 10, z: 0.100000046}
+  m_Children: []
+  m_Father: {fileID: 4398149317342872899}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: -90, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0.418, y: 0}
+  m_SizeDelta: {x: 20, y: 5}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!23 &4398149316644824656
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316644824652}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 0
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!33 &4398149316644824657
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316644824652}
+  m_Mesh: {fileID: 0}
+--- !u!222 &4398149316644824658
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316644824652}
+  m_CullTransparentMesh: 0
+--- !u!114 &4398149316644824659
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316644824652}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_text: X
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_outlineColor:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_textAlignment: 514
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_firstOverflowCharacterIndex: -1
+  m_linkedTextComponent: {fileID: 0}
+  m_isLinkedTextComponent: 0
+  m_isTextTruncated: 0
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 0
+  m_isCullingEnabled: 0
+  m_ignoreRectMaskCulling: 0
+  m_ignoreCulling: 1
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_firstVisibleCharacter: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 6.0850434, y: 0, z: 5.834351, w: 0}
+  m_textInfo:
+    textComponent: {fileID: 4398149316644824659}
+    characterCount: 1
+    spriteCount: 0
+    spaceCount: 0
+    wordCount: 1
+    linkCount: 0
+    lineCount: 1
+    pageCount: 1
+    materialCount: 1
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_spriteAnimator: {fileID: 0}
+  m_hasFontAssetChanged: 0
+  m_renderer: {fileID: 4398149316644824656}
+  m_subTextObjects:
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  - {fileID: 0}
+  m_maskType: 0
+--- !u!1 &4398149316856413771
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4398149316856413770}
+  - component: {fileID: 4398149316856413775}
+  - component: {fileID: 4398149316856413768}
+  - component: {fileID: 4398149316856413769}
+  m_Layer: 0
+  m_Name: X
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4398149316856413770
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316856413771}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0.496}
+  m_LocalScale: {x: 0.01, y: 0.01, z: 1}
+  m_Children:
+  - {fileID: 4398149316041367023}
+  m_Father: {fileID: 4398149317534903895}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &4398149316856413775
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316856413771}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &4398149316856413768
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316856413771}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!65 &4398149316856413769
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149316856413771}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!1 &4398149317126291123
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4398149317126291122}
+  - component: {fileID: 4398149317126291127}
+  - component: {fileID: 4398149317126291120}
+  - component: {fileID: 4398149317126291121}
+  m_Layer: 0
+  m_Name: Y
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4398149317126291122
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149317126291123}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0.496, z: 0}
+  m_LocalScale: {x: 0.01, y: 1, z: 0.01}
+  m_Children:
+  - {fileID: 4398149315688698725}
+  m_Father: {fileID: 4398149317534903895}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &4398149317126291127
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149317126291123}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &4398149317126291120
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149317126291123}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!65 &4398149317126291121
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149317126291123}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!1 &4398149317342873020
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4398149317342872899}
+  - component: {fileID: 4398149317342872896}
+  - component: {fileID: 4398149317342872897}
+  - component: {fileID: 4398149317342872898}
+  m_Layer: 0
+  m_Name: Z
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4398149317342872899
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149317342873020}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0.503, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 0.01, z: 0.01}
+  m_Children:
+  - {fileID: 4398149316644824663}
+  m_Father: {fileID: 4398149317534903895}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &4398149317342872896
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149317342873020}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &4398149317342872897
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149317342873020}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!65 &4398149317342872898
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149317342873020}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!1 &4398149317534903888
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4398149317534903895}
+  m_Layer: 0
+  m_Name: Axis
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4398149317534903895
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4398149317534903888}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 4398149317342872899}
+  - {fileID: 4398149316856413770}
+  - {fileID: 4398149317126291122}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

+ 7 - 0
Runtime/SDK/Common/Base/Axis/Axis.prefab.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/Config.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/Config/Base.meta

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

+ 66 - 0
Runtime/SDK/Common/Base/Config/Base/ConfigBase.cs

@@ -0,0 +1,66 @@
+
+using System.IO;
+
+namespace SC.XR.Unity {
+    
+    /// <summary>
+    /// 创建一个config文件,并提供操作API
+    /// </summary>
+    public abstract class ConfigBase : SCModule {
+
+        string patch;
+        public ConfigBase(string patch) {
+            this.patch = patch;
+
+            FileStream s2 = new FileStream(patch, FileMode.OpenOrCreate, FileAccess.ReadWrite);
+            s2.Close();
+
+        }
+
+        public virtual void SetLineValue(int line,string value) {
+            if(File.Exists(patch)) {
+
+                string[] lines = File.ReadAllLines(patch);
+                if(lines.Length < line) {
+                    string[] newLines = new string[line];
+                    lines.CopyTo(newLines, 0);
+                    newLines[line-1] = value;
+                    File.WriteAllLines(patch, newLines);
+                } else {
+                    lines[line-1] = value;
+                    File.WriteAllLines(patch, lines);
+                }
+            }
+            
+        }
+
+        /// <summary>
+        /// 读取某行内容
+        /// </summary>
+        /// <param name="line">起始1,1表示第一行</param>
+        /// <returns></returns>
+        public virtual string GetLineValue(int line) {
+            string value = "";
+
+            StreamReader fs = null;
+
+            if(File.Exists(patch)) {
+                fs = new StreamReader(patch);
+
+                for(int i = 1; i < line; i++) {
+                    fs.ReadLine();
+                }
+                value = fs.ReadLine();
+
+                DebugMy.Log("config:" + patch + "  line:"+line +" "+ value,this);
+                fs.Close();
+            }
+
+            return value;
+        }
+
+
+    }
+
+}
+

+ 11 - 0
Runtime/SDK/Common/Base/Config/Base/ConfigBase.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/Config/Implement.meta

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

+ 12 - 0
Runtime/SDK/Common/Base/Config/Implement/CommonConfig.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace SC.XR.Unity {
+    public class CommonConfig:ConfigBase {
+
+        public CommonConfig(string path):base(path) { }
+
+
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/Config/Implement/CommonConfig.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/ConfigFile.meta

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

+ 293 - 0
Runtime/SDK/Common/Base/ConfigFile/ConfigFile.cs

@@ -0,0 +1,293 @@
+
+using UnityEngine;
+using System.IO;
+using System.Collections.Generic;
+using System;
+
+namespace SC.XR.Unity {
+    public class ConfigFile {
+
+        private static readonly char[] TrimStart = new char[] { ' ', '\t' };
+        private static readonly char[] TrimEnd = new char[] { ' ', '\t', '\r', '\n' };
+
+        private const string DELEMITER = "=";
+
+        private string strFilePath = null;
+
+        private bool IsCaseSensitive = false;
+        public Dictionary<string, Dictionary<string, string>> Configs {
+            get {
+                return ConfigDic;
+            }
+        }
+        private Dictionary<string, Dictionary<string, string>> ConfigDic = new Dictionary<string, Dictionary<string, string>>();
+
+        public ConfigFile(string path, bool isCaseSensitive = false) {
+            strFilePath = path;
+            IsCaseSensitive = isCaseSensitive;
+            PermissionRequest.getInstance.GetPerssion(UnityEngine.Android.Permission.ExternalStorageRead);
+            PermissionRequest.getInstance.GetPerssion(UnityEngine.Android.Permission.ExternalStorageWrite);
+        }
+        public bool ParseConfig() {
+            if (!File.Exists(strFilePath)) {
+                Debug.LogWarning("the Config file's path is error:" + strFilePath);
+                return false;
+            }
+            using (StreamReader reader = new StreamReader(strFilePath)) {
+                string section = null;
+                string key = null;
+                string val = null;
+                Dictionary<string, string> config = null;
+
+                string strLine = null;
+                while ((strLine = reader.ReadLine()) != null) {
+                    strLine = strLine.TrimStart(TrimStart);
+                    strLine = strLine.TrimEnd(TrimEnd);
+
+                    if (strLine.StartsWith("#") || strLine.StartsWith("//")) {
+                        continue;
+                    }
+                    if (strLine.Length <= 2) {
+                        continue;
+                    }
+
+                    if (TryParseSection(strLine, out section)) {
+                        if (!ConfigDic.ContainsKey(section)) {
+                            ConfigDic.Add(section, new Dictionary<string, string>());
+                        }
+                        config = ConfigDic[section];
+                        //Debug.Log("[Section] : " + "[" + section + "]");
+                    } else {
+                        if (config != null) {
+                            if (TryParseConfig(strLine, out key, out val)) {
+                                if (config.ContainsKey(key)) {
+                                    config[key] = val;
+                                   // Debug.LogError("the Key[" + key + "] is appear repeat");
+                                } else {
+                                    config.Add(key, val);
+                                    //Debug.Log("     "+key + ":" + val);
+                                }
+                            }
+                        } else {
+                            Debug.LogWarning("the Config file's format is error,lost [Section]'s information");
+                        }
+                    }
+                }
+                return true;
+            }
+        }
+
+        public void SaveConfig() {
+            if (string.IsNullOrEmpty(strFilePath)) {
+                Debug.LogWarning("Empty file name for SaveConfig.");
+                return;
+            }
+
+            string dirName = Path.GetDirectoryName(strFilePath);
+            if (string.IsNullOrEmpty(dirName)) {
+                Debug.LogWarning(string.Format("Empty directory for SaveConfig:{0}.", strFilePath));
+                return;
+            }
+            if (!Directory.Exists(dirName)) {
+                Directory.CreateDirectory(dirName);
+            }
+
+            using (StreamWriter sw = new StreamWriter(strFilePath)) {
+                foreach (KeyValuePair<string, Dictionary<string, string>> pair in ConfigDic) {
+                    sw.WriteLine("[" + pair.Key + "]");
+                    foreach (KeyValuePair<string, string> cfg in pair.Value) {
+                        sw.WriteLine(cfg.Key + DELEMITER + cfg.Value);
+                    }
+                }
+            }
+        }
+
+        public bool HasKey(string section, string key) {
+            if (!IsCaseSensitive) {
+                section = section.ToUpper();
+                key = key.ToUpper();
+            }
+            Dictionary<string, string> config = null;
+            if (ConfigDic.TryGetValue(section, out config)) {
+                return config.ContainsKey(key);
+            }
+            return false;
+        }
+
+        public string GetString(string section, string key, string defaultVal) {
+            if (!IsCaseSensitive) {
+                section = section.ToUpper();
+                key = key.ToUpper();
+            }
+            Dictionary<string, string> config = null;
+            if (ConfigDic.TryGetValue(section, out config)) {
+                string ret = null;
+                if (config.TryGetValue(key, out ret)) {
+                    return ret;
+                }
+            }
+            return defaultVal;
+        }
+        public float GetFloat(string section, string key, float defaultVal) {
+
+            Dictionary<string, string> config = null;
+            if (ConfigDic.TryGetValue(section, out config)) {
+                string ret = null;
+                if (config.TryGetValue(key, out ret)) {
+                    try {
+                        return float.Parse(ret);
+                    } catch (Exception e) {
+                        Debug.Log(e);
+                    }
+                }
+            }
+            return defaultVal;
+        }
+
+        public int GetInt(string section, string key, int defaultVal) {
+            string val = GetString(section, key, null);
+            if (val != null) {
+                try {
+                    return int.Parse(val);
+                } catch (Exception e) {
+                    Debug.Log(e);
+                }
+            }
+            return defaultVal;
+        }
+
+
+        public void SetString(string section, string key, string val) {
+            if (!string.IsNullOrEmpty(section) && !string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(val)) {
+                if (!IsCaseSensitive) {
+                    section = section.ToUpper();
+                    key = key.ToUpper();
+                }
+                Dictionary<string, string> config = null;
+                if (!ConfigDic.TryGetValue(section, out config)) {
+                    config = new Dictionary<string, string>();
+                    ConfigDic[section] = config;
+                }
+                config[key] = val;
+            }
+        }
+
+        //public void SetInt(string section, string key, int val) {
+        //    SetString(section, key, val.ToString());
+        //}
+
+
+        /// <summary>
+        /// Add String if no have,if have do nothing
+        /// </summary>
+        /// <param name="section"></param>
+        /// <param name="key"></param>
+        /// <param name="val"></param>
+        /// <returns> true : Add success</returns>
+        public bool AddString(string section, string key, string val) {
+            if (!string.IsNullOrEmpty(section) && !string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(val)) {
+                if (!IsCaseSensitive) {
+                    section = section.ToUpper();
+                    key = key.ToUpper();
+                }
+                Dictionary<string, string> config = null;
+                if (!ConfigDic.TryGetValue(section, out config)) {
+                    config = new Dictionary<string, string>();
+                    ConfigDic[section] = config;
+                }
+                if (!config.ContainsKey(key)) {
+                    config.Add(key, val);
+                    return true;
+                }
+                return false;
+            }
+            return false;
+        }
+
+        //public void AddInt(string section, string key, int val) {
+        //    AddString(section, key, val.ToString());
+        //}
+
+        public bool RemoveSection(string section) {
+            if (ConfigDic.ContainsKey(section)) {
+                ConfigDic.Remove(section);
+                return true;
+            }
+            return false;
+        }
+
+        public bool RemoveConfig(string section, string key) {
+            if (!IsCaseSensitive) {
+                section = section.ToUpper();
+                key = key.ToUpper();
+            }
+            Dictionary<string, string> config = null;
+            if (ConfigDic.TryGetValue(section, out config)) {
+                if (config.ContainsKey(key)) {
+                    config.Remove(key);
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public void RemoveALLConfig() {
+            ConfigDic.Clear();
+        }
+
+        public void RemoveConfigFile() {
+            if (File.Exists(strFilePath)) {
+                File.Delete(strFilePath);
+            }
+        }
+
+        public Dictionary<string, string> GetSectionInfo(string section) {
+            Dictionary<string, string> res = null;
+            if (!IsCaseSensitive) {
+                section = section.ToUpper();
+            }
+            ConfigDic.TryGetValue(section, out res);
+            return res;
+        }
+
+        private bool TryParseSection(string strLine, out string section) {
+            section = null;
+            if (!string.IsNullOrEmpty(strLine)) {
+                int len = strLine.Length;
+                if (strLine[0] == '[' && strLine[len - 1] == ']') {
+                    section = strLine.Substring(1, len - 2);
+                    if (!IsCaseSensitive) {
+                        section = section.ToUpper();
+                    }
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        private bool TryParseConfig(string strLine, out string key, out string val) {
+            if (strLine != null && strLine.Length >= 3) {
+                string[] contents = strLine.Split(DELEMITER.ToCharArray());
+                if (contents.Length == 2) {
+                    key = contents[0].TrimStart(TrimStart);
+                    key = key.TrimEnd(TrimEnd);
+                    val = contents[1].TrimStart(TrimStart);
+                    val = val.TrimEnd(TrimEnd);
+                    if (key.Length > 0 && val.Length > 0) {
+                        if (!IsCaseSensitive) {
+                            key = key.ToUpper();
+                        }
+
+                        return true;
+                    }
+                }
+            }
+
+            key = null;
+            val = null;
+            return false;
+        }
+
+
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/ConfigFile/ConfigFile.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/DeviceInfo.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/DeviceInfo/Scripts.meta

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

+ 66 - 0
Runtime/SDK/Common/Base/DeviceInfo/Scripts/DeviceInfo.cs

@@ -0,0 +1,66 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+[Obsolete("Please Use Module_Device")]
+public class DeviceInfo {
+
+    /// <summary>
+    /// 设备型号
+    /// </summary>
+    /// <returns></returns>
+    public static string MODEL {
+        get{
+            if(Application.platform == RuntimePlatform.Android) {
+                AndroidJavaClass os = new AndroidJavaClass("android.os.Build");
+                return os.GetStatic<string>("MODEL");
+            }
+            return "Standalone";
+        }
+    }
+
+    /// <summary>
+    /// SN号
+    /// </summary>
+    public static string SN {
+        get {
+            if(Application.platform == RuntimePlatform.Android) {
+                AndroidJavaClass os = new AndroidJavaClass("android.os.Build");
+                return os.GetStatic<string>("SERIAL");
+            }
+            return "Null";
+        }
+    }
+
+    /// <summary>
+    /// Release_Vesion
+    /// </summary>
+    public static string RELEASE_VERSION {
+        get {
+            if(Application.platform == RuntimePlatform.Android) {
+                AndroidJavaClass os = new AndroidJavaClass("android.os.Build$VERSION");
+                return os.GetStatic<string>("RELEASE");
+            }
+            return "Null";
+        }
+    }
+
+    /// <summary>
+    /// BatteryLevel
+    /// </summary>
+    public static int BatteryLevel {
+        get {
+            if (Application.platform == RuntimePlatform.Android) {
+                try {
+                    string CapacityString = System.IO.File.ReadAllText("/sys/class/power_supply/battery/capacity");
+                    return int.Parse(CapacityString);
+                } catch (Exception e) {
+                    Debug.Log("Failed to read battery power; " + e.Message);
+                }
+            }
+            return 60;
+        }
+    }
+}

+ 13 - 0
Runtime/SDK/Common/Base/DeviceInfo/Scripts/DeviceInfo.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 368eb122194ea5a4e8c8bee87aa5a65d
+timeCreated: 1562231822
+licenseType: Free
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Runtime/SDK/Common/Base/Editor.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/Editor/Base.meta

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

+ 22 - 0
Runtime/SDK/Common/Base/Editor/Base/MenuBase.cs

@@ -0,0 +1,22 @@
+using UnityEngine;
+using UnityEditor;
+
+namespace SC.Menu {
+    public abstract class MenuBase : MonoBehaviour {
+        protected static void CreatePrefab(string ResourcesPath) {
+            GameObject go = (GameObject)PrefabUtility.InstantiatePrefab(Resources.Load(ResourcesPath));
+
+            if(go) {
+                GameObjectUtility.SetParentAndAlign(go, Selection.activeTransform == null ? null : Selection.activeTransform.gameObject);
+                go.transform.SetParent(Selection.activeTransform);
+                Undo.RegisterCreatedObjectUndo(go, go.name);
+                Selection.activeTransform = go.transform;
+                //Debug.Log("Create Sucess ! Prefab:" + ResourcesPath);
+            } else {
+                //Debug.LogError("Create Failed ! Prefab:" + ResourcesPath);
+            }
+
+        }
+    }
+}
+

+ 11 - 0
Runtime/SDK/Common/Base/Editor/Base/MenuBase.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/Editor/BuildSettings.meta

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

+ 7 - 0
Runtime/SDK/Common/Base/Editor/BuildSettings/ParmScriptableObject.cs

@@ -0,0 +1,7 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ParmScriptableObject : ScriptableObject {
+    public bool IsIgnor;
+}

+ 11 - 0
Runtime/SDK/Common/Base/Editor/BuildSettings/ParmScriptableObject.cs.meta

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

+ 530 - 0
Runtime/SDK/Common/Base/Editor/BuildSettings/SDKSettings.cs

@@ -0,0 +1,530 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using UnityEditor;
+using UnityEditor.Build;
+using UnityEditor.Build.Reporting;
+using UnityEngine;
+
+public class SDKSettings : EditorWindow {
+
+
+    [InitializeOnLoadMethod]
+    static void CheckSettings() {
+        if(EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) {
+
+            if(!IsIgnor && IsApply() == false) {
+                Init();  
+            } 
+        } 
+    }
+
+    static EditorWindow window;
+
+   [MenuItem("SDK/ProjectSettings")]
+    static void Init() {
+        if(window == null) {
+          //  window = EditorWindow.GetWindow(typeof(SDKSettings));
+         //   window.autoRepaintOnSceneChange = true;
+          //  window.minSize = new Vector2(720, 420);
+        //    window.maxSize = new Vector2(720, 420);
+        }
+    }
+    static bool isQualityApply = true;
+    static bool isPlayerApply = true; 
+    void OnGUI() {
+        GUILayout.Space(10);
+        NoticWindow();
+        
+        if(EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android) {
+            return;
+        }
+
+        GUILayout.Space(10);
+        isQualityApply = QualityWindow();
+        GUILayout.Space(10);
+        isPlayerApply = PlayerWindow();
+
+
+        if(IsApply() == false) {
+
+            GUILayout.Space(60);
+            ApplyWindow();
+        }
+
+    }
+
+    static bool IsApply() {
+        if(EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android) {
+            return true;
+        }
+
+        if(PlayerCheck() && QualityCheck())
+            return true;
+
+        return false;
+    }
+
+    static bool IsIgnor { get { return GetAssetDataBase(); } }
+    static void Ignor() {
+        SaveAssetDataBase(true);
+    }
+    static string assetPath = "Assets/SDK/Common/Base/Editor/BuildSettings/Parm.asset";
+    static void SaveAssetDataBase(bool isIgnor) {
+        ParmScriptableObject asset;
+        if(File.Exists(assetPath)) {
+            asset = AssetDatabase.LoadAssetAtPath<ParmScriptableObject>(assetPath);
+        } else {
+            asset =(ParmScriptableObject) CreateInstance("ParmScriptableObject"); 
+            AssetDatabase.CreateAsset(asset, assetPath);
+        }
+        asset.IsIgnor = isIgnor;
+        AssetDatabase.SaveAssets();
+        AssetDatabase.Refresh();//must Refresh
+    }
+
+    static bool GetAssetDataBase() {
+        ParmScriptableObject asset;
+        if(File.Exists(assetPath)) {
+            asset = AssetDatabase.LoadAssetAtPath<ParmScriptableObject>(assetPath);
+            return asset.IsIgnor;
+        } 
+        return false;  
+    }
+     
+    static void NoticWindow() {
+        GUILayout.Space(20);
+        EditorGUILayout.BeginHorizontal();
+
+        GUIStyle styleNoticeText = new GUIStyle();
+        styleNoticeText.alignment = TextAnchor.MiddleCenter;
+        styleNoticeText.fontSize = 14;
+        styleNoticeText.fontStyle = FontStyle.Bold;
+
+        if(EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) {
+            GUILayout.Label("Notice: Recommended Project settings for SDK", styleNoticeText);
+        } else {
+            GUILayout.Label("This Only Effect When Platform Select Android", styleNoticeText);
+        }
+
+        EditorGUILayout.EndHorizontal();
+        GUILayout.Space(20);
+    }
+
+    void ApplyWindow() { 
+        EditorGUILayout.BeginHorizontal();
+        EditorGUILayout.LabelField("", GUILayout.Width(100));
+
+        GUIStyle styleApply = new GUIStyle("LargeButton");
+        styleApply.alignment = TextAnchor.MiddleCenter; 
+        if(GUILayout.Button("Apply", styleApply)) {
+            QualitySet(); 
+            PlayerSet();
+        }
+        
+        EditorGUILayout.LabelField("", GUILayout.Width(100));
+
+        GUIStyle style1Apply = new GUIStyle("LargeButton");
+        styleApply.alignment = TextAnchor.MiddleCenter;
+        if(GUILayout.Button("Ignor", style1Apply)) {
+            Ignor();
+            window.Close();
+            Close();
+        }
+
+        EditorGUILayout.LabelField("", GUILayout.Width(100));
+        //if(GUILayout.Button(strBtnApply[(int)elanguage], styleApply, GUILayout.Width(100), GUILayout.Height(30))) {
+        //    EditorApplication.delayCall += OnClickApply;
+        //}
+        //styleApply = null;
+
+        //EditorGUILayout.LabelField("", GUILayout.Width(200));
+        //if(GUILayout.Button("xxx", GUILayout.Width(100), GUILayout.Height(30))) {
+
+        //}
+        EditorGUILayout.EndHorizontal();
+    }
+
+    #region ProjectSettings->Player
+
+    static bool PlayerWindow() {
+        bool isApply = true;
+
+        GUILayout.Label("PlayerSettings", EditorStyles.boldLabel);
+
+        EditorGUILayout.BeginHorizontal();
+
+        GUILayout.Label("Minimum API Level:API26(or higher)");
+
+        if(PlayerSettings.Android.minSdkVersion < AndroidSdkVersions.AndroidApiLevel26) {
+
+            GUIStyle styleSlide = new GUIStyle();
+            styleSlide.normal.textColor = Color.red;
+            GUILayout.Label("Failed", styleSlide);
+            isApply = false;
+        } else {
+
+            GUIStyle styleApplied = new GUIStyle();
+            styleApplied.normal.textColor = Color.green;
+            GUILayout.Label("Applied", styleApplied);
+        }
+
+        EditorGUILayout.EndHorizontal();
+
+        EditorGUILayout.BeginHorizontal();
+
+        GUILayout.Label("APICompatibilityLevel:.NET4.x");
+
+        if(PlayerSettings.GetApiCompatibilityLevel(BuildTargetGroup.Android) != ApiCompatibilityLevel.NET_4_6) {
+
+            GUIStyle styleSlide = new GUIStyle();
+            styleSlide.normal.textColor = Color.red;
+            GUILayout.Label("Failed", styleSlide);
+            isApply = false;
+        } else {
+
+            GUIStyle styleApplied = new GUIStyle();
+            styleApplied.normal.textColor = Color.green;
+            GUILayout.Label("Applied", styleApplied);
+        }
+
+        EditorGUILayout.EndHorizontal();
+
+
+        EditorGUILayout.BeginHorizontal();
+
+        GUILayout.Label("Multithreaded Rendering:True"); 
+
+        if(PlayerSettings.GetMobileMTRendering(BuildTargetGroup.Android)==false) {
+
+            GUIStyle styleSlide = new GUIStyle();
+            styleSlide.normal.textColor = Color.red;
+            GUILayout.Label("Failed", styleSlide);
+            isApply = false;
+
+        } else {
+
+            GUIStyle styleApplied = new GUIStyle();
+            styleApplied.normal.textColor = Color.green;
+            GUILayout.Label("Applied", styleApplied);
+
+        }
+
+        EditorGUILayout.EndHorizontal();
+
+
+        EditorGUILayout.BeginHorizontal();
+
+        GUILayout.Label("Graphics APIs:Only OpenGLES3");
+        
+        UnityEngine.Rendering.GraphicsDeviceType[] gapi = PlayerSettings.GetGraphicsAPIs(BuildTarget.Android);
+
+        if(gapi.Length != 1 || gapi[0] != UnityEngine.Rendering.GraphicsDeviceType.OpenGLES3) {
+
+            GUIStyle styleSlide = new GUIStyle();
+            styleSlide.normal.textColor = Color.red;
+            GUILayout.Label("Failed", styleSlide);
+            isApply = false;
+        } else {
+
+            GUIStyle styleApplied = new GUIStyle();
+            styleApplied.normal.textColor = Color.green;
+            GUILayout.Label("Applied", styleApplied);
+        }
+
+        EditorGUILayout.EndHorizontal();
+
+
+        EditorGUILayout.BeginHorizontal();
+
+        int staticBatchingValue = 0;
+        int dynamicBatchingValue = 0;
+        Type playerSettingsType = typeof(PlayerSettings);
+        MethodInfo method = playerSettingsType.GetMethod("GetBatchingForPlatform",BindingFlags.NonPublic | BindingFlags.Static);
+        object[] param = new object[] { BuildTarget.Android, staticBatchingValue, dynamicBatchingValue };
+        method.Invoke(null, param);
+
+        GUILayout.Label("Dynamic Batching:Enable");
+        if ((int)param[2] != 1)
+        {
+            GUIStyle styleSlide = new GUIStyle();
+            styleSlide.normal.textColor = Color.red;
+            GUILayout.Label("Failed", styleSlide);
+            isApply = false;
+        }
+        else
+        {
+            GUIStyle styleApplied = new GUIStyle();
+            styleApplied.normal.textColor = Color.green;
+            GUILayout.Label("Applied", styleApplied);
+        }
+
+        EditorGUILayout.EndHorizontal();
+
+
+        EditorGUILayout.BeginHorizontal();
+
+        GUILayout.Label("Asset Serialization:ForceText");
+        if (EditorSettings.serializationMode != SerializationMode.ForceText)
+        {
+            GUIStyle styleSlide = new GUIStyle();
+            styleSlide.normal.textColor = Color.red;
+            GUILayout.Label("Failed", styleSlide);
+            isApply = false;
+        }
+        else
+        {
+
+            GUIStyle styleApplied = new GUIStyle();
+            styleApplied.normal.textColor = Color.green;
+            GUILayout.Label("Applied", styleApplied);
+        }
+        EditorGUILayout.EndHorizontal();
+
+
+        EditorGUILayout.BeginHorizontal();
+
+        GUILayout.Label("Orientation:Landscape Left");
+        if(PlayerSettings.defaultInterfaceOrientation != UIOrientation.LandscapeLeft) {
+
+            GUIStyle styleSlide = new GUIStyle();
+            styleSlide.normal.textColor = Color.red;
+            GUILayout.Label("Failed", styleSlide);
+            isApply = false;
+        } else {
+
+            GUIStyle styleApplied = new GUIStyle();
+            styleApplied.normal.textColor = Color.green;
+            GUILayout.Label("Applied", styleApplied);
+        }
+        EditorGUILayout.EndHorizontal();
+
+        return isApply;
+         
+    }
+    static bool PlayerCheck() {
+        bool isApply = true;
+        if(PlayerSettings.Android.minSdkVersion < AndroidSdkVersions.AndroidApiLevel26) {
+            isApply = false;
+        }
+        if(PlayerSettings.GetApiCompatibilityLevel(BuildTargetGroup.Android) != ApiCompatibilityLevel.NET_4_6) {
+            isApply = false;
+        }
+        if(PlayerSettings.GetMobileMTRendering(BuildTargetGroup.Android) == false) {
+            isApply = false;
+        }
+
+        UnityEngine.Rendering.GraphicsDeviceType[] gapi = PlayerSettings.GetGraphicsAPIs(BuildTarget.Android);
+
+        if(gapi.Length != 1 || gapi[0] != UnityEngine.Rendering.GraphicsDeviceType.OpenGLES3) {
+            isApply = false;
+        }
+
+        if(PlayerSettings.defaultInterfaceOrientation != UIOrientation.LandscapeLeft) {
+            isApply = false;
+        }
+
+        if(EditorSettings.serializationMode != SerializationMode.ForceText) {
+            isApply = false;
+        }
+
+        int staticBatchingValue = 0;
+        int dynamicBatchingValue = 0;
+        Type playerSettingsType = typeof(PlayerSettings);
+        MethodInfo method = playerSettingsType.GetMethod("GetBatchingForPlatform", BindingFlags.NonPublic | BindingFlags.Static);
+        object[] param = new object[] { BuildTarget.Android, staticBatchingValue, dynamicBatchingValue };
+        method.Invoke(null, param);
+        if((int)param[2] != 1) {
+            isApply = false;
+        }
+
+        return isApply;
+    }
+    static void PlayerSet() {
+
+        PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel26;
+        PlayerSettings.Android.targetSdkVersion = AndroidSdkVersions.AndroidApiLevelAuto;
+
+        PlayerSettings.SetApiCompatibilityLevel(BuildTargetGroup.Android, ApiCompatibilityLevel.NET_4_6);
+
+        PlayerSettings.SetMobileMTRendering(BuildTargetGroup.Android, true);
+
+        PlayerSettings.SetUseDefaultGraphicsAPIs(BuildTarget.Android,false);
+        PlayerSettings.SetGraphicsAPIs(BuildTarget.Android,new UnityEngine.Rendering.GraphicsDeviceType[1] { UnityEngine.Rendering.GraphicsDeviceType.OpenGLES3 });
+
+        PlayerSettings.defaultInterfaceOrientation = UIOrientation.LandscapeLeft;
+        EditorSettings.serializationMode = SerializationMode.ForceText;
+        
+        Type playerSettingsType = typeof(PlayerSettings);
+        MethodInfo method = playerSettingsType.GetMethod("SetBatchingForPlatform", BindingFlags.NonPublic | BindingFlags.Static);
+        int staticBatchingValue = 1;
+        int dynamicBatchingValue = 1;
+        object[] param = new object[] { BuildTarget.Android, staticBatchingValue, dynamicBatchingValue };
+        method.Invoke(null, param);
+
+
+    }
+
+    [InitializeOnLoadMethod]
+    static void PlayerSetMust() {
+        if(PlayerSettings.productName == "New Unity Project") {
+            PlayerSettings.productName = "SDK";
+        }
+        if(PlayerSettings.companyName == "DefaultCompany") {
+            PlayerSettings.companyName = "XR";
+        }
+
+    }
+
+    #endregion
+
+    #region ProjectSettings->Tags and Layers
+
+    //[InitializeOnLoadMethod]
+    //static void TagsAndLayerSet() {
+    //    bool isExist = false;
+    //    foreach(var item in UnityEditorInternal.InternalEditorUtility.layers) {
+    //        if(item == "focus") {
+    //            isExist = true;
+    //            break;
+    //        }
+    //    }
+    //    if(isExist == false) {
+    //        AutoAddLayer("focus");
+    //    }
+
+    //    isExist = false;
+    //    foreach(var item in UnityEditorInternal.InternalEditorUtility.layers) {
+    //        if(item == "no light") {
+    //            isExist = true;
+    //            break;
+    //        }
+    //    }
+    //    if(isExist == false) {
+    //        AutoAddLayer("no light"); 
+    //    }
+
+
+    //    isExist = false;
+    //    foreach(var item in UnityEditorInternal.InternalEditorUtility.tags) {
+    //        if(item == "SlamCamera") {
+    //            isExist = true;
+    //            break;
+    //        }
+    //    }
+    //    if(isExist == false) {
+    //        UnityEditorInternal.InternalEditorUtility.AddTag("SlamCamera");
+    //    }
+    //}
+    static void AutoAddLayer(string layer) {
+        SerializedObject tagMagager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/Tagmanager.asset"));
+        SerializedProperty it = tagMagager.GetIterator();
+        while(it.NextVisible(true)) {
+            if(it.name.Equals("layers")) {
+                for(int i = 0; i < it.arraySize; i++) {
+                    if(i <= 7) {
+                        continue;
+                    }
+                    SerializedProperty sp = it.GetArrayElementAtIndex(i);
+                    if(string.IsNullOrEmpty(sp.stringValue)) {
+                        sp.stringValue = layer;
+                        tagMagager.ApplyModifiedProperties();
+                        return;
+                    }
+                }
+            }
+        }
+    }
+
+    //static void AutoAddLayer(string layer) {
+    //    if(!HasThisLayer(layer)) {
+    //        SerializedObject tagMagager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/Tagmanager.asset"));
+    //        SerializedProperty it = tagMagager.GetIterator();
+    //        while(it.NextVisible(true)) {
+    //            if(it.name.Equals("layers")) {
+    //                for(int i = 0; i < it.arraySize; i++) {
+    //                    if(i <= 7) {
+    //                        continue;
+    //                    }
+    //                    SerializedProperty sp = it.GetArrayElementAtIndex(i);
+    //                    if(string.IsNullOrEmpty(sp.stringValue)) {
+    //                        sp.stringValue = layer;
+    //                        tagMagager.ApplyModifiedProperties();
+    //                        return;
+    //                    }
+    //                }
+    //            }
+    //        }
+    //    }
+    //}
+    //static bool HasThisLayer(string layer) {
+    //    //先清除已保存的
+    //    SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/Tagmanager.asset"));
+    //    SerializedProperty it = tagManager.GetIterator();
+    //    while(it.NextVisible(true)) {
+    //        if(it.name.Equals("layers")) {
+    //            for(int i = 0; i < it.arraySize; i++) {
+    //                if(i <= 7) {
+    //                    continue;
+    //                }
+    //                SerializedProperty sp = it.GetArrayElementAtIndex(i);
+    //                if(!string.IsNullOrEmpty(sp.stringValue)) {
+    //                    if(sp.stringValue.Equals(layer)) {
+    //                        sp.stringValue = string.Empty;
+    //                        tagManager.ApplyModifiedProperties();
+    //                    }
+    //                }
+    //            }
+    //        }
+    //    }
+    //    for(int i = 0; i < UnityEditorInternal.InternalEditorUtility.layers.Length; i++) {
+    //        if(UnityEditorInternal.InternalEditorUtility.layers[i].Contains(layer)) {
+    //            return true;
+    //        }
+    //    }
+    //    return false;
+    //}
+    #endregion
+
+    #region ProjectSettings->Quality
+
+    static bool QualityWindow() {
+        bool isApply = true;
+        GUILayout.Label("QulitySettings", EditorStyles.boldLabel);
+
+        EditorGUILayout.BeginHorizontal();
+
+        GUILayout.Label("QulityLevel:Middle");
+
+        if(QualitySettings.GetQualityLevel() != 2) {
+
+            GUIStyle styleSlide = new GUIStyle();
+            styleSlide.normal.textColor = Color.red;
+            GUILayout.Label("Failed", styleSlide);
+            isApply = false;
+        } else {
+
+            GUIStyle styleApplied = new GUIStyle();
+            styleApplied.normal.textColor = Color.green;
+            GUILayout.Label("Applied", styleApplied);
+        }
+
+        EditorGUILayout.EndHorizontal();
+
+        return isApply;
+    }
+    static bool QualityCheck() {
+        bool isApply = true;
+        if(QualitySettings.GetQualityLevel() != 2) {
+            isApply = false;
+        }
+        return isApply;
+    }
+    static void QualitySet() {
+        QualitySettings.SetQualityLevel(2);
+    }
+
+    #endregion
+}

+ 11 - 0
Runtime/SDK/Common/Base/Editor/BuildSettings/SDKSettings.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/Log.meta

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

+ 69 - 0
Runtime/SDK/Common/Base/Log/DebugMy.cs

@@ -0,0 +1,69 @@
+using System;
+using UnityEngine;
+
+namespace SC.XR.Unity {
+    public class DebugMy {
+
+        static string Tag ;
+        public static bool isShowNormalLog = false;
+        public static bool isShowErrorLog = true;
+
+        private static string sdkVersion = "";
+        private static string SdkVersion {
+            get {
+                if (sdkVersion == "") {
+                    sdkVersion = API_Module_SDKVersion.Version;
+                }
+                return sdkVersion;
+            }
+        }
+
+        public static void Log(string msg, object o, bool current = false,bool all = false) {
+         //   return;
+            if(all == true) {
+                isShowNormalLog = true;
+            }
+
+            if(isShowNormalLog == false && current == false)
+                return;
+            
+            Tag = "[ SDK:"+ SdkVersion + " ][ FrameCount:" + Time.frameCount + " ]";
+
+            if(o == null) {
+                if(Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.WindowsEditor) {
+                    Debug.Log(Tag + msg);
+                } else {
+                    Console.WriteLine(Tag + msg);
+                }
+            } else {
+                if(Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.WindowsEditor) {
+                    //Debug.Log(Tag + "[" + o.GetType().ToString() + "]: " + msg);
+                } else {
+                    Console.WriteLine(Tag + "[" + o.GetType().ToString() + "]: " + msg);
+                }
+            }
+
+        }
+
+        public static void LogError(string msg, object o) {
+            if(isShowErrorLog == false)
+                return;
+            Tag = "[ SDK:" + SdkVersion + " ][ FrameCount:" + Time.frameCount + " ]";
+
+            if(o == null) {
+                if(Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.WindowsEditor) {
+                    Debug.Log(Tag + msg);
+                } else {
+                    Console.WriteLine(Tag + msg);
+                }
+            } else {
+                if(Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.WindowsEditor) {
+                    //Debug.Log(Tag + "[" + o.GetType().ToString() + "]: " + msg);
+                } else {
+                    Console.WriteLine(Tag + "[" + o.GetType().ToString() + "]: " + msg);
+                }
+            }
+        }
+    }
+}
+

+ 11 - 0
Runtime/SDK/Common/Base/Log/DebugMy.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/SCLifeCycle.meta

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

+ 13 - 0
Runtime/SDK/Common/Base/SCLifeCycle/ISCLifeCycle.cs

@@ -0,0 +1,13 @@
+
+namespace SC.XR.Unity {
+    public interface ISCLifeCycle {
+        void OnSCAwake();
+        void OnSCEnable();
+        void OnSCStart();
+        void OnSCUpdate();
+        void OnSCLateUpdate();
+        void OnSCFuncitonWaitForEndOfFrame();
+        void OnSCDisable();
+        void OnSCDestroy();
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/SCLifeCycle/ISCLifeCycle.cs.meta

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

+ 46 - 0
Runtime/SDK/Common/Base/SCLifeCycle/SCLifeCycle.cs

@@ -0,0 +1,46 @@
+
+namespace SC.XR.Unity {
+
+    public abstract class SCLifeCycle : ISCLifeCycle {
+
+        public SCLifeCycle() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "创建 ", this);
+        }
+
+        ~SCLifeCycle() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "析构", this);
+        }
+
+        public virtual void OnSCAwake() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCAwake", this);
+        }
+
+        public virtual void OnSCEnable() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCEnable", this);
+        }
+
+        public virtual void OnSCStart() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCStart", this);
+        }
+
+        public virtual void OnSCUpdate() {
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCUpdate", this);
+        }
+
+        public virtual void OnSCLateUpdate() {
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCLateUpdate", this);
+        }
+
+        public virtual void OnSCFuncitonWaitForEndOfFrame() {
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCFuncitonWaitForEndOfFrame", this);
+        }
+
+        public virtual void OnSCDisable() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCDisable", this);
+        }
+
+        public virtual void OnSCDestroy() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCDestroy", this);
+        }
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/SCLifeCycle/SCLifeCycle.cs.meta

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

+ 39 - 0
Runtime/SDK/Common/Base/SCLifeCycle/SCLifeCycleMono.cs

@@ -0,0 +1,39 @@
+using UnityEngine;
+
+namespace SC.XR.Unity {
+    public abstract class SCLifeCycleMono : MonoBehaviour, ISCLifeCycle {
+
+
+        public virtual void OnSCAwake() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCAwake", this);
+        }
+
+        public virtual void OnSCEnable() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCEnable", this);
+        }
+
+        public virtual void OnSCStart() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCStart", this);
+        }
+
+        public virtual void OnSCUpdate() {
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCUpdate", this);
+        }
+
+        public virtual void OnSCLateUpdate() {
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCLateUpdate", this);
+        }
+
+        public virtual void OnSCFuncitonWaitForEndOfFrame() {
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCFuncitonWaitForEndOfFrame", this);
+        }
+
+        public virtual void OnSCDisable() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCDisable", this);
+        }
+
+        public virtual void OnSCDestroy() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCDestroy", this);
+        }
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/SCLifeCycle/SCLifeCycleMono.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/SCModel.meta

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

+ 52 - 0
Runtime/SDK/Common/Base/SCModel/ISCModule.cs

@@ -0,0 +1,52 @@
+
+namespace SC.XR.Unity {
+
+    public enum SCModulePriority { 
+        High,
+        Middle,
+        Low,
+    }
+
+    public interface ISCModule : ISCLifeCycle {
+
+        string ModuleName { get; set; }
+
+        ISCModule FatherModule { get; set; }
+
+        bool IsModuleInit { get; set; }
+        
+        bool IsModuleStarted { get; set; }
+
+        bool IsMono { get; set; }
+
+        bool IsEffectGameObject { get; set; }
+
+        SCModulePriority Priority { get; set; }
+
+        T GetSubModule<T>() where T : ISCModule;
+
+        T GetFatherModule<T>() where T : ISCModule;
+
+        /// <summary>
+        /// 模块初始化
+        /// </summary>
+        void ModuleInit(bool isEffectGameObject = true,SCModulePriority priority = SCModulePriority.Middle);
+        //void ModuleEnable();
+        /// <summary>
+        /// 模块启动,同Mono OnEnable
+        /// </summary>
+        void ModuleStart();
+        void ModuleUpdate();
+        void ModuleLateUpdate();
+        void ModuleEndOfFrame();
+        /// <summary>
+        /// 模块停止,同Mono OnDisable
+        /// </summary>
+        void ModuleStop();
+        /// <summary>
+        /// 模块销毁
+        /// </summary>
+        void ModuleDestroy();
+
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/SCModel/ISCModule.cs.meta

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

+ 341 - 0
Runtime/SDK/Common/Base/SCModel/SCModule.cs

@@ -0,0 +1,341 @@
+using System;
+using System.Collections.Generic;
+
+namespace SC.XR.Unity {
+
+    public abstract class SCModule : ISCModule {
+
+        public string ModuleName { get; set; }
+        public bool IsModuleInit { get; set; }
+        public bool IsModuleStarted { get; set; }
+        public ISCModule FatherModule { get; set; }
+
+        List<ISCModule> subModuleList = new List<ISCModule>();
+        public bool IsMono { get; set; }
+        public SCModulePriority Priority { get; set; }
+        public bool IsEffectGameObject { get; set; }
+
+
+        /// <summary>
+        /// Module 初始化 ===================================
+        /// </summary>
+        public void ModuleInit(bool isEffectGameObject = true, SCModulePriority priority = SCModulePriority.Middle) {
+            if(IsModuleInit) {
+                DebugMy.LogError("ModuleInit Had Invoke", this);
+                return;
+            }
+
+            IsModuleInit = true;
+            ModuleName = GetType().ToString();
+            IsMono = false;
+
+            IsEffectGameObject = isEffectGameObject;
+            Priority = priority;
+
+            OnSCAwake();
+        }
+        public virtual void OnSCAwake() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCAwake", this);
+        }
+        /// <summary>
+        /// Module 初始化 ===================================
+        /// </summary>
+
+
+
+
+
+        /// <summary>
+        /// ModuleEnable ===================================
+        /// </summary>
+        [Obsolete("Should not use the EventFunction")]
+        public void OnSCEnable() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCEnable", this);
+        }
+        /// <summary>
+        /// ModuleEnable ===================================
+        /// </summary>
+
+
+
+
+
+
+
+        /// <summary>
+        /// Module 启动 ===================================
+        /// </summary>
+        public void ModuleStart() {
+            if(!IsModuleInit) {
+                DebugMy.Log("Please Invoke ModuleInit First", this);
+                return;
+            }
+            if(IsModuleStarted) {
+                DebugMy.Log("ModuleStart Had Invoke", this);
+                return;
+            }
+            
+            IsModuleStarted = true;
+
+            OnSCStart();
+        }
+
+        public virtual void OnSCStart() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCStart", this);
+        }
+        /// <summary>
+        /// Module 启动 ===================================
+        /// </summary>
+        /// 
+
+
+
+
+
+
+        /// <summary>
+        /// Module Update ===================================
+        /// </summary>
+        public void ModuleUpdate() {
+
+            if(IsModuleInit == false || IsModuleStarted == false) {
+                //DebugMy.Log("Pleaase Invoke ModuleInit First", this);
+                return;
+            }
+
+            OnSCUpdate();
+        }
+        public virtual void OnSCUpdate() {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    Module.ModuleUpdate();
+                }
+            }
+
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCUpdate", this);
+        }
+        /// <summary>
+        /// Module Update ===================================
+        /// </summary>
+
+
+
+
+        /// <summary>
+        /// Module LateUpdate ===================================
+        /// </summary>
+        public void ModuleLateUpdate() {
+            if(IsModuleInit == false || IsModuleStarted == false) {
+                //DebugMy.Log("Please Invoke ModuleInit First", this);
+                return;
+            }
+
+            OnSCLateUpdate();
+        }
+        public virtual void OnSCLateUpdate() {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    Module.ModuleLateUpdate();
+                }
+            }
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCLateUpdate", this);
+        }
+        /// <summary>
+        /// Module LateUpdate ===================================
+        /// </summary>
+
+
+
+
+
+
+        /// <summary>
+        /// ModuleEndOfFrame ===================================
+        /// </summary>
+        public void ModuleEndOfFrame() {
+            if(IsModuleInit == false || IsModuleStarted == false) {
+                //DebugMy.Log("Please Invoke ModuleInit First", this);
+                return;
+            }
+
+            OnSCFuncitonWaitForEndOfFrame();
+        }
+        public virtual void OnSCFuncitonWaitForEndOfFrame() {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    Module.ModuleEndOfFrame();
+                }
+            }
+
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCFuncitonWaitForEndOfFrame", this);
+        }
+        /// <summary>
+        /// ModuleEndOfFrame ===================================
+        /// </summary>
+
+
+
+
+
+        /// <summary>
+        /// ModuleStop ===================================
+        /// </summary>
+        public void ModuleStop() {
+            if(IsModuleInit == false) {
+                DebugMy.Log("ModuleStop: Please Invoke ModuleInit First", this);
+                return;
+            }
+
+            if(IsModuleStarted == false) {
+                DebugMy.Log("ModuleStop: Please Invoke ModuleStart First", this);
+                return;
+            }
+
+            OnSCDisable();
+
+            IsModuleStarted = false;
+        }
+        public virtual void OnSCDisable() {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    Module.ModuleStop();
+                }
+            }
+
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCDisable", this);
+        }
+        /// <summary>
+        /// ModuleStop ===================================
+        /// </summary>
+
+
+
+
+        /// <summary>
+        /// ModuleDestroy ===================================
+        /// </summary>
+        public void ModuleDestroy() {
+
+            if(IsModuleInit == false) {
+                DebugMy.Log("ModuleDestroy: Please Invoke ModuleInit First", this);
+                return;
+            }
+
+            OnSCDestroy();
+
+            IsModuleInit = false;
+            IsModuleStarted = false;
+            FatherModule = null;
+            ModuleName = "";
+
+        }
+        public virtual void OnSCDestroy() {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    Module.ModuleDestroy();
+                }
+            }
+            subModuleList.Clear();
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCDestroy", this);
+        }
+        /// <summary>
+        /// ModuleDestroy ===================================
+        /// </summary>
+
+
+
+
+
+
+
+
+
+
+
+        public void AddModule(ISCModule Module, bool isEffectGameObject = true, SCModulePriority priority = SCModulePriority.Middle) {
+            if(Module == null)
+                return;
+
+            Module.FatherModule = this;
+            Module.ModuleInit(isEffectGameObject, priority);
+
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "Module '" + Module.GetType() + "' [HashCode: " + Module.GetHashCode() + "] Add To Module '" + GetType(), this);
+            lock(subModuleList) {
+                if (subModuleList.Contains(Module) == false) {
+                    subModuleList.Add(Module);
+                }
+            }
+        }
+
+        public void RemoveModule(ISCModule Module) {
+            if(Module == null)
+                return;
+
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "Module '" + Module.GetType() + "' [HashCode: " + Module.GetHashCode() + "] Remove From Module '" + GetType(), this);
+            lock(subModuleList) {
+                if (subModuleList.Contains(Module) == true) {
+                    subModuleList.Remove(Module);
+                }
+            }
+
+            Module.ModuleDestroy();
+            Module.FatherModule = null;
+        }
+
+        public void RemoveAllModule() {
+            lock(subModuleList) {
+                foreach(var item in subModuleList) {
+                    item.ModuleDestroy();
+                }
+            }
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "Remove All Module '" + GetType(), this);
+            subModuleList.Clear();
+        }
+
+        public virtual T GetSubModule<T>() where T : ISCModule {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    if(typeof(T).ToString() == Module.ModuleName) {
+                        DebugMy.Log("[HashCode: " + GetHashCode() + "] Module" + typeof(T).ToString() + " Found ", this);
+                        return (T)Module;
+                    }
+                }
+            }
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] Module" + typeof(T).ToString() + " No Found ", this);
+            return default(T);
+        }
+
+        /// <summary>
+        /// 返回直接父
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <returns></returns>
+        public virtual T GetFatherModule<T>() where T : ISCModule {
+            ISCModule father = FatherModule;
+
+            while(father != null) {
+                if(father.ModuleName == typeof(T).ToString()) {
+                    DebugMy.Log("[HashCode: " + GetHashCode() + "] FatherModule" + father.ModuleName + " Found ", this);
+                    return (T)father;
+                }
+                father = father.FatherModule;
+            }
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] FatherModule" + typeof(T).ToString() + " Found ", this);
+            return default(T);
+        }
+
+
+        public T Transition<T>(ISCModule data) where T : class {
+            if((data as T) == null)
+                throw new ArgumentException(String.Format("Invalid type: {0} passed to event expecting {1}", data.GetType(), typeof(T)));
+            return data as T;
+        }
+
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/SCModel/SCModule.cs.meta

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

+ 354 - 0
Runtime/SDK/Common/Base/SCModel/SCModuleMono.cs

@@ -0,0 +1,354 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace SC.XR.Unity {
+
+    public abstract class SCModuleMono : MonoBehaviour, ISCModule {
+
+        public string ModuleName { get; set; }
+        public bool IsModuleInit { get; set; }
+        public bool IsModuleStarted { get; set; }
+        public ISCModule FatherModule { get; set; }
+
+        List<ISCModule> subModuleList = new List<ISCModule>();
+        public bool IsMono { get; set; }
+        public SCModulePriority Priority { get; set; }
+        public bool IsEffectGameObject { get; set; }
+
+
+        /// <summary>
+        /// Module 初始化 ===================================
+        /// </summary>
+        public void ModuleInit(bool isEffectGameObject = true, SCModulePriority priority = SCModulePriority.Middle) {
+            if(IsModuleInit) {
+                DebugMy.LogError("ModuleInit Had Invoke", this);
+                return;
+            }
+
+            IsModuleInit = true;
+            ModuleName = GetType().ToString();
+            IsMono = true;
+
+            IsEffectGameObject = isEffectGameObject;
+            Priority = priority;
+
+            OnSCAwake();
+
+            if(IsEffectGameObject) {
+                gameObject.SetActive(false);
+            }
+        }
+        public virtual void OnSCAwake() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCAwake", this);
+        }
+        /// <summary>
+        /// Module 初始化 ===================================
+        /// </summary>
+
+
+
+
+
+        /// <summary>
+        /// ModuleEnable ===================================
+        /// </summary>
+        [Obsolete("Should not use the EventFunction")]
+        public void OnSCEnable() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCEnable", this);
+        }
+        /// <summary>
+        /// ModuleEnable ===================================
+        /// </summary>
+
+
+
+
+
+
+
+        /// <summary>
+        /// Module 启动 ===================================
+        /// </summary>
+        public void ModuleStart() {
+            if(!IsModuleInit) {
+                DebugMy.Log("Please Invoke ModuleInit First", this);
+                return;
+            }
+            if(IsModuleStarted) {
+                DebugMy.Log("ModuleStart Had Invoke", this);
+                return;
+            }
+            
+            IsModuleStarted = true;
+            
+            if(IsEffectGameObject) {
+                gameObject.SetActive(true);
+            }
+
+            OnSCStart();
+        }
+
+        public virtual void OnSCStart() {
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCStart", this);
+        }
+        /// <summary>
+        /// Module 启动 ===================================
+        /// </summary>
+        /// 
+
+
+
+
+
+
+        /// <summary>
+        /// Module Update ===================================
+        /// </summary>
+        public void ModuleUpdate() {
+
+            if(IsModuleInit == false || IsModuleStarted == false) {
+                //DebugMy.Log("Pleaase Invoke ModuleInit First", this);
+                return;
+            }
+
+            OnSCUpdate();
+        }
+        public virtual void OnSCUpdate() {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    Module.ModuleUpdate();
+                }
+            }
+
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCUpdate", this);
+        }
+        /// <summary>
+        /// Module Update ===================================
+        /// </summary>
+
+
+
+
+        /// <summary>
+        /// Module LateUpdate ===================================
+        /// </summary>
+        public void ModuleLateUpdate() {
+            if(IsModuleInit == false || IsModuleStarted == false) {
+                //DebugMy.Log("Please Invoke ModuleInit First", this);
+                return;
+            }
+
+            OnSCLateUpdate();
+        }
+        public virtual void OnSCLateUpdate() {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    Module.ModuleLateUpdate();
+                }
+            }
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCLateUpdate", this);
+        }
+        /// <summary>
+        /// Module LateUpdate ===================================
+        /// </summary>
+
+
+
+
+
+
+        /// <summary>
+        /// ModuleEndOfFrame ===================================
+        /// </summary>
+        public void ModuleEndOfFrame() {
+            if(IsModuleInit == false || IsModuleStarted == false) {
+                //DebugMy.Log("Please Invoke ModuleInit First", this);
+                return;
+            }
+
+            OnSCFuncitonWaitForEndOfFrame();
+        }
+        public virtual void OnSCFuncitonWaitForEndOfFrame() {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    Module.ModuleEndOfFrame();
+                }
+            }
+
+            //DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCFuncitonWaitForEndOfFrame", this);
+        }
+        /// <summary>
+        /// ModuleEndOfFrame ===================================
+        /// </summary>
+
+
+
+
+
+        /// <summary>
+        /// ModuleStop ===================================
+        /// </summary>
+        public void ModuleStop() {
+            if(IsModuleInit == false) {
+                DebugMy.Log("ModuleStop: Please Invoke ModuleInit First", this);
+                return;
+            }
+
+            if(IsModuleStarted == false) {
+                DebugMy.Log("ModuleStop: Please Invoke ModuleStart First", this);
+                return;
+            }
+
+            OnSCDisable();
+
+            IsModuleStarted = false;
+
+            if(IsEffectGameObject) {
+                gameObject.SetActive(false);
+            }
+        }
+        public virtual void OnSCDisable() {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    Module.ModuleStop();
+                }
+            }
+
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCDisable", this);
+        }
+        /// <summary>
+        /// ModuleStop ===================================
+        /// </summary>
+
+
+
+
+        /// <summary>
+        /// ModuleDestroy ===================================
+        /// </summary>
+        public void ModuleDestroy() {
+
+            if(IsModuleInit == false) {
+                DebugMy.Log("ModuleDestroy: Please Invoke ModuleInit First", this);
+                return;
+            }
+
+            OnSCDestroy();
+
+            IsModuleInit = false;
+            IsModuleStarted = false;
+            FatherModule = null;
+            ModuleName = "";
+
+        }
+        public virtual void OnSCDestroy() {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    Module.ModuleDestroy();
+                }
+            }
+            subModuleList.Clear();
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "OnSCDestroy", this);
+        }
+        /// <summary>
+        /// ModuleDestroy ===================================
+        /// </summary>
+
+
+
+
+
+
+
+
+
+
+
+        public void AddModule(ISCModule Module, bool isEffectGameObject = true, SCModulePriority priority = SCModulePriority.Middle) {
+            if(Module == null)
+                return;
+
+            Module.FatherModule = this;
+            Module.ModuleInit(isEffectGameObject, priority);
+
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "Module '" + Module.GetType() + "' [HashCode: " + Module.GetHashCode() + "] Add To Module '" + GetType(), this);
+            lock(subModuleList) {
+                if (subModuleList.Contains(Module) == false) {
+                    subModuleList.Add(Module);
+                }
+            }
+        }
+
+        public void RemoveModule(ISCModule Module) {
+            if(Module == null)
+                return;
+
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "Module '" + Module.GetType() + "' [HashCode: " + Module.GetHashCode() + "] Remove From Module '" + GetType(), this);
+            lock(subModuleList) {
+                if (subModuleList.Contains(Module) == true) {
+                    subModuleList.Remove(Module);
+                }
+            }
+
+            Module.ModuleDestroy();
+            Module.FatherModule = null;
+        }
+
+        public void RemoveAllModule() {
+            lock(subModuleList) {
+                foreach(var item in subModuleList) {
+                    item.ModuleDestroy();
+                }
+            }
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] " + "Remove All Module '" + GetType(), this);
+            subModuleList.Clear();
+        }
+
+        public virtual T GetSubModule<T>() where T : ISCModule {
+
+            lock(subModuleList) {
+                foreach(var Module in subModuleList) {
+                    if(typeof(T).ToString() == Module.ModuleName) {
+                        DebugMy.Log("[HashCode: " + GetHashCode() + "] Module" + typeof(T).ToString() + " Found ", this);
+                        return (T)Module;
+                    }
+                }
+            }
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] Module" + typeof(T).ToString() + " No Found ", this);
+            return default(T);
+        }
+
+        /// <summary>
+        /// 返回直接父
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <returns></returns>
+        public virtual T GetFatherModule<T>() where T : ISCModule {
+            ISCModule father = FatherModule;
+
+            while(father != null) {
+                if(father.ModuleName == typeof(T).ToString()) {
+                    DebugMy.Log("[HashCode: " + GetHashCode() + "] FatherModule" + father.ModuleName + " Found ", this);
+                    return (T)father;
+                }
+                father = father.FatherModule;
+            }
+            DebugMy.Log("[HashCode: " + GetHashCode() + "] FatherModule" + typeof(T).ToString() + " Found ", this);
+            return default(T);
+        }
+
+
+        public T Transition<T>(ISCModule data) where T : class {
+            if((data as T) == null)
+                throw new ArgumentException(String.Format("Invalid type: {0} passed to event expecting {1}", data.GetType(), typeof(T)));
+            return data as T;
+        }
+
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/SCModel/SCModuleMono.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/Singleton.meta

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

+ 25 - 0
Runtime/SDK/Common/Base/Singleton/Singleton.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SC.XR.Unity
+{ 
+    public abstract class Singleton<T> where T : class, new()
+    {
+        protected Singleton()
+        {
+
+        }
+
+        private readonly static Lazy<T> instance = new Lazy<T>(() => new T());
+        public static T Instance
+        {
+            get
+            {
+                return instance.Value;
+            }
+        }
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/Singleton/Singleton.cs.meta

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

+ 42 - 0
Runtime/SDK/Common/Base/Singleton/SingletonMono.cs

@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using UnityEngine;
+
+namespace SC.XR.Unity
+{
+    public abstract class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour
+    {
+        private static T instance;
+
+        private static object lockObj = new object();
+
+        public static T Instance
+        {
+            get
+            {
+                if (instance == null)
+                {
+                    instance = (T)FindObjectOfType(typeof(T));
+
+                    if (instance == null)
+                    {
+                        lock (lockObj)
+                        {
+                            if (instance == null)
+                            {
+                                GameObject singleton = new GameObject();
+                                instance = singleton.AddComponent<T>();
+                                singleton.name = "(Singleton) " + typeof(T).Name;
+                                DontDestroyOnLoad(singleton);
+                            }
+                        }
+                    }
+                }
+                return instance;
+            }
+        }
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/Singleton/SingletonMono.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/SpecificationType.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/SpecificationType/SpecificationType.cs

@@ -0,0 +1,8 @@
+
+
+namespace SC.XR.Unity {
+    public enum SpecificationType {
+        GSXR,
+        Other,
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/SpecificationType/SpecificationType.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/TrackMode.meta

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

+ 12 - 0
Runtime/SDK/Common/Base/TrackMode/TrackMode.cs

@@ -0,0 +1,12 @@
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace SC.XR.Unity {
+    public enum TrackMode {
+        Mode_3Dof,
+        Mode_6Dof,
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/TrackMode/TrackMode.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/WebRquest.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/WebRquest/Base.meta

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

+ 128 - 0
Runtime/SDK/Common/Base/WebRquest/Base/WebRequestBase.cs

@@ -0,0 +1,128 @@
+using LitJson;
+using System;
+using System.Collections;
+using UnityEngine;
+using UnityEngine.Networking;
+
+namespace SC.XR.Unity {
+    /// <summary>
+    /// 一个WebRequest的基类
+    /// </summary>
+    public abstract class WebRequestBase {
+        public string url;
+        public WWWForm wwwForm;
+        public WebRequestType webRequestType;
+        protected JsonData responseJsonData;
+
+        protected Action<JsonData> mSuccess;
+        protected Action<JsonData> mFailed;
+        protected Action<JsonData> mErrorCallBack;
+
+
+        public enum WebRequestType {
+            GET,
+            POST,
+            PUT,
+        }
+
+        public string LOGTAG = "[WebRequestBase]:";
+
+        public WebRequestBase(string _url, WWWForm _form, Action<JsonData> success, Action<JsonData> failed, Action<JsonData> errorCallBack = null) {
+            url = _url;
+            wwwForm = _form;
+            mSuccess = success;
+            mFailed = failed;
+            mErrorCallBack = errorCallBack;
+        }
+
+        //public abstract void Success(JsonData responseJson);
+        //public abstract void Failed(JsonData responseJson);
+
+        public virtual void NetWorkError(string errText) {
+            Debug.Log(LOGTAG + "NetWorkError");
+            //try {
+            //    UISystem.Instant.PushUIPanel(UIPanelsType.InfoType1Panel, "ERROR: NetWorkError,Please Open Wifi");
+            //} catch (Exception e) {
+            //    Debug.Log(e);
+            //}
+        }
+
+
+        public virtual IEnumerator SendRequest() {
+
+            if(webRequestType == WebRequestType.GET) {
+                UnityWebRequest www = UnityWebRequest.Get(url);
+                yield return www.SendWebRequest();
+                if(www.isNetworkError || www.isHttpError) {
+                    Debug.Log(www.error);
+                    //responseJsonData = JsonMapper.ToObject(www.error);
+                    NetWorkError(www.error);
+                } else {
+                    Debug.Log(www.downloadHandler.text);
+                    responseJsonData = JsonMapper.ToObject(www.downloadHandler.text);
+                    if(mSuccess != null) {
+                        mSuccess(responseJsonData);
+                    }
+
+                }
+
+            } else if(webRequestType == WebRequestType.POST) {
+                try {
+                    //if (UserSystem.Instant.SysInfo.UserToken != null) {
+                    //    wwwForm.AddField("token", UserSystem.Instant.SysInfo.UserToken);
+                    //    Debug.Log("[" + GetType().ToString() + "]: " + "Form Add UserToken !");
+                    //}
+                } catch(Exception e) {
+                    Debug.Log(e + "\nUserSystem.Instant.SysInfo.UserToken is Null");
+                }
+
+                Debug.Log("[" + GetType().ToString() + "]: " + "SendRequest:" + "URL:" + url + "\nFormData:" + System.Text.Encoding.Default.GetString(wwwForm.data));
+                UnityWebRequest www = UnityWebRequest.Post(url, wwwForm);
+                yield return www.SendWebRequest();
+                if(www.isNetworkError || www.isHttpError) {
+                    Debug.Log(www.error);
+                    //responseJsonData = JsonMapper.ToObject(www.error);
+                    if(mErrorCallBack != null) {
+                        mErrorCallBack(www.error);
+                    }
+                    NetWorkError(www.error);
+                } else {
+                    Debug.Log("[" + GetType().ToString() + "]: \n" + www.downloadHandler.text);
+                    try {
+                        responseJsonData = JsonMapper.ToObject(www.downloadHandler.text);
+                        if("200" == responseJsonData["code"].ToString()) {
+                            if(mSuccess != null) {
+                                mSuccess(responseJsonData);
+                            }
+                        } else if("-1" == responseJsonData["code"].ToString()) {
+
+                            try {
+                                if(responseJsonData["msg"].ToString() == "验证失败,请重新获取系统token") {
+                                    // UserSystem.Instant.SysInfo.ResetUserInfo();
+                                }
+                            } catch(Exception e) {
+                                Debug.Log(e);
+                            }
+
+
+                            if(mFailed != null) {
+                                mFailed(responseJsonData);
+                            }
+                        } else {
+                            if(mFailed != null) {
+                                mFailed(responseJsonData);
+                            }
+                        }
+                    } catch(Exception e) {
+                        Debug.Log(e);
+
+                    }
+
+
+                }
+            }
+        }
+
+    }
+
+}

+ 11 - 0
Runtime/SDK/Common/Base/WebRquest/Base/WebRequestBase.cs.meta

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

+ 40 - 0
Runtime/SDK/Common/Base/WebRquest/Base/WebRequestServerBase.cs

@@ -0,0 +1,40 @@
+using System.Collections;
+using System.Collections.Generic;
+
+namespace SC.XR.Unity {
+    /// <summary>
+    /// 一个WebRequest发送系统的基类
+    /// </summary>
+    public class WebRequestServerBase : SCModuleMono {
+
+        protected List<WebRequestBase> webRequestList = new List<WebRequestBase>();
+        public void AddWebRequest(WebRequestBase webRequest) {
+            webRequestList.Add(webRequest);
+            CheckQueue();
+        }
+
+        void CheckQueue() {
+            if(webRequestList.Count == 0) {
+                return;
+            }
+            StartCoroutine(SendRequest());
+        }
+
+        IEnumerator SendRequest() {
+            ///加yield return null目的是将Web请求延迟到下一帧开始,避免web回复委托还没添加,web已经回复,导致错过信息
+            yield return null;
+
+            WebRequestBase webRequest = webRequestList[0];
+            webRequestList.RemoveAt(0);
+            yield return StartCoroutine(webRequest.SendRequest());
+            CheckQueue();
+        }
+
+        public override void OnSCDestroy() {
+            base.OnSCDestroy();
+            StopAllCoroutines();
+            webRequestList.Clear();
+        }
+
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/WebRquest/Base/WebRequestServerBase.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/Base/XRType.meta

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

+ 14 - 0
Runtime/SDK/Common/Base/XRType/XRType.cs

@@ -0,0 +1,14 @@
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace SC.XR.Unity {
+    public enum XRType {
+        Unknow = 0,
+        AR = 1,
+        VR = 2,
+        MR = 3
+    }
+}

+ 11 - 0
Runtime/SDK/Common/Base/XRType/XRType.cs.meta

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

+ 8 - 0
Runtime/SDK/Common/StandardAssets.meta

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

+ 8 - 0
Runtime/SDK/Common/StandardAssets/Audio.meta

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

BIN
Runtime/SDK/Common/StandardAssets/Audio/ButtonPress.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/ButtonPress.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: b3e99c3cfc154f448947d69fd8142765
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/ButtonUnpress.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/ButtonUnpress.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: 5674b0fa5c3617849b8beac90254458f
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Manipulation_End.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Manipulation_End.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: 11a9ab7e0c34cca49a6e24aaddfee3e9
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Manipulation_Start.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Manipulation_Start.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: f2933c7ec5adc69428156ffc83955ef7
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Move_End.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Move_End.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: 4e29445a335abbc4097dde67ff49cff1
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Move_Start.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Move_Start.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: 0643f79600b74f247a26d8a6f155669f
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Notification.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Notification.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: 8ad3909f1241f2f49aebb1c9d0a74d54
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Rotate_Start.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Rotate_Start.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: 5f3396f116231d347a9aeb8e945bfed3
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Rotate_Stop.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Rotate_Stop.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: 4376c81e6323a554a88de9a17a130197
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Scale_Start.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Scale_Start.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: 3b0991ad88c2aa44d867bb0805d52a8b
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Scale_Stop.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Scale_Stop.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: 8270e548a41e81f4d9457e67ebd8ac7e
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Select_Main.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Select_Main.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: aaae599df35803f48954c74c58dccdb6
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Select_Secondary.wav


+ 22 - 0
Runtime/SDK/Common/StandardAssets/Audio/Select_Secondary.wav.meta

@@ -0,0 +1,22 @@
+fileFormatVersion: 2
+guid: fd3a7b9826ff03d41a52da1605a039d8
+AudioImporter:
+  externalObjects: {}
+  serializedVersion: 6
+  defaultSettings:
+    loadType: 0
+    sampleRateSetting: 0
+    sampleRateOverride: 44100
+    compressionFormat: 1
+    quality: 1
+    conversionMode: 0
+  platformSettingOverrides: {}
+  forceToMono: 0
+  normalize: 1
+  preloadAudioData: 1
+  loadInBackground: 0
+  ambisonic: 0
+  3D: 1
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Runtime/SDK/Common/StandardAssets/Audio/Shell_Click_In.wav


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott