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

提交一波。。。。

xyh1985 1 éve
szülő
commit
d989fba8ff
100 módosított fájl, 5261 hozzáadás és 401 törlés
  1. 1 1
      Unity/Assets/Bundles/Config/AIConfigCategory.bytes.meta
  2. 49 0
      Unity/Assets/Bundles/Config/FightChatConfigCategory.bytes
  3. 7 0
      Unity/Assets/Bundles/Config/FightChatConfigCategory.bytes.meta
  4. 1 1
      Unity/Assets/Bundles/Config/UnitConfigCategory.bytes.meta
  5. 239 396
      Unity/Assets/Bundles/UI/UIStartFightRoom.prefab
  6. 91 1
      Unity/Assets/Bundles/UI/UIStats.prefab
  7. 1 1
      Unity/Assets/Debugger.meta
  8. 9 0
      Unity/Assets/Debugger/Component.meta
  9. 30 0
      Unity/Assets/Debugger/Component/DebuggerActiveWindowType.cs
  10. 12 0
      Unity/Assets/Debugger/Component/DebuggerActiveWindowType.cs.meta
  11. 66 0
      Unity/Assets/Debugger/Component/DebuggerComponent.ConsoleWindow.LogNode.cs
  12. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.ConsoleWindow.LogNode.cs.meta
  13. 459 0
      Unity/Assets/Debugger/Component/DebuggerComponent.ConsoleWindow.cs
  14. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.ConsoleWindow.cs.meta
  15. 63 0
      Unity/Assets/Debugger/Component/DebuggerComponent.EnvironmentInformationWindow.cs
  16. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.EnvironmentInformationWindow.cs.meta
  17. 83 0
      Unity/Assets/Debugger/Component/DebuggerComponent.FpsCounter.cs
  18. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.FpsCounter.cs.meta
  19. 180 0
      Unity/Assets/Debugger/Component/DebuggerComponent.GeneralSettingsWindow.cs
  20. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.GeneralSettingsWindow.cs.meta
  21. 79 0
      Unity/Assets/Debugger/Component/DebuggerComponent.GraphicsInformationWindow.cs
  22. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.GraphicsInformationWindow.cs.meta
  23. 45 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputAccelerationInformationWindow.cs
  24. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputAccelerationInformationWindow.cs.meta
  25. 45 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputCompassInformationWindow.cs
  26. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputCompassInformationWindow.cs.meta
  27. 46 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputGyroscopeInformationWindow.cs
  28. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputGyroscopeInformationWindow.cs.meta
  29. 47 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputLocationInformationWindow.cs
  30. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputLocationInformationWindow.cs.meta
  31. 39 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputSummaryInformationWindow.cs
  32. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputSummaryInformationWindow.cs.meta
  33. 49 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputTouchInformationWindow.cs
  34. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.InputTouchInformationWindow.cs.meta
  35. 30 0
      Unity/Assets/Debugger/Component/DebuggerComponent.PathInformationWindow.cs
  36. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.PathInformationWindow.cs.meta
  37. 56 0
      Unity/Assets/Debugger/Component/DebuggerComponent.ProfilerInformationWindow.cs
  38. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.ProfilerInformationWindow.cs.meta
  39. 70 0
      Unity/Assets/Debugger/Component/DebuggerComponent.QualityInformationWindow.cs
  40. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.QualityInformationWindow.cs.meta
  41. 40 0
      Unity/Assets/Debugger/Component/DebuggerComponent.QualitySettingsWindow.cs
  42. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.QualitySettingsWindow.cs.meta
  43. 67 0
      Unity/Assets/Debugger/Component/DebuggerComponent.RuntimeMemoryInformationWindow.Sample.cs
  44. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.RuntimeMemoryInformationWindow.Sample.cs.meta
  45. 166 0
      Unity/Assets/Debugger/Component/DebuggerComponent.RuntimeMemoryInformationWindow.cs
  46. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.RuntimeMemoryInformationWindow.cs.meta
  47. 37 0
      Unity/Assets/Debugger/Component/DebuggerComponent.SceneInformationWindow.cs
  48. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.SceneInformationWindow.cs.meta
  49. 71 0
      Unity/Assets/Debugger/Component/DebuggerComponent.ScreenInformationWindow.cs
  50. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.ScreenInformationWindow.cs.meta
  51. 61 0
      Unity/Assets/Debugger/Component/DebuggerComponent.SystemInformationWindow.cs
  52. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.SystemInformationWindow.cs.meta
  53. 72 0
      Unity/Assets/Debugger/Component/DebuggerComponent.TimeInformationWindow.cs
  54. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.TimeInformationWindow.cs.meta
  55. 34 0
      Unity/Assets/Debugger/Component/DebuggerComponent.WebPlayerInformationWindow.cs
  56. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.WebPlayerInformationWindow.cs.meta
  57. 364 0
      Unity/Assets/Debugger/Component/DebuggerComponent.cs
  58. 12 0
      Unity/Assets/Debugger/Component/DebuggerComponent.cs.meta
  59. 65 0
      Unity/Assets/Debugger/Component/ScrollableDebuggerWindowBase.cs
  60. 12 0
      Unity/Assets/Debugger/Component/ScrollableDebuggerWindowBase.cs.meta
  61. 9 0
      Unity/Assets/Debugger/Core.meta
  62. 236 0
      Unity/Assets/Debugger/Core/DebuggerManager.DebuggerWindowGroup.cs
  63. 12 0
      Unity/Assets/Debugger/Core/DebuggerManager.DebuggerWindowGroup.cs.meta
  64. 111 0
      Unity/Assets/Debugger/Core/DebuggerManager.cs
  65. 12 0
      Unity/Assets/Debugger/Core/DebuggerManager.cs.meta
  66. 47 0
      Unity/Assets/Debugger/Core/IDebuggerManager.cs
  67. 12 0
      Unity/Assets/Debugger/Core/IDebuggerManager.cs.meta
  68. 48 0
      Unity/Assets/Debugger/Core/IDebuggerWindow.cs
  69. 12 0
      Unity/Assets/Debugger/Core/IDebuggerWindow.cs.meta
  70. 59 0
      Unity/Assets/Debugger/Core/IDebuggerWindowGroup.cs
  71. 12 0
      Unity/Assets/Debugger/Core/IDebuggerWindowGroup.cs.meta
  72. 76 0
      Unity/Assets/Debugger/Debugger.prefab
  73. 9 0
      Unity/Assets/Debugger/Debugger.prefab.meta
  74. 9 0
      Unity/Assets/Debugger/Editor.meta
  75. 56 0
      Unity/Assets/Debugger/Editor/DebuggerComponentInspector.cs
  76. 12 0
      Unity/Assets/Debugger/Editor/DebuggerComponentInspector.cs.meta
  77. 9 0
      Unity/Assets/Debugger/Extension.meta
  78. 321 0
      Unity/Assets/Debugger/Extension/ExampleScene.unity
  79. 8 0
      Unity/Assets/Debugger/Extension/ExampleScene.unity.meta
  80. 21 0
      Unity/Assets/Debugger/Extension/ExampleWindow.cs
  81. 12 0
      Unity/Assets/Debugger/Extension/ExampleWindow.cs.meta
  82. 10 0
      Unity/Assets/Debugger/Extension/ExtensionWindow.cs
  83. 12 0
      Unity/Assets/Debugger/Extension/ExtensionWindow.cs.meta
  84. 1 1
      Unity/Assets/Res/Fonts.meta
  85. 8 0
      Unity/Assets/Res/Fonts/addscore.meta
  86. 22 0
      Unity/Assets/Res/Fonts/addscore/atlas_qinghaidig_common_addscore.tpsheet
  87. 7 0
      Unity/Assets/Res/Fonts/addscore/atlas_qinghaidig_common_addscore.tpsheet.meta
  88. 221 0
      Unity/Assets/Res/Fonts/addscore/mjaddscore.fontsettings
  89. 8 0
      Unity/Assets/Res/Fonts/addscore/mjaddscore.fontsettings.meta
  90. 27 0
      Unity/Assets/Res/Fonts/addscore/mjaddscore.mat
  91. 8 0
      Unity/Assets/Res/Fonts/addscore/mjaddscore.mat.meta
  92. BIN
      Unity/Assets/Res/Fonts/addscore/mjaddscore.png
  93. 459 0
      Unity/Assets/Res/Fonts/addscore/mjaddscore.png.meta
  94. 8 0
      Unity/Assets/Res/Fonts/subscore.meta
  95. 22 0
      Unity/Assets/Res/Fonts/subscore/atlas_qinghaidig_common_subscore.tpsheet
  96. 7 0
      Unity/Assets/Res/Fonts/subscore/atlas_qinghaidig_common_subscore.tpsheet.meta
  97. 221 0
      Unity/Assets/Res/Fonts/subscore/mjsubscore.fontsettings
  98. 8 0
      Unity/Assets/Res/Fonts/subscore/mjsubscore.fontsettings.meta
  99. 27 0
      Unity/Assets/Res/Fonts/subscore/mjsubscore.mat
  100. 8 0
      Unity/Assets/Res/Fonts/subscore/mjsubscore.mat.meta

+ 1 - 1
Unity/Assets/Bundles/Config/AIConfigCategory.bytes.meta

@@ -3,5 +3,5 @@ guid: 277d58db3067742a7b32f9994984b3bc
 TextScriptImporter:
   externalObjects: {}
   userData: 
-  assetBundleName: 
+  assetBundleName: config.unity3d
   assetBundleVariant: 

+ 49 - 0
Unity/Assets/Bundles/Config/FightChatConfigCategory.bytes

@@ -0,0 +1,49 @@
+
+k?不要吵了,不要吵了,吵啥嘛,专心玩游戏嘛。"common_chat_boy_buyaochao*
+fightsound
+L!不要走,决战到天亮啦。"common_chat_boy_buyaozou*
+fightsound
+Q$大家好,很高兴见到各位。"common_chat_boy_hengaoxing*
+fightsound
+U'和你合作真是太愉快了,呵。"common_chat_boy_hezuoyukuai*
+fightsound
+R'快点啊,都等的我花都谢了。"common_chat_boy_huaxiele*
+fightsound
+_6咱交个朋友吧,能告诉我你咋联系的嘛。"common_chat_boy_lianxi*
+fightsound
+i<哎,各位,真是不好意思啊,我得离开一会。"common_chat_boy_likaiyihui*
+fightsound
+C你是mm还是gg啊。"common_chat_boy_meimeigege*
+fightsound
+M你的牌打的特好了。"common_chat_boy_paidadetaihaole*
+fightsound
+`0怎么又断线了,网络怎么这么差啊。"common_chat_boy_wangluoduanle*
+fightsound
+U'下次我们再玩吧,我要走了。"common_chat_boy_xiacizaiwan*
+fightsound
+U$再见拉,俺会想念大家的。"common_chat_boy_xiangniandajia*
+fightsound
+h9不要吵了,有什么好吵的,专心玩游戏吧。"common_chat_gril_buyaochao*
+fightsound
+L不要走,决战到天亮。"common_chat_gril_buyaozou*
+fightsound
+T$大家好,很高兴见到各位。"common_chat_gril_hengaoxing*
+fightsound
+R!和你合作真是太愉快了。"common_chat_gril_hezuoyukuai*
+fightsound
+R$快点吧,我等的花都谢了。"common_chat_gril_huaxiele*
+fightsound
+nB我们交个朋友吧,能不能告诉我你的联系方法啊。"common_chat_gril_lianxi*
+fightsound
+`0各位,真不好意思,我要离开一会。"common_chat_gril_likaiyihui*
+fightsound
+F你是mm还是gg啊。"common_chat_gril_meimeigege*
+fightsound
+P你的牌打的太好了。" common_chat_gril_paidadetaihaole*
+fightsound
+W$又断线了,网络怎么这么差"common_chat_gril_wangluoduanle*
+fightsound
+R!下次再玩吧,我要走啦。"common_chat_gril_xiacizaiwan*
+fightsound
+X$再见咯,我会想念大家的。"common_chat_gril_xiangniandajia*
+fightsound

+ 7 - 0
Unity/Assets/Bundles/Config/FightChatConfigCategory.bytes.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c0a220032f716934186caf5376ce0036
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: config.unity3d
+  assetBundleVariant: 

+ 1 - 1
Unity/Assets/Bundles/Config/UnitConfigCategory.bytes.meta

@@ -3,5 +3,5 @@ guid: 3f452063ceb5f4150bbbfe795c0aca90
 TextScriptImporter:
   externalObjects: {}
   userData: 
-  assetBundleName: 
+  assetBundleName: config.unity3d
   assetBundleVariant: 

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 239 - 396
Unity/Assets/Bundles/UI/UIStartFightRoom.prefab


+ 91 - 1
Unity/Assets/Bundles/UI/UIStats.prefab

@@ -290,6 +290,7 @@ GameObject:
   - component: {fileID: 3273252037520827129}
   - component: {fileID: 3214966906096673232}
   - component: {fileID: 6362065783667048325}
+  - component: {fileID: 8333636567873796339}
   m_Layer: 5
   m_Name: preTimeBtn
   m_TagString: Untagged
@@ -359,6 +360,50 @@ MonoBehaviour:
     m_VerticalOverflow: 0
     m_LineSpacing: 1
   m_Text: "\u524D"
+--- !u!114 &8333636567873796339
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1932400056631602054}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 6362065783667048325}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
 --- !u!1 &2589791942191417451
 GameObject:
   m_ObjectHideFlags: 0
@@ -375,7 +420,7 @@ GameObject:
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
-  m_IsActive: 1
+  m_IsActive: 0
 --- !u!224 &6964859548997344266
 RectTransform:
   m_ObjectHideFlags: 0
@@ -535,6 +580,7 @@ GameObject:
   - component: {fileID: 46664081885167115}
   - component: {fileID: 2471010180489747531}
   - component: {fileID: 7113942836830932907}
+  - component: {fileID: 6365271339289968604}
   m_Layer: 5
   m_Name: nextTimeBtn
   m_TagString: Untagged
@@ -604,6 +650,50 @@ MonoBehaviour:
     m_VerticalOverflow: 0
     m_LineSpacing: 1
   m_Text: "\u540E"
+--- !u!114 &6365271339289968604
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3442636721514764601}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 7113942836830932907}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
 --- !u!1 &3492449426939576537
 GameObject:
   m_ObjectHideFlags: 0

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Client/Module/MusicSound.meta → Unity/Assets/Debugger.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: a8b5a5fa5fe6d6442abb0a5f785e2703
+guid: eed80e9b1a2b37c488708555f542ad13
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 9 - 0
Unity/Assets/Debugger/Component.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 3f5b4efb0ea7c1c41947cd02c943d9fe
+folderAsset: yes
+timeCreated: 1502077067
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 30 - 0
Unity/Assets/Debugger/Component/DebuggerActiveWindowType.cs

@@ -0,0 +1,30 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+namespace UnityGameFramework.Runtime
+{
+    /// <summary>
+    /// 调试器激活窗口类型。
+    /// </summary>
+    public enum DebuggerActiveWindowType
+    {
+        /// <summary>
+        /// 自动(发布版本状态关闭,开发版本状态打开)。
+        /// </summary>
+        Auto = 0,
+
+        /// <summary>
+        /// 关闭。
+        /// </summary>
+        Close,
+
+        /// <summary>
+        /// 打开。
+        /// </summary>
+        Open,
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerActiveWindowType.cs.meta

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

+ 66 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.ConsoleWindow.LogNode.cs

@@ -0,0 +1,66 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using System;
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private partial class ConsoleWindow
+        {
+            private sealed class LogNode
+            {
+                private readonly DateTime m_LogTime;
+                private readonly LogType m_LogType;
+                private readonly string m_LogMessage;
+                private readonly string m_StackTrack;
+
+                public LogNode(LogType logType, string logMessage, string stackTrack)
+                {
+                    m_LogTime = DateTime.Now;
+                    m_LogType = logType;
+                    m_LogMessage = logMessage;
+                    m_StackTrack = stackTrack;
+                }
+
+                public DateTime LogTime
+                {
+                    get
+                    {
+                        return m_LogTime;
+                    }
+                }
+
+                public LogType LogType
+                {
+                    get
+                    {
+                        return m_LogType;
+                    }
+                }
+
+                public string LogMessage
+                {
+                    get
+                    {
+                        return m_LogMessage;
+                    }
+                }
+
+                public string StackTrack
+                {
+                    get
+                    {
+                        return m_StackTrack;
+                    }
+                }
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.ConsoleWindow.LogNode.cs.meta

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

+ 459 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.ConsoleWindow.cs

@@ -0,0 +1,459 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using GameFramework.Debugger;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        [Serializable]
+        private sealed partial class ConsoleWindow : IDebuggerWindow
+        {
+            private LinkedList<LogNode> m_Logs = new LinkedList<LogNode>();
+            private Vector2 m_LogScrollPosition = Vector2.zero;
+            private Vector2 m_StackScrollPosition = Vector2.zero;
+            private int m_InfoCount = 0;
+            private int m_WarningCount = 0;
+            private int m_ErrorCount = 0;
+            private int m_FatalCount = 0;
+            private LinkedListNode<LogNode> m_SelectedNode = null;
+            private bool m_LastLockScroll = true;
+            private bool m_LastInfoFilter = true;
+            private bool m_LastWarningFilter = true;
+            private bool m_LastErrorFilter = true;
+            private bool m_LastFatalFilter = true;
+
+            [SerializeField]
+            private bool m_LockScroll = true;
+
+            [SerializeField]
+            private int m_MaxLine = 300;
+
+            [SerializeField]
+            private string m_DateTimeFormat = "[HH:mm:ss.fff] ";
+
+            [SerializeField]
+            private bool m_InfoFilter = true;
+
+            [SerializeField]
+            private bool m_WarningFilter = true;
+
+            [SerializeField]
+            private bool m_ErrorFilter = true;
+
+            [SerializeField]
+            private bool m_FatalFilter = true;
+
+            [SerializeField]
+            private Color32 m_InfoColor = Color.white;
+
+            [SerializeField]
+            private Color32 m_WarningColor = Color.yellow;
+
+            [SerializeField]
+            private Color32 m_ErrorColor = Color.red;
+
+            [SerializeField]
+            private Color32 m_FatalColor = new Color(0.7f, 0.2f, 0.2f);
+
+            public bool LockScroll
+            {
+                get
+                {
+                    return m_LockScroll;
+                }
+                set
+                {
+                    m_LockScroll = value;
+                }
+            }
+
+            public int MaxLine
+            {
+                get
+                {
+                    return m_MaxLine;
+                }
+                set
+                {
+                    m_MaxLine = value;
+                }
+            }
+
+            public string DateTimeFormat
+            {
+                get
+                {
+                    return m_DateTimeFormat;
+                }
+                set
+                {
+                    m_DateTimeFormat = value ?? string.Empty;
+                }
+            }
+
+            public bool InfoFilter
+            {
+                get
+                {
+                    return m_InfoFilter;
+                }
+                set
+                {
+                    m_InfoFilter = value;
+                }
+            }
+
+            public bool WarningFilter
+            {
+                get
+                {
+                    return m_WarningFilter;
+                }
+                set
+                {
+                    m_WarningFilter = value;
+                }
+            }
+
+            public bool ErrorFilter
+            {
+                get
+                {
+                    return m_ErrorFilter;
+                }
+                set
+                {
+                    m_ErrorFilter = value;
+                }
+            }
+
+            public bool FatalFilter
+            {
+                get
+                {
+                    return m_FatalFilter;
+                }
+                set
+                {
+                    m_FatalFilter = value;
+                }
+            }
+
+            public int InfoCount
+            {
+                get
+                {
+                    return m_InfoCount;
+                }
+            }
+
+            public int WarningCount
+            {
+                get
+                {
+                    return m_WarningCount;
+                }
+            }
+
+            public int ErrorCount
+            {
+                get
+                {
+                    return m_ErrorCount;
+                }
+            }
+
+            public int FatalCount
+            {
+                get
+                {
+                    return m_FatalCount;
+                }
+            }
+
+            public Color32 InfoColor
+            {
+                get
+                {
+                    return m_InfoColor;
+                }
+                set
+                {
+                    m_InfoColor = value;
+                }
+            }
+
+            public Color32 WarningColor
+            {
+                get
+                {
+                    return m_WarningColor;
+                }
+                set
+                {
+                    m_WarningColor = value;
+                }
+            }
+
+            public Color32 ErrorColor
+            {
+                get
+                {
+                    return m_ErrorColor;
+                }
+                set
+                {
+                    m_ErrorColor = value;
+                }
+            }
+
+            public Color32 FatalColor
+            {
+                get
+                {
+                    return m_FatalColor;
+                }
+                set
+                {
+                    m_FatalColor = value;
+                }
+            }
+
+            public void Initialize(params object[] args)
+            {
+                Application.logMessageReceived += OnLogMessageReceived;
+                m_LockScroll = m_LastLockScroll = PlayerPrefs.GetInt("Debugger.Console.LockScroll", 1) > 0;
+                m_InfoFilter = m_LastInfoFilter = PlayerPrefs.GetInt("Debugger.Console.InfoFilter", 1) > 0;
+                m_WarningFilter = m_LastWarningFilter = PlayerPrefs.GetInt("Debugger.Console.WarningFilter", 1) > 0;
+                m_ErrorFilter = m_LastErrorFilter = PlayerPrefs.GetInt("Debugger.Console.ErrorFilter", 1) > 0;
+                m_FatalFilter = m_LastFatalFilter = PlayerPrefs.GetInt("Debugger.Console.FatalFilter", 1) > 0;
+            }
+
+            public void Shutdown()
+            {
+                Application.logMessageReceived -= OnLogMessageReceived;
+                Clear();
+            }
+
+            public void OnEnter()
+            {
+
+            }
+
+            public void OnLeave()
+            {
+
+            }
+
+            public void OnUpdate(float elapseSeconds, float realElapseSeconds)
+            {
+                if (m_LastLockScroll != m_LockScroll)
+                {
+                    m_LastLockScroll = m_LockScroll;
+                    PlayerPrefs.SetInt("Debugger.Console.LockScroll", m_LockScroll ? 1 : 0);
+                }
+
+                if (m_LastInfoFilter != m_InfoFilter)
+                {
+                    m_LastInfoFilter = m_InfoFilter;
+                    PlayerPrefs.SetInt("Debugger.Console.InfoFilter", m_InfoFilter ? 1 : 0);
+                }
+
+                if (m_LastWarningFilter != m_WarningFilter)
+                {
+                    m_LastWarningFilter = m_WarningFilter;
+                    PlayerPrefs.SetInt("Debugger.Console.WarningFilter", m_WarningFilter ? 1 : 0);
+                }
+
+                if (m_LastErrorFilter != m_ErrorFilter)
+                {
+                    m_LastErrorFilter = m_ErrorFilter;
+                    PlayerPrefs.SetInt("Debugger.Console.ErrorFilter", m_ErrorFilter ? 1 : 0);
+                }
+
+                if (m_LastFatalFilter != m_FatalFilter)
+                {
+                    m_LastFatalFilter = m_FatalFilter;
+                    PlayerPrefs.SetInt("Debugger.Console.FatalFilter", m_FatalFilter ? 1 : 0);
+                }
+            }
+
+            public void OnDraw()
+            {
+                RefreshCount();
+
+                GUILayout.BeginHorizontal();
+                {
+                    if (GUILayout.Button("Clear All", GUILayout.Width(100f)))
+                    {
+                        Clear();
+                    }
+                    m_LockScroll = GUILayout.Toggle(m_LockScroll, "Lock Scroll", GUILayout.Width(90f));
+                    GUILayout.FlexibleSpace();
+                    m_InfoFilter = GUILayout.Toggle(m_InfoFilter, string.Format("Info ({0})", m_InfoCount.ToString()), GUILayout.Width(90f));
+                    m_WarningFilter = GUILayout.Toggle(m_WarningFilter, string.Format("Warning ({0})", m_WarningCount.ToString()), GUILayout.Width(90f));
+                    m_ErrorFilter = GUILayout.Toggle(m_ErrorFilter, string.Format("Error ({0})", m_ErrorCount.ToString()), GUILayout.Width(90f));
+                    m_FatalFilter = GUILayout.Toggle(m_FatalFilter, string.Format("Fatal ({0})", m_FatalCount.ToString()), GUILayout.Width(90f));
+                }
+                GUILayout.EndHorizontal();
+
+                GUILayout.BeginVertical("box");
+                {
+                    if (m_LockScroll)
+                    {
+                        m_LogScrollPosition.y = float.MaxValue;
+                    }
+
+                    m_LogScrollPosition = GUILayout.BeginScrollView(m_LogScrollPosition);
+                    {
+                        bool selected = false;
+                        for (LinkedListNode<LogNode> i = m_Logs.First; i != null; i = i.Next)
+                        {
+                            switch (i.Value.LogType)
+                            {
+                                case LogType.Log:
+                                    if (!m_InfoFilter)
+                                    {
+                                        continue;
+                                    }
+                                    break;
+                                case LogType.Warning:
+                                    if (!m_WarningFilter)
+                                    {
+                                        continue;
+                                    }
+                                    break;
+                                case LogType.Error:
+                                    if (!m_ErrorFilter)
+                                    {
+                                        continue;
+                                    }
+                                    break;
+                                case LogType.Exception:
+                                    if (!m_FatalFilter)
+                                    {
+                                        continue;
+                                    }
+                                    break;
+                            }
+                            if (GUILayout.Toggle(m_SelectedNode == i, GetLogString(i.Value)))
+                            {
+                                selected = true;
+                                if (m_SelectedNode != i)
+                                {
+                                    m_SelectedNode = i;
+                                    m_StackScrollPosition = Vector2.zero;
+                                }
+                            }
+                        }
+                        if (!selected)
+                        {
+                            m_SelectedNode = null;
+                        }
+                    }
+                    GUILayout.EndScrollView();
+                }
+                GUILayout.EndVertical();
+
+                GUILayout.BeginVertical("box");
+                {
+                    m_StackScrollPosition = GUILayout.BeginScrollView(m_StackScrollPosition, GUILayout.Height(100f));
+                    {
+                        if (m_SelectedNode != null)
+                        {
+                            Color32 color = GetLogStringColor(m_SelectedNode.Value.LogType);
+                            GUILayout.Label(string.Format("<color=#{0}{1}{2}{3}><b>{4}</b></color>", color.r.ToString("x2"), color.g.ToString("x2"), color.b.ToString("x2"), color.a.ToString("x2"), m_SelectedNode.Value.LogMessage));
+                            GUILayout.Label(m_SelectedNode.Value.StackTrack);
+                        }
+                        GUILayout.EndScrollView();
+                    }
+                }
+                GUILayout.EndVertical();
+            }
+
+            private void Clear()
+            {
+                m_Logs.Clear();
+            }
+
+            public void RefreshCount()
+            {
+                m_InfoCount = 0;
+                m_WarningCount = 0;
+                m_ErrorCount = 0;
+                m_FatalCount = 0;
+                for (LinkedListNode<LogNode> i = m_Logs.First; i != null; i = i.Next)
+                {
+                    switch (i.Value.LogType)
+                    {
+                        case LogType.Log:
+                            m_InfoCount++;
+                            break;
+                        case LogType.Warning:
+                            m_WarningCount++;
+                            break;
+                        case LogType.Error:
+                            m_ErrorCount++;
+                            break;
+                        case LogType.Exception:
+                            m_FatalCount++;
+                            break;
+                    }
+                }
+            }
+
+            private void OnLogMessageReceived(string logMessage, string stackTrace, LogType logType)
+            {
+                if (logType == LogType.Assert)
+                {
+                    logType = LogType.Error;
+                }
+
+                m_Logs.AddLast(new LogNode(logType, logMessage, stackTrace));
+                while (m_Logs.Count > m_MaxLine)
+                {
+                    m_Logs.RemoveFirst();
+                }
+            }
+
+            private string GetLogString(LogNode logNode)
+            {
+                Color32 color = GetLogStringColor(logNode.LogType);
+                return string.Format("<color=#{0}{1}{2}{3}>{4}{5}</color>",
+                    color.r.ToString("x2"), color.g.ToString("x2"), color.b.ToString("x2"), color.a.ToString("x2"),
+                    logNode.LogTime.ToString(m_DateTimeFormat), logNode.LogMessage);
+            }
+
+            internal Color32 GetLogStringColor(LogType logType)
+            {
+                Color32 color = Color.white;
+                switch (logType)
+                {
+                    case LogType.Log:
+                        color = m_InfoColor;
+                        break;
+                    case LogType.Warning:
+                        color = m_WarningColor;
+                        break;
+                    case LogType.Error:
+                        color = m_ErrorColor;
+                        break;
+                    case LogType.Exception:
+                        color = m_FatalColor;
+                        break;
+                }
+
+                return color;
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.ConsoleWindow.cs.meta

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

+ 63 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.EnvironmentInformationWindow.cs

@@ -0,0 +1,63 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class EnvironmentInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Environment Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Product Name:", Application.productName);
+                    DrawItem("Company Name:", Application.companyName);
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("Game Identifier:", Application.identifier);
+#else
+                    DrawItem("Game Identifier:", Application.bundleIdentifier);
+#endif
+                    DrawItem("Application Version:", Application.version);
+                    DrawItem("Unity Version:", Application.unityVersion);
+                    DrawItem("Platform:", Application.platform.ToString());
+                    DrawItem("System Language:", Application.systemLanguage.ToString());
+                    DrawItem("Cloud Project Id:", Application.cloudProjectId);
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("Build Guid:", Application.buildGUID);
+#endif
+                    DrawItem("Target Frame Rate:", Application.targetFrameRate.ToString());
+                    DrawItem("Internet Reachability:", Application.internetReachability.ToString());
+                    DrawItem("Background Loading Priority:", Application.backgroundLoadingPriority.ToString());
+                    DrawItem("Is Playing:", Application.isPlaying.ToString());
+#if UNITY_5_3 || UNITY_5_4
+                    DrawItem("Is Showing Splash Screen:", Application.isShowingSplashScreen.ToString());
+#endif
+                    DrawItem("Run In Background:", Application.runInBackground.ToString());
+#if UNITY_5_5_OR_NEWER
+                    DrawItem("Install Name:", Application.installerName);
+#endif
+                    DrawItem("Install Mode:", Application.installMode.ToString());
+                    DrawItem("Sandbox Type:", Application.sandboxType.ToString());
+                    DrawItem("Is Mobile Platform:", Application.isMobilePlatform.ToString());
+                    DrawItem("Is Console Platform:", Application.isConsolePlatform.ToString());
+                    DrawItem("Is Editor:", Application.isEditor.ToString());
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("Is Focused:", Application.isFocused.ToString());
+#endif
+#if UNITY_5_3
+                    DrawItem("Stack Trace Log Type:", Application.stackTraceLogType.ToString());
+#endif
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.EnvironmentInformationWindow.cs.meta

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

+ 83 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.FpsCounter.cs

@@ -0,0 +1,83 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using System;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class FpsCounter
+        {
+            private float m_UpdateInterval;
+            private float m_CurrentFps;
+            private int m_Frames;
+            private float m_Accumulator;
+            private float m_TimeLeft;
+
+            public FpsCounter(float updateInterval)
+            {
+                if (updateInterval <= 0f)
+                {
+                    throw new ArgumentOutOfRangeException("Update interval is invalid.");
+                }
+
+                m_UpdateInterval = updateInterval;
+                Reset();
+            }
+
+            public float UpdateInterval
+            {
+                get
+                {
+                    return m_UpdateInterval;
+                }
+                set
+                {
+                    if (value <= 0f)
+                    {
+                        throw new ArgumentOutOfRangeException("Update interval is invalid.");
+                    }
+
+                    m_UpdateInterval = value;
+                    Reset();
+                }
+            }
+
+            public float CurrentFps
+            {
+                get
+                {
+                    return m_CurrentFps;
+                }
+            }
+
+            public void Update(float elapseSeconds, float realElapseSeconds)
+            {
+                m_Frames++;
+                m_Accumulator += realElapseSeconds;
+                m_TimeLeft -= realElapseSeconds;
+
+                if (m_TimeLeft <= 0f)
+                {
+                    m_CurrentFps = m_Accumulator > 0f ? m_Frames / m_Accumulator : 0f;
+                    m_Frames = 0;
+                    m_Accumulator = 0f;
+                    m_TimeLeft += m_UpdateInterval;
+                }
+            }
+
+            private void Reset()
+            {
+                m_CurrentFps = 0f;
+                m_Frames = 0;
+                m_Accumulator = 0f;
+                m_TimeLeft = 0f;
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.FpsCounter.cs.meta

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

+ 180 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.GeneralSettingsWindow.cs

@@ -0,0 +1,180 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class GeneralSettingsWindow : ScrollableDebuggerWindowBase
+        {
+            private DebuggerComponent m_DebuggerComponent = null;
+            private float m_LastIconX = 0f;
+            private float m_LastIconY = 0f;
+            private float m_LastWindowX = 0f;
+            private float m_LastWindowY = 0f;
+            private float m_LastWindowWidth = 0f;
+            private float m_LastWindowHeight = 0f;
+            private float m_LastWindowScale = 0f;
+
+            public override void Initialize(params object[] args)
+            {
+                if (args.Length < 1)
+                {
+                    throw new System.ArgumentException("Debugger component is invalid.");
+                }
+
+                m_DebuggerComponent = args[0] as DebuggerComponent;
+                if (m_DebuggerComponent == null)
+                {
+                    throw new System.ArgumentException("Debugger component is invalid.");
+                }
+
+                m_LastIconX = PlayerPrefs.GetFloat("Debugger.Icon.X", DefaultIconRect.x);
+                m_LastIconY = PlayerPrefs.GetFloat("Debugger.Icon.Y", DefaultIconRect.y);
+                m_LastWindowX = PlayerPrefs.GetFloat("Debugger.Window.X", DefaultWindowRect.x);
+                m_LastWindowY = PlayerPrefs.GetFloat("Debugger.Window.Y", DefaultWindowRect.y);
+                m_LastWindowWidth = PlayerPrefs.GetFloat("Debugger.Window.Width", DefaultWindowRect.width);
+                m_LastWindowHeight = PlayerPrefs.GetFloat("Debugger.Window.Height", DefaultWindowRect.height);
+                m_DebuggerComponent.WindowScale = m_LastWindowScale = PlayerPrefs.GetFloat("Debugger.Window.Scale", DefaultWindowScale);
+                m_DebuggerComponent.IconRect = new Rect(m_LastIconX, m_LastIconY, DefaultIconRect.width, DefaultIconRect.height);
+                m_DebuggerComponent.WindowRect = new Rect(m_LastWindowX, m_LastWindowY, m_LastWindowWidth, m_LastWindowHeight);
+            }
+
+            public override void OnUpdate(float elapseSeconds, float realElapseSeconds)
+            {
+                if (m_LastIconX != m_DebuggerComponent.IconRect.x)
+                {
+                    m_LastIconX = m_DebuggerComponent.IconRect.x;
+                    PlayerPrefs.SetFloat("Debugger.Icon.X", m_DebuggerComponent.IconRect.x);
+                }
+
+                if (m_LastIconY != m_DebuggerComponent.IconRect.y)
+                {
+                    m_LastIconY = m_DebuggerComponent.IconRect.y;
+                    PlayerPrefs.SetFloat("Debugger.Icon.Y", m_DebuggerComponent.IconRect.y);
+                }
+
+                if (m_LastWindowX != m_DebuggerComponent.WindowRect.x)
+                {
+                    m_LastWindowX = m_DebuggerComponent.WindowRect.x;
+                    PlayerPrefs.SetFloat("Debugger.Window.X", m_DebuggerComponent.WindowRect.x);
+                }
+
+                if (m_LastWindowY != m_DebuggerComponent.WindowRect.y)
+                {
+                    m_LastWindowY = m_DebuggerComponent.WindowRect.y;
+                    PlayerPrefs.SetFloat("Debugger.Window.Y", m_DebuggerComponent.WindowRect.y);
+                }
+
+                if (m_LastWindowWidth != m_DebuggerComponent.WindowRect.width)
+                {
+                    m_LastWindowWidth = m_DebuggerComponent.WindowRect.width;
+                    PlayerPrefs.SetFloat("Debugger.Window.Width", m_DebuggerComponent.WindowRect.width);
+                }
+
+                if (m_LastWindowHeight != m_DebuggerComponent.WindowRect.height)
+                {
+                    m_LastWindowHeight = m_DebuggerComponent.WindowRect.height;
+                    PlayerPrefs.SetFloat("Debugger.Window.Height", m_DebuggerComponent.WindowRect.height);
+                }
+
+                if (m_LastWindowScale != m_DebuggerComponent.WindowScale)
+                {
+                    m_LastWindowScale = m_DebuggerComponent.WindowScale;
+                    PlayerPrefs.SetFloat("Debugger.Window.Scale", m_DebuggerComponent.WindowScale);
+                }
+            }
+
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Window Settings</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    GUILayout.BeginHorizontal();
+                    {
+                        GUILayout.Label("Position:", GUILayout.Width(60f));
+                        GUILayout.Label("Drag window caption to move position.");
+                    }
+                    GUILayout.EndHorizontal();
+
+                    GUILayout.BeginHorizontal();
+                    {
+                        float width = m_DebuggerComponent.WindowRect.width;
+                        GUILayout.Label("Width:", GUILayout.Width(60f));
+                        if (GUILayout.RepeatButton("-", GUILayout.Width(30f)))
+                        {
+                            width--;
+                        }
+                        width = GUILayout.HorizontalSlider(width, 100f, Screen.width - 20f);
+                        if (GUILayout.RepeatButton("+", GUILayout.Width(30f)))
+                        {
+                            width++;
+                        }
+                        width = Mathf.Clamp(width, 100f, Screen.width - 20f);
+                        if (width != m_DebuggerComponent.WindowRect.width)
+                        {
+                            m_DebuggerComponent.WindowRect = new Rect(m_DebuggerComponent.WindowRect.x, m_DebuggerComponent.WindowRect.y, width, m_DebuggerComponent.WindowRect.height);
+                        }
+                    }
+                    GUILayout.EndHorizontal();
+
+                    GUILayout.BeginHorizontal();
+                    {
+                        float height = m_DebuggerComponent.WindowRect.height;
+                        GUILayout.Label("Height:", GUILayout.Width(60f));
+                        if (GUILayout.RepeatButton("-", GUILayout.Width(30f)))
+                        {
+                            height--;
+                        }
+                        height = GUILayout.HorizontalSlider(height, 100f, Screen.height - 20f);
+                        if (GUILayout.RepeatButton("+", GUILayout.Width(30f)))
+                        {
+                            height++;
+                        }
+                        height = Mathf.Clamp(height, 100f, Screen.height - 20f);
+                        if (height != m_DebuggerComponent.WindowRect.height)
+                        {
+                            m_DebuggerComponent.WindowRect = new Rect(m_DebuggerComponent.WindowRect.x, m_DebuggerComponent.WindowRect.y, m_DebuggerComponent.WindowRect.width, height);
+                        }
+                    }
+                    GUILayout.EndHorizontal();
+
+                    GUILayout.BeginHorizontal();
+                    {
+                        float scale = m_DebuggerComponent.WindowScale;
+                        GUILayout.Label("Scale:", GUILayout.Width(60f));
+                        if (GUILayout.RepeatButton("-", GUILayout.Width(30f)))
+                        {
+                            scale -= 0.01f;
+                        }
+                        scale = GUILayout.HorizontalSlider(scale, 0.5f, 4f);
+                        if (GUILayout.RepeatButton("+", GUILayout.Width(30f)))
+                        {
+                            scale += 0.01f;
+                        }
+                        scale = Mathf.Clamp(scale, 0.5f, 4f);
+                        if (scale != m_DebuggerComponent.WindowScale)
+                        {
+                            m_DebuggerComponent.WindowScale = scale;
+                        }
+                    }
+                    GUILayout.EndHorizontal();
+
+                    if (GUILayout.Button("Reset Window Settings", GUILayout.Height(30f)))
+                    {
+                        m_DebuggerComponent.IconRect = DefaultIconRect;
+                        m_DebuggerComponent.WindowRect = DefaultWindowRect;
+                        m_DebuggerComponent.WindowScale = DefaultWindowScale;
+                    }
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.GeneralSettingsWindow.cs.meta

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

+ 79 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.GraphicsInformationWindow.cs

@@ -0,0 +1,79 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class GraphicsInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Graphics Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Device ID:", SystemInfo.graphicsDeviceID.ToString());
+                    DrawItem("Device Name:", SystemInfo.graphicsDeviceName);
+                    DrawItem("Device Vendor ID:", SystemInfo.graphicsDeviceVendorID.ToString());
+                    DrawItem("Device Vendor:", SystemInfo.graphicsDeviceVendor);
+                    DrawItem("Device Type:", SystemInfo.graphicsDeviceType.ToString());
+                    DrawItem("Device Version:", SystemInfo.graphicsDeviceVersion);
+                    DrawItem("Memory Size:", string.Format("{0} MB", SystemInfo.graphicsMemorySize.ToString()));
+                    DrawItem("Multi Threaded:", SystemInfo.graphicsMultiThreaded.ToString());
+                    DrawItem("Shader Level:", GetShaderLevelString(SystemInfo.graphicsShaderLevel));
+                    DrawItem("NPOT Support:", SystemInfo.npotSupport.ToString());
+                    DrawItem("Max Texture Size:", SystemInfo.maxTextureSize.ToString());
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("Max Cubemap Size:", SystemInfo.maxCubemapSize.ToString());
+#endif
+#if UNITY_5_4_OR_NEWER
+                    DrawItem("Copy Texture Support:", SystemInfo.copyTextureSupport.ToString());
+#endif
+                    DrawItem("Supported Render Target Count:", SystemInfo.supportedRenderTargetCount.ToString());
+#if UNITY_5_3 || UNITY_5_4
+                    DrawItem("Supports Stencil:", SystemInfo.supportsStencil.ToString());
+                    DrawItem("Supports Render Textures:", SystemInfo.supportsRenderTextures.ToString());
+#endif
+                    DrawItem("Supports Sparse Textures:", SystemInfo.supportsSparseTextures.ToString());
+                    DrawItem("Supports 3D Textures:", SystemInfo.supports3DTextures.ToString());
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("Supports 3D Render Textures:", SystemInfo.supports3DRenderTextures.ToString());
+#endif
+#if UNITY_5_4_OR_NEWER
+                    DrawItem("Supports 2D Array Textures:", SystemInfo.supports2DArrayTextures.ToString());
+#endif
+                    DrawItem("Supports Shadows:", SystemInfo.supportsShadows.ToString());
+                    DrawItem("Supports Raw Shadow Depth Sampling:", SystemInfo.supportsRawShadowDepthSampling.ToString());
+                    DrawItem("Supports Render To Cubemap:", SystemInfo.supportsRenderToCubemap.ToString());
+                    DrawItem("Supports Compute Shader:", SystemInfo.supportsComputeShaders.ToString());
+                    DrawItem("Supports Instancing:", SystemInfo.supportsInstancing.ToString());
+                    DrawItem("Supports Image Effects:", SystemInfo.supportsImageEffects.ToString());
+#if UNITY_5_5_OR_NEWER
+                    DrawItem("Supports Cubemap Array Textures:", SystemInfo.supportsCubemapArrayTextures.ToString());
+#endif
+#if UNITY_5_4_OR_NEWER
+                    DrawItem("Supports Motion Vectors:", SystemInfo.supportsMotionVectors.ToString());
+#endif
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("Graphics UV Starts At Top:", SystemInfo.graphicsUVStartsAtTop.ToString());
+#endif
+#if UNITY_5_5_OR_NEWER
+                    DrawItem("Uses Reversed ZBuffer:", SystemInfo.usesReversedZBuffer.ToString());
+#endif
+                }
+                GUILayout.EndVertical();
+            }
+
+            private string GetShaderLevelString(int shaderLevel)
+            {
+                return string.Format("Shader Model {0}.{1}", (shaderLevel / 10).ToString(), (shaderLevel % 10).ToString());
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.GraphicsInformationWindow.cs.meta

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

+ 45 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputAccelerationInformationWindow.cs

@@ -0,0 +1,45 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class InputAccelerationInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Input Acceleration Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Acceleration:", Input.acceleration.ToString());
+                    DrawItem("Acceleration Event Count:", Input.accelerationEventCount.ToString());
+                    DrawItem("Acceleration Events:", GetAccelerationEventsString(Input.accelerationEvents));
+                }
+                GUILayout.EndVertical();
+            }
+
+            private string GetAccelerationEventString(AccelerationEvent accelerationEvent)
+            {
+                return string.Format("{0}, {1}", accelerationEvent.acceleration.ToString(), accelerationEvent.deltaTime.ToString());
+            }
+
+            private string GetAccelerationEventsString(AccelerationEvent[] accelerationEvents)
+            {
+                string[] accelerationEventStrings = new string[accelerationEvents.Length];
+                for (int i = 0; i < accelerationEvents.Length; i++)
+                {
+                    accelerationEventStrings[i] = GetAccelerationEventString(accelerationEvents[i]);
+                }
+
+                return string.Join("; ", accelerationEventStrings);
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputAccelerationInformationWindow.cs.meta

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

+ 45 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputCompassInformationWindow.cs

@@ -0,0 +1,45 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class InputCompassInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Input Compass Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    GUILayout.BeginHorizontal();
+                    {
+                        if (GUILayout.Button("Enable", GUILayout.Height(30f)))
+                        {
+                            Input.compass.enabled = true;
+                        }
+                        if (GUILayout.Button("Disable", GUILayout.Height(30f)))
+                        {
+                            Input.compass.enabled = false;
+                        }
+                    }
+                    GUILayout.EndHorizontal();
+
+                    DrawItem("Enabled:", Input.compass.enabled.ToString());
+                    DrawItem("Heading Accuracy:", Input.compass.headingAccuracy.ToString());
+                    DrawItem("Magnetic Heading:", Input.compass.magneticHeading.ToString());
+                    DrawItem("Raw Vector:", Input.compass.rawVector.ToString());
+                    DrawItem("Timestamp:", Input.compass.timestamp.ToString());
+                    DrawItem("True Heading:", Input.compass.trueHeading.ToString());
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputCompassInformationWindow.cs.meta

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

+ 46 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputGyroscopeInformationWindow.cs

@@ -0,0 +1,46 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class InputGyroscopeInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Input Gyroscope Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    GUILayout.BeginHorizontal();
+                    {
+                        if (GUILayout.Button("Enable", GUILayout.Height(30f)))
+                        {
+                            Input.gyro.enabled = true;
+                        }
+                        if (GUILayout.Button("Disable", GUILayout.Height(30f)))
+                        {
+                            Input.gyro.enabled = false;
+                        }
+                    }
+                    GUILayout.EndHorizontal();
+
+                    DrawItem("Enabled:", Input.gyro.enabled.ToString());
+                    DrawItem("Update Interval:", Input.gyro.updateInterval.ToString());
+                    DrawItem("Attitude:", Input.gyro.attitude.eulerAngles.ToString());
+                    DrawItem("Gravity:", Input.gyro.gravity.ToString());
+                    DrawItem("Rotation Rate:", Input.gyro.rotationRate.ToString());
+                    DrawItem("Rotation Rate Unbiased:", Input.gyro.rotationRateUnbiased.ToString());
+                    DrawItem("User Acceleration:", Input.gyro.userAcceleration.ToString());
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputGyroscopeInformationWindow.cs.meta

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

+ 47 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputLocationInformationWindow.cs

@@ -0,0 +1,47 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class InputLocationInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Input Location Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    GUILayout.BeginHorizontal();
+                    {
+                        if (GUILayout.Button("Enable", GUILayout.Height(30f)))
+                        {
+                            Input.location.Start();
+                        }
+                        if (GUILayout.Button("Disable", GUILayout.Height(30f)))
+                        {
+                            Input.location.Stop();
+                        }
+                    }
+                    GUILayout.EndHorizontal();
+
+                    DrawItem("Is Enabled By User:", Input.location.isEnabledByUser.ToString());
+                    DrawItem("Status:", Input.location.status.ToString());
+                    DrawItem("Horizontal Accuracy:", Input.location.lastData.horizontalAccuracy.ToString());
+                    DrawItem("Vertical Accuracy:", Input.location.lastData.verticalAccuracy.ToString());
+                    DrawItem("Longitude:", Input.location.lastData.longitude.ToString());
+                    DrawItem("Latitude:", Input.location.lastData.latitude.ToString());
+                    DrawItem("Altitude:", Input.location.lastData.altitude.ToString());
+                    DrawItem("Timestamp:", Input.location.lastData.timestamp.ToString());
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputLocationInformationWindow.cs.meta

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

+ 39 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputSummaryInformationWindow.cs

@@ -0,0 +1,39 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class InputSummaryInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Input Summary Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Back Button Leaves App:", Input.backButtonLeavesApp.ToString());
+                    DrawItem("Device Orientation:", Input.deviceOrientation.ToString());
+                    DrawItem("Mouse Present:", Input.mousePresent.ToString());
+                    DrawItem("Mouse Position:", Input.mousePosition.ToString());
+                    DrawItem("Mouse Scroll Delta:", Input.mouseScrollDelta.ToString());
+                    DrawItem("Any Key:", Input.anyKey.ToString());
+                    DrawItem("Any Key Down:", Input.anyKeyDown.ToString());
+                    DrawItem("Input String:", Input.inputString);
+                    DrawItem("IME Is Selected:", Input.imeIsSelected.ToString());
+                    DrawItem("IME Composition Mode:", Input.imeCompositionMode.ToString());
+                    DrawItem("Compensate Sensors:", Input.compensateSensors.ToString());
+                    DrawItem("Composition Cursor Position:", Input.compositionCursorPos.ToString());
+                    DrawItem("Composition String:", Input.compositionString);
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputSummaryInformationWindow.cs.meta

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

+ 49 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputTouchInformationWindow.cs

@@ -0,0 +1,49 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class InputTouchInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Input Touch Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Touch Supported:", Input.touchSupported.ToString());
+                    DrawItem("Touch Pressure Supported:", Input.touchPressureSupported.ToString());
+                    DrawItem("Stylus Touch Supported:", Input.stylusTouchSupported.ToString());
+                    DrawItem("Simulate Mouse With Touches:", Input.simulateMouseWithTouches.ToString());
+                    DrawItem("Multi Touch Enabled:", Input.multiTouchEnabled.ToString());
+                    DrawItem("Touch Count:", Input.touchCount.ToString());
+                    DrawItem("Touches:", GetTouchesString(Input.touches));
+                }
+                GUILayout.EndVertical();
+            }
+
+            private string GetTouchString(Touch touch)
+            {
+                return string.Format("{0}, {1}, {2}, {3}, {4}", touch.position.ToString(), touch.deltaPosition.ToString(), touch.rawPosition.ToString(), touch.pressure.ToString(), touch.phase.ToString());
+            }
+
+            private string GetTouchesString(Touch[] touches)
+            {
+                string[] touchStrings = new string[touches.Length];
+                for (int i = 0; i < touches.Length; i++)
+                {
+                    touchStrings[i] = GetTouchString(touches[i]);
+                }
+
+                return string.Join("; ", touchStrings);
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.InputTouchInformationWindow.cs.meta

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

+ 30 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.PathInformationWindow.cs

@@ -0,0 +1,30 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class PathInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Path Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Data Path:", Application.dataPath);
+                    DrawItem("Persistent Data Path:", Application.persistentDataPath);
+                    DrawItem("Streaming Assets Path:", Application.streamingAssetsPath);
+                    DrawItem("Temporary Cache Path:", Application.temporaryCachePath);
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.PathInformationWindow.cs.meta

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

+ 56 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.ProfilerInformationWindow.cs

@@ -0,0 +1,56 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+#if UNITY_5_5_OR_NEWER
+using UnityEngine.Profiling;
+#endif
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class ProfilerInformationWindow : ScrollableDebuggerWindowBase
+        {
+            private const int MBSize = 1024 * 1024;
+
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Profiler Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Supported:", Profiler.supported.ToString());
+                    DrawItem("Enabled:", Profiler.enabled.ToString());
+                    DrawItem("Enable Binary Log:", Profiler.enableBinaryLog ? string.Format("True, {0}", Profiler.logFile) : "False");
+#if UNITY_5_3 || UNITY_5_4
+                    DrawItem("Max Samples Number Per Frame:", Profiler.maxNumberOfSamplesPerFrame.ToString());
+#endif
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("Mono Used Size:", string.Format("{0} MB", (Profiler.GetMonoUsedSizeLong() / (float)MBSize).ToString("F3")));
+                    DrawItem("Mono Heap Size:", string.Format("{0} MB", (Profiler.GetMonoHeapSizeLong() / (float)MBSize).ToString("F3")));
+                    DrawItem("Used Heap Size:", string.Format("{0} MB", (Profiler.usedHeapSizeLong / (float)MBSize).ToString("F3")));
+                    DrawItem("Total Allocated Memory:", string.Format("{0} MB", (Profiler.GetTotalAllocatedMemoryLong() / (float)MBSize).ToString("F3")));
+                    DrawItem("Total Reserved Memory:", string.Format("{0} MB", (Profiler.GetTotalReservedMemoryLong() / (float)MBSize).ToString("F3")));
+                    DrawItem("Total Unused Reserved Memory:", string.Format("{0} MB", (Profiler.GetTotalUnusedReservedMemoryLong() / (float)MBSize).ToString("F3")));
+#else
+                    DrawItem("Mono Used Size:", string.Format("{0} MB", (Profiler.GetMonoUsedSize() / (float)MBSize).ToString("F3")));
+                    DrawItem("Mono Heap Size:", string.Format("{0} MB", (Profiler.GetMonoHeapSize() / (float)MBSize).ToString("F3")));
+                    DrawItem("Used Heap Size:", string.Format("{0} MB", (Profiler.usedHeapSize / (float)MBSize).ToString("F3")));
+                    DrawItem("Total Allocated Memory:", string.Format("{0} MB", (Profiler.GetTotalAllocatedMemory() / (float)MBSize).ToString("F3")));
+                    DrawItem("Total Reserved Memory:", string.Format("{0} MB", (Profiler.GetTotalReservedMemory() / (float)MBSize).ToString("F3")));
+                    DrawItem("Total Unused Reserved Memory:", string.Format("{0} MB", (Profiler.GetTotalUnusedReservedMemory() / (float)MBSize).ToString("F3")));
+#endif
+#if UNITY_5_5_OR_NEWER
+                    DrawItem("Temp Allocator Size:", string.Format("{0} MB", (Profiler.GetTempAllocatorSize() / (float)MBSize).ToString("F3")));
+#endif
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.ProfilerInformationWindow.cs.meta

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

+ 70 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.QualityInformationWindow.cs

@@ -0,0 +1,70 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class QualityInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Rendering Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Active Color Space:", QualitySettings.activeColorSpace.ToString());
+                    DrawItem("Desired Color Space:", QualitySettings.desiredColorSpace.ToString());
+                    DrawItem("Max Queued Frames:", QualitySettings.maxQueuedFrames.ToString());
+                    DrawItem("Pixel Light Count:", QualitySettings.pixelLightCount.ToString());
+                    DrawItem("Master Texture Limit:", QualitySettings.masterTextureLimit.ToString());
+                    DrawItem("Anisotropic Filtering:", QualitySettings.anisotropicFiltering.ToString());
+                    DrawItem("Anti Aliasing:", QualitySettings.antiAliasing.ToString());
+                    DrawItem("Realtime Reflection Probes:", QualitySettings.realtimeReflectionProbes.ToString());
+                    DrawItem("Billboards Face Camera Position:", QualitySettings.billboardsFaceCameraPosition.ToString());
+                }
+                GUILayout.EndVertical();
+
+                GUILayout.Label("<b>Shadows Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+#if UNITY_5_4_OR_NEWER
+                    DrawItem("Shadow Resolution:", QualitySettings.shadowResolution.ToString());
+#endif
+#if UNITY_5_5_OR_NEWER
+                    DrawItem("Shadow Quality:", QualitySettings.shadows.ToString());
+#endif
+                    DrawItem("Shadow Projection:", QualitySettings.shadowProjection.ToString());
+                    DrawItem("Shadow Distance:", QualitySettings.shadowDistance.ToString());
+                    DrawItem("Shadow Near Plane Offset:", QualitySettings.shadowNearPlaneOffset.ToString());
+                    DrawItem("Shadow Cascades:", QualitySettings.shadowCascades.ToString());
+                    DrawItem("Shadow Cascade 2 Split:", QualitySettings.shadowCascade2Split.ToString());
+                    DrawItem("Shadow Cascade 4 Split:", QualitySettings.shadowCascade4Split.ToString());
+                }
+                GUILayout.EndVertical();
+
+                GUILayout.Label("<b>Other Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Blend Weights:", QualitySettings.skinWeights.ToString());
+                    DrawItem("VSync Count:", QualitySettings.vSyncCount.ToString());
+                    DrawItem("LOD Bias:", QualitySettings.lodBias.ToString());
+                    DrawItem("Maximum LOD Level:", QualitySettings.maximumLODLevel.ToString());
+                    DrawItem("Particle Raycast Budget:", QualitySettings.particleRaycastBudget.ToString());
+                    DrawItem("Async Upload Time Slice:", string.Format("{0} ms", QualitySettings.asyncUploadTimeSlice.ToString()));
+                    DrawItem("Async Upload Buffer Size:", string.Format("{0} MB", QualitySettings.asyncUploadBufferSize.ToString()));
+#if UNITY_5_5_OR_NEWER
+                    DrawItem("Soft Particles:", QualitySettings.softParticles.ToString());
+#endif
+                    DrawItem("Soft Vegetation:", QualitySettings.softVegetation.ToString());
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.QualityInformationWindow.cs.meta

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

+ 40 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.QualitySettingsWindow.cs

@@ -0,0 +1,40 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class QualitySettingsWindow : ScrollableDebuggerWindowBase
+        {
+            private bool m_ApplyExpensiveChanges = false;
+
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Quality Settings</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    int currentQualityLevel = QualitySettings.GetQualityLevel();
+
+                    GUILayout.Label(string.Format("Quality Level: {0}", QualitySettings.names[currentQualityLevel]), GUILayout.Height(30f));
+                    m_ApplyExpensiveChanges = GUILayout.Toggle(m_ApplyExpensiveChanges, "Apply expensive changes on quality level change.");
+
+                    GUILayout.Space(10f);
+
+                    int newQualityLevel = GUILayout.SelectionGrid(currentQualityLevel, QualitySettings.names, 1, "toggle");
+                    if (newQualityLevel != currentQualityLevel)
+                    {
+                        QualitySettings.SetQualityLevel(newQualityLevel, m_ApplyExpensiveChanges);
+                    }
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.QualitySettingsWindow.cs.meta

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

+ 67 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.RuntimeMemoryInformationWindow.Sample.cs

@@ -0,0 +1,67 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed partial class RuntimeMemoryInformationWindow<T>
+        {
+            private sealed class Sample
+            {
+                private readonly string m_Name;
+                private readonly string m_Type;
+                private readonly long m_Size;
+                private bool m_Highlight;
+
+                public Sample(string name, string type, long size)
+                {
+                    m_Name = name;
+                    m_Type = type;
+                    m_Size = size;
+                    m_Highlight = false;
+                }
+
+                public string Name
+                {
+                    get
+                    {
+                        return m_Name;
+                    }
+                }
+
+                public string Type
+                {
+                    get
+                    {
+                        return m_Type;
+                    }
+                }
+
+                public long Size
+                {
+                    get
+                    {
+                        return m_Size;
+                    }
+                }
+
+                public bool Highlight
+                {
+                    get
+                    {
+                        return m_Highlight;
+                    }
+                    set
+                    {
+                        m_Highlight = value;
+                    }
+                }
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.RuntimeMemoryInformationWindow.Sample.cs.meta

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

+ 166 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.RuntimeMemoryInformationWindow.cs

@@ -0,0 +1,166 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:i@jiangyin.me
+//------------------------------------------------------------
+
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+#if UNITY_5_5_OR_NEWER
+using UnityEngine.Profiling;
+#endif
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed partial class RuntimeMemoryInformationWindow<T> : ScrollableDebuggerWindowBase where T : UnityEngine.Object
+        {
+            private const int ShowSampleCount = 300;
+
+            private DateTime m_SampleTime = DateTime.MinValue;
+            private long m_SampleSize = 0;
+            private long m_DuplicateSampleSize = 0;
+            private int m_DuplicateSimpleCount = 0;
+            private List<Sample> m_Samples = new List<Sample>();
+
+            protected override void OnDrawScrollableWindow()
+            {
+                string typeName = typeof(T).Name;
+                GUILayout.Label(string.Format("<b>{0} Runtime Memory Information</b>", typeName));
+                GUILayout.BeginVertical("box");
+                {
+                    if (GUILayout.Button(string.Format("Take Sample for {0}", typeName), GUILayout.Height(30f)))
+                    {
+                        TakeSample();
+                    }
+
+                    if (m_SampleTime <= DateTime.MinValue)
+                    {
+                        GUILayout.Label(string.Format("<b>Please take sample for {0} first.</b>", typeName));
+                    }
+                    else
+                    {
+                        if (m_DuplicateSimpleCount > 0)
+                        {
+                            GUILayout.Label(string.Format("<b>{0} {1}s ({2}) obtained at {3}, while {4} {1}s ({5}) might be duplicated.</b>", m_Samples.Count.ToString(), typeName, GetSizeString(m_SampleSize), m_SampleTime.ToString("yyyy-MM-dd HH:mm:ss"), m_DuplicateSimpleCount.ToString(), GetSizeString(m_DuplicateSampleSize)));
+                        }
+                        else
+                        {
+                            GUILayout.Label(string.Format("<b>{0} {1}s ({2}) obtained at {3}.</b>", m_Samples.Count.ToString(), typeName, GetSizeString(m_SampleSize), m_SampleTime.ToString("yyyy-MM-dd HH:mm:ss")));
+                        }
+
+                        if (m_Samples.Count > 0)
+                        {
+                            GUILayout.BeginHorizontal();
+                            {
+                                GUILayout.Label(string.Format("<b>{0} Name</b>", typeName));
+                                GUILayout.Label("<b>Type</b>", GUILayout.Width(240f));
+                                GUILayout.Label("<b>Size</b>", GUILayout.Width(80f));
+                            }
+                            GUILayout.EndHorizontal();
+                        }
+
+                        int count = 0;
+                        for (int i = 0; i < m_Samples.Count; i++)
+                        {
+                            GUILayout.BeginHorizontal();
+                            {
+                                GUILayout.Label(m_Samples[i].Highlight ? string.Format("<color=yellow>{0}</color>", m_Samples[i].Name) : m_Samples[i].Name);
+                                GUILayout.Label(m_Samples[i].Highlight ? string.Format("<color=yellow>{0}</color>", m_Samples[i].Type) : m_Samples[i].Type, GUILayout.Width(240f));
+                                GUILayout.Label(m_Samples[i].Highlight ? string.Format("<color=yellow>{0}</color>", GetSizeString(m_Samples[i].Size)) : GetSizeString(m_Samples[i].Size), GUILayout.Width(80f));
+                            }
+                            GUILayout.EndHorizontal();
+
+                            count++;
+                            if (count >= ShowSampleCount)
+                            {
+                                break;
+                            }
+                        }
+                    }
+                }
+                GUILayout.EndVertical();
+            }
+
+            private void TakeSample()
+            {
+                m_SampleTime = DateTime.Now;
+                m_SampleSize = 0L;
+                m_DuplicateSampleSize = 0L;
+                m_DuplicateSimpleCount = 0;
+                m_Samples.Clear();
+
+                T[] samples = Resources.FindObjectsOfTypeAll<T>();
+                for (int i = 0; i < samples.Length; i++)
+                {
+                    long sampleSize = 0L;
+#if UNITY_5_6_OR_NEWER
+                    sampleSize = Profiler.GetRuntimeMemorySizeLong(samples[i]);
+#else
+                    sampleSize = Profiler.GetRuntimeMemorySize(samples[i]);
+#endif
+                    m_SampleSize += sampleSize;
+                    m_Samples.Add(new Sample(samples[i].name, samples[i].GetType().Name, sampleSize));
+                }
+
+                m_Samples.Sort(SampleComparer);
+
+                for (int i = 1; i < m_Samples.Count; i++)
+                {
+                    if (m_Samples[i].Name == m_Samples[i - 1].Name && m_Samples[i].Type == m_Samples[i - 1].Type && m_Samples[i].Size == m_Samples[i - 1].Size)
+                    {
+                        m_Samples[i].Highlight = true;
+                        m_DuplicateSampleSize += m_Samples[i].Size;
+                        m_DuplicateSimpleCount++;
+                    }
+                }
+            }
+
+            private string GetSizeString(long size)
+            {
+                if (size < 1024L)
+                {
+                    return string.Format("{0} Bytes", size.ToString());
+                }
+
+                if (size < 1024L * 1024L)
+                {
+                    return string.Format("{0} KB", (size / 1024f).ToString("F2"));
+                }
+
+                if (size < 1024L * 1024L * 1024L)
+                {
+                    return string.Format("{0} MB", (size / 1024f / 1024f).ToString("F2"));
+                }
+
+                if (size < 1024L * 1024L * 1024L * 1024L)
+                {
+                    return string.Format("{0} GB", (size / 1024f / 1024f / 1024f).ToString("F2"));
+                }
+
+                return string.Format("{0} TB", (size / 1024f / 1024f / 1024f / 1024f).ToString("F2"));
+            }
+
+            private int SampleComparer(Sample a, Sample b)
+            {
+                int result = b.Size.CompareTo(a.Size);
+                if (result != 0)
+                {
+                    return result;
+                }
+
+                result = a.Type.CompareTo(b.Type);
+                if (result != 0)
+                {
+                    return result;
+                }
+
+                return a.Name.CompareTo(b.Name);
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.RuntimeMemoryInformationWindow.cs.meta

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

+ 37 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.SceneInformationWindow.cs

@@ -0,0 +1,37 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+using UnityEngine.SceneManagement;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class SceneInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Scene Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Scene Count:", SceneManager.sceneCount.ToString());
+                    DrawItem("Scene Count In Build Settings:", SceneManager.sceneCountInBuildSettings.ToString());
+
+                    Scene activeScene = SceneManager.GetActiveScene();
+                    DrawItem("Active Scene Name:", activeScene.name);
+                    DrawItem("Active Scene Path:", activeScene.path);
+                    DrawItem("Active Scene Build Index:", activeScene.buildIndex.ToString());
+                    DrawItem("Active Scene Is Dirty:", activeScene.isDirty.ToString());
+                    DrawItem("Active Scene Is Loaded:", activeScene.isLoaded.ToString());
+                    DrawItem("Active Scene Root Count:", activeScene.rootCount.ToString());
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.SceneInformationWindow.cs.meta

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

+ 71 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.ScreenInformationWindow.cs

@@ -0,0 +1,71 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class ScreenInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Screen Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Current Resolution", GetResolutionString(Screen.currentResolution));
+                    DrawItem("Screen Width", string.Format("{0} px", Screen.width.ToString()));
+                    DrawItem("Screen Height", string.Format("{0} px", Screen.height.ToString()));
+                    DrawItem("Screen DPI", Screen.dpi.ToString("F2"));
+                    DrawItem("Screen Orientation", Screen.orientation.ToString());
+                    DrawItem("Is Full Screen", Screen.fullScreen.ToString());
+                    DrawItem("Sleep Timeout", GetSleepTimeoutDescription(Screen.sleepTimeout));
+                    DrawItem("Cursor Visible", Cursor.visible.ToString());
+                    DrawItem("Cursor Lock State", Cursor.lockState.ToString());
+                    DrawItem("Auto Landscape Left", Screen.autorotateToLandscapeLeft.ToString());
+                    DrawItem("Auto Landscape Right", Screen.autorotateToLandscapeRight.ToString());
+                    DrawItem("Auto Portrait", Screen.autorotateToPortrait.ToString());
+                    DrawItem("Auto Portrait Upside Down", Screen.autorotateToPortraitUpsideDown.ToString());
+                    DrawItem("Support Resolutions", GetResolutionsString(Screen.resolutions));
+                }
+                GUILayout.EndVertical();
+            }
+
+            private string GetSleepTimeoutDescription(int sleepTimeout)
+            {
+                if (sleepTimeout == SleepTimeout.NeverSleep)
+                {
+                    return "Never Sleep";
+                }
+
+                if (sleepTimeout == SleepTimeout.SystemSetting)
+                {
+                    return "System Setting";
+                }
+
+                return sleepTimeout.ToString();
+            }
+
+            private string GetResolutionString(Resolution resolution)
+            {
+                return string.Format("{0} x {1} @ {2}Hz", resolution.width.ToString(), resolution.height.ToString(), resolution.refreshRate.ToString());
+            }
+
+            private string GetResolutionsString(Resolution[] resolutions)
+            {
+                string[] resolutionStrings = new string[resolutions.Length];
+                for (int i = 0; i < resolutions.Length; i++)
+                {
+                    resolutionStrings[i] = GetResolutionString(resolutions[i]);
+                }
+
+                return string.Join("; ", resolutionStrings);
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.ScreenInformationWindow.cs.meta

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

+ 61 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.SystemInformationWindow.cs

@@ -0,0 +1,61 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class SystemInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>System Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Device Unique ID:", SystemInfo.deviceUniqueIdentifier);
+                    DrawItem("Device Name:", SystemInfo.deviceName);
+                    DrawItem("Device Type:", SystemInfo.deviceType.ToString());
+                    DrawItem("Device Model:", SystemInfo.deviceModel);
+                    DrawItem("Processor Type:", SystemInfo.processorType);
+                    DrawItem("Processor Count:", SystemInfo.processorCount.ToString());
+                    DrawItem("Processor Frequency:", string.Format("{0} MHz", SystemInfo.processorFrequency.ToString()));
+                    DrawItem("Memory Size:", string.Format("{0} MB", SystemInfo.systemMemorySize.ToString()));
+#if UNITY_5_5_OR_NEWER
+                    DrawItem("Operating System Family:", SystemInfo.operatingSystemFamily.ToString());
+#endif
+                    DrawItem("Operating System:", SystemInfo.operatingSystem);
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("Battery Status:", SystemInfo.batteryStatus.ToString());
+                    DrawItem("Battery Level:", GetBatteryLevelString(SystemInfo.batteryLevel));
+#endif
+#if UNITY_5_4_OR_NEWER
+                    DrawItem("Supports Audio:", SystemInfo.supportsAudio.ToString());
+#endif
+                    DrawItem("Supports Location Service:", SystemInfo.supportsLocationService.ToString());
+                    DrawItem("Supports Accelerometer:", SystemInfo.supportsAccelerometer.ToString());
+                    DrawItem("Supports Gyroscope:", SystemInfo.supportsGyroscope.ToString());
+                    DrawItem("Supports Vibration:", SystemInfo.supportsVibration.ToString());
+                    DrawItem("Genuine:", Application.genuine.ToString());
+                    DrawItem("Genuine Check Available:", Application.genuineCheckAvailable.ToString());
+                }
+                GUILayout.EndVertical();
+            }
+
+            private string GetBatteryLevelString(float batteryLevel)
+            {
+                if (batteryLevel < 0f)
+                {
+                    return "Unavailable";
+                }
+
+                return batteryLevel.ToString("P0");
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.SystemInformationWindow.cs.meta

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

+ 72 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.TimeInformationWindow.cs

@@ -0,0 +1,72 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class TimeInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Time Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Time Scale", string.Format("{0} [{1}]", Time.timeScale.ToString(), GetTimeScaleDescription(Time.timeScale)));
+                    DrawItem("Realtime Since Startup", Time.realtimeSinceStartup.ToString());
+                    DrawItem("Time Since Level Load", Time.timeSinceLevelLoad.ToString());
+                    DrawItem("Time", Time.time.ToString());
+                    DrawItem("Fixed Time", Time.fixedTime.ToString());
+                    DrawItem("Unscaled Time", Time.unscaledTime.ToString());
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("Fixed Unscaled Time", Time.fixedUnscaledTime.ToString());
+#endif
+                    DrawItem("Delta Time", Time.deltaTime.ToString());
+                    DrawItem("Fixed Delta Time", Time.fixedDeltaTime.ToString());
+                    DrawItem("Unscaled Delta Time", Time.unscaledDeltaTime.ToString());
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("Fixed Unscaled Delta Time", Time.fixedUnscaledDeltaTime.ToString());
+#endif
+                    DrawItem("Smooth Delta Time", Time.smoothDeltaTime.ToString());
+                    DrawItem("Maximum Delta Time", Time.maximumDeltaTime.ToString());
+#if UNITY_5_5_OR_NEWER
+                    DrawItem("Maximum Particle Delta Time", Time.maximumParticleDeltaTime.ToString());
+#endif
+                    DrawItem("Frame Count", Time.frameCount.ToString());
+                    DrawItem("Rendered Frame Count", Time.renderedFrameCount.ToString());
+                    DrawItem("Capture Frame Rate", Time.captureFramerate.ToString());
+#if UNITY_5_6_OR_NEWER
+                    DrawItem("In Fixed Time Step", Time.inFixedTimeStep.ToString());
+#endif
+                }
+                GUILayout.EndVertical();
+            }
+
+            private string GetTimeScaleDescription(float timeScale)
+            {
+                if (timeScale <= 0f)
+                {
+                    return "Pause";
+                }
+
+                if (timeScale < 1f)
+                {
+                    return "Slower";
+                }
+
+                if (timeScale > 1f)
+                {
+                    return "Faster";
+                }
+
+                return "Normal";
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.TimeInformationWindow.cs.meta

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

+ 34 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.WebPlayerInformationWindow.cs

@@ -0,0 +1,34 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        private sealed class WebPlayerInformationWindow : ScrollableDebuggerWindowBase
+        {
+            protected override void OnDrawScrollableWindow()
+            {
+                GUILayout.Label("<b>Web Player Information</b>");
+                GUILayout.BeginVertical("box");
+                {
+                    DrawItem("Is Web Player:", Application.isPlaying.ToString());
+                    DrawItem("Absolute URL:", Application.absoluteURL);
+                    //DrawItem("Source Value:", Application.srcValue);
+                    DrawItem("Streamed Bytes:", Application.streamedBytes.ToString());
+#if UNITY_5_3 || UNITY_5_4
+                    DrawItem("Web Security Enabled:", Application.webSecurityEnabled.ToString());
+                    DrawItem("Web Security Host URL:", Application.webSecurityHostUrl.ToString());
+#endif
+                }
+                GUILayout.EndVertical();
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.WebPlayerInformationWindow.cs.meta

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

+ 364 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.cs

@@ -0,0 +1,364 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:i@jiangyin.me
+//------------------------------------------------------------
+
+using GameFramework.Debugger;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    /// <summary>
+    /// 调试组件。
+    /// </summary>
+    [DisallowMultipleComponent]
+    [AddComponentMenu("Game Framework/Debugger")]
+    public sealed partial class DebuggerComponent : MonoBehaviour
+    {
+        /// <summary>
+        /// 默认调试器漂浮框大小。
+        /// </summary>
+        internal static readonly Rect DefaultIconRect = new Rect(10f, 10f, 60f, 60f);
+
+        /// <summary>
+        /// 默认调试器窗口大小。
+        /// </summary>
+        internal static readonly Rect DefaultWindowRect = new Rect(10f, 10f, 640f, 480f);
+
+        /// <summary>
+        /// 默认调试器窗口缩放比例。
+        /// </summary>
+        internal static readonly float DefaultWindowScale = 1f;
+
+        private DebuggerManager m_DebuggerManager = null;
+        private Rect m_DragRect = new Rect(0f, 0f, float.MaxValue, 25f);
+        private Rect m_IconRect = DefaultIconRect;
+        private Rect m_WindowRect = DefaultWindowRect;
+        private float m_WindowScale = DefaultWindowScale;
+
+        [SerializeField]
+        private GUISkin m_Skin = null;
+
+        [SerializeField]
+        private DebuggerActiveWindowType m_ActiveWindow = DebuggerActiveWindowType.Auto;
+
+        [SerializeField]
+        private bool m_ShowFullWindow = true;
+
+        [SerializeField]
+        private ConsoleWindow m_ConsoleWindow = new ConsoleWindow();
+
+        private SystemInformationWindow m_SystemInformationWindow = new SystemInformationWindow();
+        private EnvironmentInformationWindow m_EnvironmentInformationWindow = new EnvironmentInformationWindow();
+        private ScreenInformationWindow m_ScreenInformationWindow = new ScreenInformationWindow();
+        private GraphicsInformationWindow m_GraphicsInformationWindow = new GraphicsInformationWindow();
+        private InputSummaryInformationWindow m_InputSummaryInformationWindow = new InputSummaryInformationWindow();
+        private InputTouchInformationWindow m_InputTouchInformationWindow = new InputTouchInformationWindow();
+        private InputLocationInformationWindow m_InputLocationInformationWindow = new InputLocationInformationWindow();
+        private InputAccelerationInformationWindow m_InputAccelerationInformationWindow = new InputAccelerationInformationWindow();
+        private InputGyroscopeInformationWindow m_InputGyroscopeInformationWindow = new InputGyroscopeInformationWindow();
+        private InputCompassInformationWindow m_InputCompassInformationWindow = new InputCompassInformationWindow();
+        private PathInformationWindow m_PathInformationWindow = new PathInformationWindow();
+        private SceneInformationWindow m_SceneInformationWindow = new SceneInformationWindow();
+        private TimeInformationWindow m_TimeInformationWindow = new TimeInformationWindow();
+        private QualityInformationWindow m_QualityInformationWindow = new QualityInformationWindow();
+        private ProfilerInformationWindow m_ProfilerInformationWindow = new ProfilerInformationWindow();
+        private WebPlayerInformationWindow m_WebPlayerInformationWindow = new WebPlayerInformationWindow();
+        private RuntimeMemoryInformationWindow<Object> m_RuntimeMemoryAllInformationWindow = new RuntimeMemoryInformationWindow<Object>();
+        private RuntimeMemoryInformationWindow<Texture> m_RuntimeMemoryTextureInformationWindow = new RuntimeMemoryInformationWindow<Texture>();
+        private RuntimeMemoryInformationWindow<Mesh> m_RuntimeMemoryMeshInformationWindow = new RuntimeMemoryInformationWindow<Mesh>();
+        private RuntimeMemoryInformationWindow<Material> m_RuntimeMemoryMaterialInformationWindow = new RuntimeMemoryInformationWindow<Material>();
+        private RuntimeMemoryInformationWindow<AnimationClip> m_RuntimeMemoryAnimationClipInformationWindow = new RuntimeMemoryInformationWindow<AnimationClip>();
+        private RuntimeMemoryInformationWindow<AudioClip> m_RuntimeMemoryAudioClipInformationWindow = new RuntimeMemoryInformationWindow<AudioClip>();
+        private RuntimeMemoryInformationWindow<Font> m_RuntimeMemoryFontInformationWindow = new RuntimeMemoryInformationWindow<Font>();
+        private RuntimeMemoryInformationWindow<GameObject> m_RuntimeMemoryGameObjectInformationWindow = new RuntimeMemoryInformationWindow<GameObject>();
+        private RuntimeMemoryInformationWindow<Component> m_RuntimeMemoryComponentInformationWindow = new RuntimeMemoryInformationWindow<Component>();
+
+        private GeneralSettingsWindow m_GeneralSettingsWindow = new GeneralSettingsWindow();
+        private QualitySettingsWindow m_QualitySettingsWindow = new QualitySettingsWindow();
+
+        private FpsCounter m_FpsCounter = null;
+
+        /// <summary>
+        /// 获取或设置调试窗口是否激活。
+        /// </summary>
+        public bool ActiveWindow
+        {
+            get
+            {
+                return m_DebuggerManager.ActiveWindow;
+            }
+            set
+            {
+                m_DebuggerManager.ActiveWindow = value;
+                enabled = value;
+            }
+        }
+
+        /// <summary>
+        /// 获取或设置是否显示完整调试器界面。
+        /// </summary>
+        public bool ShowFullWindow
+        {
+            get
+            {
+                return m_ShowFullWindow;
+            }
+            set
+            {
+                m_ShowFullWindow = value;
+            }
+        }
+
+        /// <summary>
+        /// 获取或设置调试器漂浮框大小。
+        /// </summary>
+        public Rect IconRect
+        {
+            get
+            {
+                return m_IconRect;
+            }
+            set
+            {
+                m_IconRect = value;
+            }
+        }
+
+        /// <summary>
+        /// 获取或设置调试器窗口大小。
+        /// </summary>
+        public Rect WindowRect
+        {
+            get
+            {
+                return m_WindowRect;
+            }
+            set
+            {
+                m_WindowRect = value;
+            }
+        }
+
+        /// <summary>
+        /// 获取或设置调试器窗口缩放比例。
+        /// </summary>
+        public float WindowScale
+        {
+            get
+            {
+                return m_WindowScale;
+            }
+            set
+            {
+                m_WindowScale = value;
+            }
+        }
+
+        /// <summary>
+        /// 游戏框架组件初始化。
+        /// </summary>
+        private void Awake()
+        {
+            DontDestroyOnLoad(gameObject);
+
+            m_DebuggerManager = new DebuggerManager();
+
+            if (m_ActiveWindow == DebuggerActiveWindowType.Auto)
+            {
+                ActiveWindow = Debug.isDebugBuild;
+            }
+            else
+            {
+                ActiveWindow = (m_ActiveWindow == DebuggerActiveWindowType.Open);
+            }
+
+            m_FpsCounter = new FpsCounter(0.5f);
+        }
+
+        private void Start()
+        {
+            RegisterDebuggerWindow("Console", m_ConsoleWindow);
+            RegisterDebuggerWindow("Information/System", m_SystemInformationWindow);
+            RegisterDebuggerWindow("Information/Environment", m_EnvironmentInformationWindow);
+            RegisterDebuggerWindow("Information/Screen", m_ScreenInformationWindow);
+            RegisterDebuggerWindow("Information/Graphics", m_GraphicsInformationWindow);
+            RegisterDebuggerWindow("Information/Input/Summary", m_InputSummaryInformationWindow);
+            RegisterDebuggerWindow("Information/Input/Touch", m_InputTouchInformationWindow);
+            RegisterDebuggerWindow("Information/Input/Location", m_InputLocationInformationWindow);
+            RegisterDebuggerWindow("Information/Input/Acceleration", m_InputAccelerationInformationWindow);
+            RegisterDebuggerWindow("Information/Input/Gyroscope", m_InputGyroscopeInformationWindow);
+            RegisterDebuggerWindow("Information/Input/Compass", m_InputCompassInformationWindow);
+            RegisterDebuggerWindow("Information/Other/Scene", m_SceneInformationWindow);
+            RegisterDebuggerWindow("Information/Other/Path", m_PathInformationWindow);
+            RegisterDebuggerWindow("Information/Other/Time", m_TimeInformationWindow);
+            RegisterDebuggerWindow("Information/Other/Quality", m_QualityInformationWindow);
+            RegisterDebuggerWindow("Information/Other/Web Player", m_WebPlayerInformationWindow);
+            RegisterDebuggerWindow("Profiler/Summary", m_ProfilerInformationWindow);
+            RegisterDebuggerWindow("Profiler/Memory/All", m_RuntimeMemoryAllInformationWindow);
+            RegisterDebuggerWindow("Profiler/Memory/Texture", m_RuntimeMemoryTextureInformationWindow);
+            RegisterDebuggerWindow("Profiler/Memory/Mesh", m_RuntimeMemoryMeshInformationWindow);
+            RegisterDebuggerWindow("Profiler/Memory/Material", m_RuntimeMemoryMaterialInformationWindow);
+            RegisterDebuggerWindow("Profiler/Memory/AnimationClip", m_RuntimeMemoryAnimationClipInformationWindow);
+            RegisterDebuggerWindow("Profiler/Memory/AudioClip", m_RuntimeMemoryAudioClipInformationWindow);
+            RegisterDebuggerWindow("Profiler/Memory/Font", m_RuntimeMemoryFontInformationWindow);
+            RegisterDebuggerWindow("Profiler/Memory/GameObject", m_RuntimeMemoryGameObjectInformationWindow);
+            RegisterDebuggerWindow("Profiler/Memory/Component", m_RuntimeMemoryComponentInformationWindow);
+            RegisterDebuggerWindow("Settings/General", m_GeneralSettingsWindow, this);
+            RegisterDebuggerWindow("Settings/Quality", m_QualitySettingsWindow);
+
+            RegisterExtensionWindows();
+        }
+
+        private void OnDestroy()
+        {
+            if (m_DebuggerManager != null)
+            {
+                m_DebuggerManager.Shutdown();
+                m_DebuggerManager = null;
+            }
+        }
+
+        private void Update()
+        {
+            if (m_DebuggerManager == null || !m_DebuggerManager.ActiveWindow)
+            {
+                return;
+            }
+
+            m_DebuggerManager.Update(Time.deltaTime, Time.unscaledDeltaTime);
+            m_FpsCounter.Update(Time.deltaTime, Time.unscaledDeltaTime);
+        }
+
+        private void OnGUI()
+        {
+            if (m_DebuggerManager == null || !m_DebuggerManager.ActiveWindow)
+            {
+                return;
+            }
+
+            GUISkin cachedGuiSkin = GUI.skin;
+            Matrix4x4 cachedMatrix = GUI.matrix;
+
+            GUI.skin = m_Skin;
+            GUI.matrix = Matrix4x4.Scale(new Vector3(m_WindowScale, m_WindowScale, 1f));
+
+            if (m_ShowFullWindow)
+            {
+                m_WindowRect = GUILayout.Window(0, m_WindowRect, DrawWindow, "<b>GAME FRAMEWORK DEBUGGER</b>");
+            }
+            else
+            {
+                m_IconRect = GUILayout.Window(0, m_IconRect, DrawDebuggerWindowIcon, "<b>DEBUGGER</b>");
+            }
+
+            GUI.matrix = cachedMatrix;
+            GUI.skin = cachedGuiSkin;
+        }
+
+        /// <summary>
+        /// 注册调试窗口。
+        /// </summary>
+        /// <param name="path">调试窗口路径。</param>
+        /// <param name="debuggerWindow">要注册的调试窗口。</param>
+        /// <param name="args">初始化调试窗口参数。</param>
+        public void RegisterDebuggerWindow(string path, IDebuggerWindow debuggerWindow, params object[] args)
+        {
+            m_DebuggerManager.RegisterDebuggerWindow(path, debuggerWindow, args);
+        }
+
+        /// <summary>
+        /// 获取调试窗口。
+        /// </summary>
+        /// <param name="path">调试窗口路径。</param>
+        /// <returns>要获取的调试窗口。</returns>
+        public IDebuggerWindow GetDebuggerWindow(string path)
+        {
+            return m_DebuggerManager.GetDebuggerWindow(path);
+        }
+
+        private void DrawWindow(int windowId)
+        {
+            GUI.DragWindow(m_DragRect);
+            DrawDebuggerWindowGroup(m_DebuggerManager.DebuggerWindowRoot);
+        }
+
+        private void DrawDebuggerWindowGroup(IDebuggerWindowGroup debuggerWindowGroup)
+        {
+            if (debuggerWindowGroup == null)
+            {
+                return;
+            }
+
+            List<string> names = new List<string>();
+            string[] debuggerWindowNames = debuggerWindowGroup.GetDebuggerWindowNames();
+            for (int i = 0; i < debuggerWindowNames.Length; i++)
+            {
+                names.Add(string.Format("<b>{0}</b>", debuggerWindowNames[i]));
+            }
+
+            if (debuggerWindowGroup == m_DebuggerManager.DebuggerWindowRoot)
+            {
+                names.Add("<b>Close</b>");
+            }
+
+            int toolbarIndex = GUILayout.Toolbar(debuggerWindowGroup.SelectedIndex, names.ToArray(), GUILayout.Height(30f), GUILayout.MaxWidth(Screen.width));
+            if (toolbarIndex >= debuggerWindowGroup.DebuggerWindowCount)
+            {
+                m_ShowFullWindow = false;
+                return;
+            }
+
+            if (debuggerWindowGroup.SelectedIndex != toolbarIndex)
+            {
+                debuggerWindowGroup.SelectedWindow.OnLeave();
+                debuggerWindowGroup.SelectedIndex = toolbarIndex;
+                debuggerWindowGroup.SelectedWindow.OnEnter();
+            }
+
+            IDebuggerWindowGroup subDebuggerWindowGroup = debuggerWindowGroup.SelectedWindow as IDebuggerWindowGroup;
+            if (subDebuggerWindowGroup != null)
+            {
+                DrawDebuggerWindowGroup(subDebuggerWindowGroup);
+            }
+
+            if (debuggerWindowGroup.SelectedWindow != null)
+            {
+                debuggerWindowGroup.SelectedWindow.OnDraw();
+            }
+        }
+
+        private void DrawDebuggerWindowIcon(int windowId)
+        {
+            GUI.DragWindow(m_DragRect);
+            GUILayout.Space(5);
+            Color32 color = Color.white;
+            m_ConsoleWindow.RefreshCount();
+            if (m_ConsoleWindow.FatalCount > 0)
+            {
+                color = m_ConsoleWindow.GetLogStringColor(LogType.Exception);
+            }
+            else if (m_ConsoleWindow.ErrorCount > 0)
+            {
+                color = m_ConsoleWindow.GetLogStringColor(LogType.Error);
+            }
+            else if (m_ConsoleWindow.WarningCount > 0)
+            {
+                color = m_ConsoleWindow.GetLogStringColor(LogType.Warning);
+            }
+            else
+            {
+                color = m_ConsoleWindow.GetLogStringColor(LogType.Log);
+            }
+
+            string title = string.Format("<color=#{0}{1}{2}{3}><b>FPS: {4}</b></color>", color.r.ToString("x2"), color.g.ToString("x2"), color.b.ToString("x2"), color.a.ToString("x2"), m_FpsCounter.CurrentFps.ToString("F2"));
+            if (GUILayout.Button(title, GUILayout.Width(100f), GUILayout.Height(40f)))
+            {
+                m_ShowFullWindow = true;
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/DebuggerComponent.cs.meta

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

+ 65 - 0
Unity/Assets/Debugger/Component/ScrollableDebuggerWindowBase.cs

@@ -0,0 +1,65 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using GameFramework.Debugger;
+using System;
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public abstract class ScrollableDebuggerWindowBase : IDebuggerWindow
+    {
+        private const float TitleWidth = 240f;
+        private Vector2 m_ScrollPosition = Vector2.zero;
+
+        public virtual void Initialize(params object[] args)
+        {
+
+        }
+
+        public virtual void Shutdown()
+        {
+
+        }
+
+        public virtual void OnEnter()
+        {
+
+        }
+
+        public virtual void OnLeave()
+        {
+
+        }
+
+        public virtual void OnUpdate(float elapseSeconds, float realElapseSeconds)
+        {
+
+        }
+
+        public void OnDraw()
+        {
+            m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition);
+            {
+                OnDrawScrollableWindow();
+            }
+            GUILayout.EndScrollView();
+        }
+
+        protected abstract void OnDrawScrollableWindow();
+
+        protected void DrawItem(string title, string content)
+        {
+            GUILayout.BeginHorizontal();
+            {
+                GUILayout.Label(title, GUILayout.Width(TitleWidth));
+                GUILayout.Label(content);
+            }
+            GUILayout.EndHorizontal();
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Component/ScrollableDebuggerWindowBase.cs.meta

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

+ 9 - 0
Unity/Assets/Debugger/Core.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 67895cb56feafec4da747ba684a11514
+folderAsset: yes
+timeCreated: 1502077007
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 236 - 0
Unity/Assets/Debugger/Core/DebuggerManager.DebuggerWindowGroup.cs

@@ -0,0 +1,236 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using System;
+using System.Collections.Generic;
+
+namespace GameFramework.Debugger
+{
+    internal partial class DebuggerManager
+    {
+        /// <summary>
+        /// 调试窗口组。
+        /// </summary>
+        private sealed class DebuggerWindowGroup : IDebuggerWindowGroup
+        {
+            private readonly List<KeyValuePair<string, IDebuggerWindow>> m_DebuggerWindows;
+            private int m_SelectedIndex;
+            private string[] m_DebuggerWindowNames;
+
+            public DebuggerWindowGroup()
+            {
+                m_DebuggerWindows = new List<KeyValuePair<string, IDebuggerWindow>>();
+                m_SelectedIndex = 0;
+                m_DebuggerWindowNames = null;
+            }
+
+            /// <summary>
+            /// 获取调试窗口数量。
+            /// </summary>
+            public int DebuggerWindowCount
+            {
+                get
+                {
+                    return m_DebuggerWindows.Count;
+                }
+            }
+
+            /// <summary>
+            /// 获取或设置当前选中的调试窗口索引。
+            /// </summary>
+            public int SelectedIndex
+            {
+                get
+                {
+                    return m_SelectedIndex;
+                }
+                set
+                {
+                    m_SelectedIndex = value;
+                }
+            }
+
+            /// <summary>
+            /// 获取当前选中的调试窗口。
+            /// </summary>
+            public IDebuggerWindow SelectedWindow
+            {
+                get
+                {
+                    if (m_SelectedIndex >= m_DebuggerWindows.Count)
+                    {
+                        return null;
+                    }
+
+                    return m_DebuggerWindows[m_SelectedIndex].Value;
+                }
+            }
+
+            /// <summary>
+            /// 初始化调试组。
+            /// </summary>
+            /// <param name="args">初始化调试组参数。</param>
+            public void Initialize(params object[] args)
+            {
+
+            }
+
+            /// <summary>
+            /// 关闭调试组。
+            /// </summary>
+            public void Shutdown()
+            {
+                foreach (KeyValuePair<string, IDebuggerWindow> debuggerWindow in m_DebuggerWindows)
+                {
+                    debuggerWindow.Value.Shutdown();
+                }
+
+                m_DebuggerWindows.Clear();
+            }
+
+            /// <summary>
+            /// 进入调试窗口。
+            /// </summary>
+            public void OnEnter()
+            {
+                SelectedWindow.OnEnter();
+            }
+
+            /// <summary>
+            /// 离开调试窗口。
+            /// </summary>
+            public void OnLeave()
+            {
+                SelectedWindow.OnLeave();
+            }
+
+            /// <summary>
+            /// 调试组轮询。
+            /// </summary>
+            /// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
+            /// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
+            public void OnUpdate(float elapseSeconds, float realElapseSeconds)
+            {
+                SelectedWindow.OnUpdate(elapseSeconds, realElapseSeconds);
+            }
+
+            /// <summary>
+            /// 调试窗口绘制。
+            /// </summary>
+            public void OnDraw()
+            {
+
+            }
+
+            private void RefreshDebuggerWindowNames()
+            {
+                m_DebuggerWindowNames = new string[m_DebuggerWindows.Count];
+                int index = 0;
+                foreach (KeyValuePair<string, IDebuggerWindow> debuggerWindow in m_DebuggerWindows)
+                {
+                    m_DebuggerWindowNames[index++] = debuggerWindow.Key;
+                }
+            }
+
+            /// <summary>
+            /// 获取调试组的调试窗口名称集合。
+            /// </summary>
+            public string[] GetDebuggerWindowNames()
+            {
+                return m_DebuggerWindowNames;
+            }
+
+            /// <summary>
+            /// 获取调试窗口。
+            /// </summary>
+            /// <param name="path">调试窗口路径。</param>
+            /// <returns>要获取的调试窗口。</returns>
+            public IDebuggerWindow GetDebuggerWindow(string path)
+            {
+                if (string.IsNullOrEmpty(path))
+                {
+                    return null;
+                }
+
+                int pos = path.IndexOf('/');
+                if (pos < 0 || pos >= path.Length - 1)
+                {
+                    return InternalGetDebuggerWindow(path);
+                }
+                else
+                {
+                    string debuggerWindowGroupName = path.Substring(0, pos);
+                    string leftPath = path.Substring(pos + 1);
+                    DebuggerWindowGroup debuggerWindowGroup = (DebuggerWindowGroup)InternalGetDebuggerWindow(debuggerWindowGroupName);
+                    if (debuggerWindowGroup == null)
+                    {
+                        return null;
+                    }
+
+                    return debuggerWindowGroup.GetDebuggerWindow(leftPath);
+                }
+            }
+
+            /// <summary>
+            /// 注册调试窗口。
+            /// </summary>
+            /// <param name="path">调试窗口路径。</param>
+            /// <param name="debuggerWindow">要注册的调试窗口。</param>
+            public void RegisterDebuggerWindow(string path, IDebuggerWindow debuggerWindow)
+            {
+                if (string.IsNullOrEmpty(path))
+                {
+                    throw new ArgumentNullException("Path is invalid.");
+                }
+
+                int pos = path.IndexOf('/');
+                if (pos < 0 || pos >= path.Length - 1)
+                {
+                    if (InternalGetDebuggerWindow(path) != null)
+                    {
+                        throw new NotSupportedException("Debugger window has been registered.");
+                    }
+
+                    m_DebuggerWindows.Add(new KeyValuePair<string, IDebuggerWindow>(path, debuggerWindow));
+                    RefreshDebuggerWindowNames();
+                }
+                else
+                {
+                    string debuggerWindowGroupName = path.Substring(0, pos);
+                    string leftPath = path.Substring(pos + 1);
+                    DebuggerWindowGroup debuggerWindowGroup = (DebuggerWindowGroup)InternalGetDebuggerWindow(debuggerWindowGroupName);
+                    if (debuggerWindowGroup == null)
+                    {
+                        if (InternalGetDebuggerWindow(debuggerWindowGroupName) != null)
+                        {
+                            throw new NotSupportedException("Debugger window has been registered, can not create debugger window group.");
+                        }
+
+                        debuggerWindowGroup = new DebuggerWindowGroup();
+                        m_DebuggerWindows.Add(new KeyValuePair<string, IDebuggerWindow>(debuggerWindowGroupName, debuggerWindowGroup));
+                        RefreshDebuggerWindowNames();
+                    }
+
+                    debuggerWindowGroup.RegisterDebuggerWindow(leftPath, debuggerWindow);
+                }
+            }
+
+            private IDebuggerWindow InternalGetDebuggerWindow(string name)
+            {
+                foreach (KeyValuePair<string, IDebuggerWindow> debuggerWindow in m_DebuggerWindows)
+                {
+                    if (debuggerWindow.Key == name)
+                    {
+                        return debuggerWindow.Value;
+                    }
+                }
+
+                return null;
+            }
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Core/DebuggerManager.DebuggerWindowGroup.cs.meta

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

+ 111 - 0
Unity/Assets/Debugger/Core/DebuggerManager.cs

@@ -0,0 +1,111 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using System;
+
+namespace GameFramework.Debugger
+{
+    /// <summary>
+    /// 调试管理器。
+    /// </summary>
+    internal sealed partial class DebuggerManager : IDebuggerManager
+    {
+        private readonly DebuggerWindowGroup m_DebuggerWindowRoot;
+        private bool m_ActiveWindow;
+
+        /// <summary>
+        /// 初始化调试管理器的新实例。
+        /// </summary>
+        public DebuggerManager()
+        {
+            m_DebuggerWindowRoot = new DebuggerWindowGroup();
+            m_ActiveWindow = false;
+        }
+
+        /// <summary>
+        /// 获取或设置调试窗口是否激活。
+        /// </summary>
+        public bool ActiveWindow
+        {
+            get
+            {
+                return m_ActiveWindow;
+            }
+            set
+            {
+                m_ActiveWindow = value;
+            }
+        }
+
+        /// <summary>
+        /// 调试窗口根节点。
+        /// </summary>
+        public IDebuggerWindowGroup DebuggerWindowRoot
+        {
+            get
+            {
+                return m_DebuggerWindowRoot;
+            }
+        }
+
+        /// <summary>
+        /// 调试管理器轮询。
+        /// </summary>
+        /// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
+        /// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
+        internal void Update(float elapseSeconds, float realElapseSeconds)
+        {
+            if (!m_ActiveWindow)
+            {
+                return;
+            }
+
+            m_DebuggerWindowRoot.OnUpdate(elapseSeconds, realElapseSeconds);
+        }
+
+        /// <summary>
+        /// 关闭并清理调试管理器。
+        /// </summary>
+        internal void Shutdown()
+        {
+            m_ActiveWindow = false;
+            m_DebuggerWindowRoot.Shutdown();
+        }
+
+        /// <summary>
+        /// 注册调试窗口。
+        /// </summary>
+        /// <param name="path">调试窗口路径。</param>
+        /// <param name="debuggerWindow">要注册的调试窗口。</param>
+        /// <param name="args">初始化调试窗口参数。</param>
+        public void RegisterDebuggerWindow(string path, IDebuggerWindow debuggerWindow, params object[] args)
+        {
+            if (string.IsNullOrEmpty(path))
+            {
+                throw new ArgumentNullException("Path is invalid.");
+            }
+
+            if (debuggerWindow == null)
+            {
+                throw new ArgumentNullException("Debugger window is invalid.");
+            }
+
+            m_DebuggerWindowRoot.RegisterDebuggerWindow(path, debuggerWindow);
+            debuggerWindow.Initialize(args);
+        }
+
+        /// <summary>
+        /// 获取调试窗口。
+        /// </summary>
+        /// <param name="path">调试窗口路径。</param>
+        /// <returns>要获取的调试窗口。</returns>
+        public IDebuggerWindow GetDebuggerWindow(string path)
+        {
+            return m_DebuggerWindowRoot.GetDebuggerWindow(path);
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Core/DebuggerManager.cs.meta

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

+ 47 - 0
Unity/Assets/Debugger/Core/IDebuggerManager.cs

@@ -0,0 +1,47 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+namespace GameFramework.Debugger
+{
+    /// <summary>
+    /// 调试管理器接口。
+    /// </summary>
+    public interface IDebuggerManager
+    {
+        /// <summary>
+        /// 获取或设置调试窗口是否激活。
+        /// </summary>
+        bool ActiveWindow
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// 调试窗口根节点。
+        /// </summary>
+        IDebuggerWindowGroup DebuggerWindowRoot
+        {
+            get;
+        }
+
+        /// <summary>
+        /// 注册调试窗口。
+        /// </summary>
+        /// <param name="path">调试窗口路径。</param>
+        /// <param name="debuggerWindow">要注册的调试窗口。</param>
+        /// <param name="args">初始化调试窗口参数。</param>
+        void RegisterDebuggerWindow(string path, IDebuggerWindow debuggerWindow, params object[] args);
+
+        /// <summary>
+        /// 获取调试窗口。
+        /// </summary>
+        /// <param name="path">调试窗口路径。</param>
+        /// <returns>要获取的调试窗口。</returns>
+        IDebuggerWindow GetDebuggerWindow(string path);
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Core/IDebuggerManager.cs.meta

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

+ 48 - 0
Unity/Assets/Debugger/Core/IDebuggerWindow.cs

@@ -0,0 +1,48 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+namespace GameFramework.Debugger
+{
+    /// <summary>
+    /// 调试窗口接口。
+    /// </summary>
+    public interface IDebuggerWindow
+    {
+        /// <summary>
+        /// 初始化调试窗口。
+        /// </summary>
+        /// <param name="args">初始化调试窗口参数。</param>
+        void Initialize(params object[] args);
+
+        /// <summary>
+        /// 关闭调试窗口。
+        /// </summary>
+        void Shutdown();
+
+        /// <summary>
+        /// 进入调试窗口。
+        /// </summary>
+        void OnEnter();
+
+        /// <summary>
+        /// 离开调试窗口。
+        /// </summary>
+        void OnLeave();
+
+        /// <summary>
+        /// 调试窗口轮询。
+        /// </summary>
+        /// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
+        /// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
+        void OnUpdate(float elapseSeconds, float realElapseSeconds);
+
+        /// <summary>
+        /// 调试窗口绘制。
+        /// </summary>
+        void OnDraw();
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Core/IDebuggerWindow.cs.meta

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

+ 59 - 0
Unity/Assets/Debugger/Core/IDebuggerWindowGroup.cs

@@ -0,0 +1,59 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+namespace GameFramework.Debugger
+{
+    /// <summary>
+    /// 调试窗口组接口。
+    /// </summary>
+    public interface IDebuggerWindowGroup : IDebuggerWindow
+    {
+        /// <summary>
+        /// 获取调试窗口数量。
+        /// </summary>
+        int DebuggerWindowCount
+        {
+            get;
+        }
+
+        /// <summary>
+        /// 获取或设置当前选中的调试窗口索引。
+        /// </summary>
+        int SelectedIndex
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// 获取当前选中的调试窗口。
+        /// </summary>
+        IDebuggerWindow SelectedWindow
+        {
+            get;
+        }
+
+        /// <summary>
+        /// 获取调试组的调试窗口名称集合。
+        /// </summary>
+        string[] GetDebuggerWindowNames();
+
+        /// <summary>
+        /// 获取调试窗口。
+        /// </summary>
+        /// <param name="path">调试窗口路径。</param>
+        /// <returns>要获取的调试窗口。</returns>
+        IDebuggerWindow GetDebuggerWindow(string path);
+
+        /// <summary>
+        /// 注册调试窗口。
+        /// </summary>
+        /// <param name="path">调试窗口路径。</param>
+        /// <param name="debuggerWindow">要注册的调试窗口。</param>
+        void RegisterDebuggerWindow(string path, IDebuggerWindow debuggerWindow);
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Core/IDebuggerWindowGroup.cs.meta

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

+ 76 - 0
Unity/Assets/Debugger/Debugger.prefab

@@ -0,0 +1,76 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+  m_ObjectHideFlags: 1
+  serializedVersion: 2
+  m_Modification:
+    m_TransformParent: {fileID: 0}
+    m_Modifications: []
+    m_RemovedComponents: []
+  m_ParentPrefab: {fileID: 0}
+  m_RootGameObject: {fileID: 1000370727594500}
+  m_IsPrefabParent: 1
+--- !u!1 &1000370727594500
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 4168516927085660}
+  - component: {fileID: 114156339253392000}
+  m_Layer: 0
+  m_Name: Debugger
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4168516927085660
+Transform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000370727594500}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &114156339253392000
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000370727594500}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f05eaceeebe870a4595e51f998ed518b, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Skin: {fileID: 0}
+  m_ActiveWindow: 0
+  m_ShowFullWindow: 0
+  m_ConsoleWindow:
+    m_LockScroll: 0
+    m_MaxLine: 300
+    m_DateTimeFormat: '[HH:mm:ss.fff] '
+    m_InfoFilter: 1
+    m_WarningFilter: 1
+    m_ErrorFilter: 1
+    m_FatalFilter: 1
+    m_InfoColor:
+      serializedVersion: 2
+      rgba: 4294967295
+    m_WarningColor:
+      serializedVersion: 2
+      rgba: 4278512639
+    m_ErrorColor:
+      serializedVersion: 2
+      rgba: 4278190335
+    m_FatalColor:
+      serializedVersion: 2
+      rgba: 4281545650

+ 9 - 0
Unity/Assets/Debugger/Debugger.prefab.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 5569a93ee9e380c468808683b565b5b9
+timeCreated: 1547019636
+licenseType: Pro
+NativeFormatImporter:
+  mainObjectFileID: 100100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 9 - 0
Unity/Assets/Debugger/Editor.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a808b4433f35c5649a3bea51d300b39b
+folderAsset: yes
+timeCreated: 1502086607
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 56 - 0
Unity/Assets/Debugger/Editor/DebuggerComponentInspector.cs

@@ -0,0 +1,56 @@
+//------------------------------------------------------------
+// Game Framework v3.x
+// Copyright © 2013-2017 Jiang Yin. All rights reserved.
+// Homepage: http://gameframework.cn/
+// Feedback: mailto:jiangyin@gameframework.cn
+//------------------------------------------------------------
+
+using UnityEditor;
+using UnityGameFramework.Runtime;
+
+namespace UnityGameFramework.Editor
+{
+    [CustomEditor(typeof(DebuggerComponent))]
+    internal sealed class DebuggerComponentInspector : UnityEditor.Editor
+    {
+        private SerializedProperty m_Skin = null;
+        private SerializedProperty m_ActiveWindow = null;
+        private SerializedProperty m_ShowFullWindow = null;
+        private SerializedProperty m_ConsoleWindow = null;
+
+        public override void OnInspectorGUI()
+        {
+            serializedObject.Update();
+
+            DebuggerComponent t = (DebuggerComponent)target;
+
+            EditorGUILayout.PropertyField(m_Skin);
+
+            if (EditorApplication.isPlaying && PrefabUtility.GetPrefabType(t.gameObject) != PrefabType.Prefab)
+            {
+                bool activeWindow = EditorGUILayout.Toggle("Active Window", t.ActiveWindow);
+                if (activeWindow != t.ActiveWindow)
+                {
+                    t.ActiveWindow = activeWindow;
+                }
+            }
+            else
+            {
+                EditorGUILayout.PropertyField(m_ActiveWindow);
+            }
+
+            EditorGUILayout.PropertyField(m_ShowFullWindow);
+            EditorGUILayout.PropertyField(m_ConsoleWindow, true);
+
+            serializedObject.ApplyModifiedProperties();
+        }
+
+        private void OnEnable()
+        {
+            m_Skin = serializedObject.FindProperty("m_Skin");
+            m_ActiveWindow = serializedObject.FindProperty("m_ActiveWindow");
+            m_ShowFullWindow = serializedObject.FindProperty("m_ShowFullWindow");
+            m_ConsoleWindow = serializedObject.FindProperty("m_ConsoleWindow");
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Editor/DebuggerComponentInspector.cs.meta

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

+ 9 - 0
Unity/Assets/Debugger/Extension.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 036c00f488d40674282e763b2a67a327
+folderAsset: yes
+timeCreated: 1503303553
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 321 - 0
Unity/Assets/Debugger/Extension/ExampleScene.unity

@@ -0,0 +1,321 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: 0.25
+    backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 8
+  m_Fog: 0
+  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: 0.01
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 0
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+  m_HaloStrength: 0.5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+  m_DefaultReflectionMode: 0
+  m_DefaultReflectionResolution: 128
+  m_ReflectionBounces: 1
+  m_ReflectionIntensity: 1
+  m_CustomReflection: {fileID: 0}
+  m_Sun: {fileID: 0}
+  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 9
+  m_GIWorkflowMode: 1
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_TemporalCoherenceThreshold: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 1
+    m_EnableRealtimeLightmaps: 1
+  m_LightmapEditorSettings:
+    serializedVersion: 8
+    m_Resolution: 2
+    m_BakeResolution: 40
+    m_TextureWidth: 1024
+    m_TextureHeight: 1024
+    m_AO: 0
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 0
+    m_CompAOExponentDirect: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 1
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 1024
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 1
+    m_BakeBackend: 0
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 500
+    m_PVRBounces: 2
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVRFilteringMode: 0
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+    m_PVRFilteringAtrousPositionSigmaIndirect: 2
+    m_PVRFilteringAtrousPositionSigmaAO: 1
+  m_LightingDataAsset: {fileID: 0}
+  m_ShadowMaskMode: 2
+--- !u!196 &4
+NavMeshSettings:
+  serializedVersion: 2
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    serializedVersion: 2
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.4
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666667
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &464394368
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 464394370}
+  - component: {fileID: 464394369}
+  m_Layer: 0
+  m_Name: Directional Light
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!108 &464394369
+Light:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 464394368}
+  m_Enabled: 1
+  serializedVersion: 8
+  m_Type: 1
+  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+  m_Intensity: 1
+  m_Range: 10
+  m_SpotAngle: 30
+  m_CookieSize: 10
+  m_Shadows:
+    m_Type: 2
+    m_Resolution: -1
+    m_CustomResolution: -1
+    m_Strength: 1
+    m_Bias: 0.05
+    m_NormalBias: 0.4
+    m_NearPlane: 0.2
+  m_Cookie: {fileID: 0}
+  m_DrawHalo: 0
+  m_Flare: {fileID: 0}
+  m_RenderMode: 0
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_Lightmapping: 4
+  m_AreaSize: {x: 1, y: 1}
+  m_BounceIntensity: 1
+  m_ColorTemperature: 6570
+  m_UseColorTemperature: 0
+  m_ShadowRadius: 0
+  m_ShadowAngle: 0
+--- !u!4 &464394370
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 464394368}
+  m_LocalRotation: {x: 0.40821794, y: -0.23456973, z: 0.109381676, w: 0.87542605}
+  m_LocalPosition: {x: 0, y: 3, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!1 &1302203896
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1302203901}
+  - component: {fileID: 1302203900}
+  - component: {fileID: 1302203899}
+  - component: {fileID: 1302203898}
+  - component: {fileID: 1302203897}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!81 &1302203897
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1302203896}
+  m_Enabled: 1
+--- !u!124 &1302203898
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1302203896}
+  m_Enabled: 1
+--- !u!92 &1302203899
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1302203896}
+  m_Enabled: 1
+--- !u!20 &1302203900
+Camera:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1302203896}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 2
+  m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0.019607844}
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 0
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 0
+  m_AllowMSAA: 1
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+  m_StereoMirrorMode: 0
+--- !u!4 &1302203901
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1302203896}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1435243990
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 1435243992}
+  - component: {fileID: 1435243991}
+  m_Layer: 0
+  m_Name: Game Framework Debugger
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1435243991
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1435243990}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f05eaceeebe870a4595e51f998ed518b, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Skin: {fileID: 0}
+  m_ActiveWindow: 0
+  m_ShowFullWindow: 1
+  m_ConsoleWindow:
+    m_LockScroll: 1
+    m_MaxLine: 300
+    m_DateTimeFormat: 5b48483a6d6d3a73732e6666665d20
+    m_InfoFilter: 1
+    m_WarningFilter: 1
+    m_ErrorFilter: 1
+    m_FatalFilter: 1
+    m_InfoColor: {}
+    m_WarningColor: {}
+    m_ErrorColor: {}
+    m_FatalColor: {}
+--- !u!4 &1435243992
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1435243990}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

+ 8 - 0
Unity/Assets/Debugger/Extension/ExampleScene.unity.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e063e47d4298df048b27b394777e33e7
+timeCreated: 1503303164
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 21 - 0
Unity/Assets/Debugger/Extension/ExampleWindow.cs

@@ -0,0 +1,21 @@
+using UnityEngine;
+
+namespace UnityGameFramework.Runtime
+{
+    public class ExampleWindow : ScrollableDebuggerWindowBase
+    {
+        protected override void OnDrawScrollableWindow()
+        {
+            GUILayout.Label("<b>Example</b>");
+            GUILayout.BeginVertical("box");
+            {
+                GUILayout.BeginHorizontal();
+                {
+                    GUILayout.Label("This is an example.");
+                }
+                GUILayout.EndHorizontal();
+            }
+            GUILayout.EndVertical();
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Extension/ExampleWindow.cs.meta

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

+ 10 - 0
Unity/Assets/Debugger/Extension/ExtensionWindow.cs

@@ -0,0 +1,10 @@
+namespace UnityGameFramework.Runtime
+{
+    public partial class DebuggerComponent
+    {
+        public void RegisterExtensionWindows()
+        {
+            RegisterDebuggerWindow("EXAMPLE", new ExampleWindow());
+        }
+    }
+}

+ 12 - 0
Unity/Assets/Debugger/Extension/ExtensionWindow.cs.meta

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

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Client/MusicSound.meta → Unity/Assets/Res/Fonts.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 36659f29776b0a747bfca74cfd2730c4
+guid: 13a2bca85e4a34c4a83edd993d77224c
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 8 - 0
Unity/Assets/Res/Fonts/addscore.meta

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

+ 22 - 0
Unity/Assets/Res/Fonts/addscore/atlas_qinghaidig_common_addscore.tpsheet

@@ -0,0 +1,22 @@
+#
+# Sprite sheet data for Unity.
+#
+# To import these sprites into your Unity project, download "TexturePackerImporter":
+# http://www.codeandweb.com/texturepacker/unity
+#
+# Sprite sheet: atlas_qinghaidig_common_addscore.png (132 x 256)
+# $TexturePacker:SmartUpdate:1cd806efd2eaa9a9d2615460af0dce5b:3a85e72a38dea553ea25eadb46eaa9f7:978df7a359822cfaf7fff69b0dbbe7ab$
+#
+
+addscore_0;60;207;45;49;0.5;0.5
+addscore_1;91;63;28;49;0.5;0.5
+addscore_2;46;105;43;49;0.5;0.5
+addscore_3;0;93;43;49;0.5;0.5
+addscore_4;60;156;45;49;0.5;0.5
+addscore_5;45;54;43;49;0.5;0.5
+addscore_6;0;42;43;49;0.5;0.5
+addscore_7;45;3;43;49;0.5;0.5
+addscore_8;0;144;44;49;0.5;0.5
+addscore_9;90;12;42;49;0.5;0.5
+addscore_F;0;195;58;61;0.5;0.5
+addscore_J;91;114;33;40;0.5;0.5

+ 7 - 0
Unity/Assets/Res/Fonts/addscore/atlas_qinghaidig_common_addscore.tpsheet.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: cb1d433a415e9b342bec0e5fc04c8e90
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: fontaltas.unity3d
+  assetBundleVariant: 

+ 221 - 0
Unity/Assets/Res/Fonts/addscore/mjaddscore.fontsettings

@@ -0,0 +1,221 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!128 &12800000
+Font:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_Name: mjaddscore
+  serializedVersion: 5
+  m_LineSpacing: 0.1
+  m_DefaultMaterial: {fileID: 2100000, guid: 041838b2e9b116944bab42dce8666ddb, type: 2}
+  m_FontSize: 0
+  m_Texture: {fileID: 0}
+  m_AsciiStartOffset: 0
+  m_Tracking: 1
+  m_CharacterSpacing: 0
+  m_CharacterPadding: 1
+  m_ConvertCase: 0
+  m_CharacterRects:
+  - serializedVersion: 2
+    index: 48
+    uv:
+      serializedVersion: 2
+      x: 0.45454547
+      y: 0.80859375
+      width: 0.3409091
+      height: 0.19140625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 45
+      height: -49
+    advance: 45
+    flipped: 0
+  - serializedVersion: 2
+    index: 49
+    uv:
+      serializedVersion: 2
+      x: 0.68939394
+      y: 0.24609375
+      width: 0.21212119
+      height: 0.19140625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 28
+      height: -49
+    advance: 28
+    flipped: 0
+  - serializedVersion: 2
+    index: 50
+    uv:
+      serializedVersion: 2
+      x: 0.34848484
+      y: 0.41015625
+      width: 0.3257576
+      height: 0.19140625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 43
+      height: -49
+    advance: 43
+    flipped: 0
+  - serializedVersion: 2
+    index: 51
+    uv:
+      serializedVersion: 2
+      x: 0
+      y: 0.36328125
+      width: 0.32575756
+      height: 0.19140625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 43
+      height: -49
+    advance: 43
+    flipped: 0
+  - serializedVersion: 2
+    index: 52
+    uv:
+      serializedVersion: 2
+      x: 0.45454547
+      y: 0.609375
+      width: 0.3409091
+      height: 0.19140625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 45
+      height: -49
+    advance: 45
+    flipped: 0
+  - serializedVersion: 2
+    index: 53
+    uv:
+      serializedVersion: 2
+      x: 0.3409091
+      y: 0.2109375
+      width: 0.3257576
+      height: 0.19140625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 43
+      height: -49
+    advance: 43
+    flipped: 0
+  - serializedVersion: 2
+    index: 54
+    uv:
+      serializedVersion: 2
+      x: 0
+      y: 0.1640625
+      width: 0.32575756
+      height: 0.19140625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 43
+      height: -49
+    advance: 43
+    flipped: 0
+  - serializedVersion: 2
+    index: 55
+    uv:
+      serializedVersion: 2
+      x: 0.3409091
+      y: 0.01171875
+      width: 0.3257576
+      height: 0.19140625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 43
+      height: -49
+    advance: 43
+    flipped: 0
+  - serializedVersion: 2
+    index: 56
+    uv:
+      serializedVersion: 2
+      x: 0
+      y: 0.5625
+      width: 0.33333334
+      height: 0.19140625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 44
+      height: -49
+    advance: 44
+    flipped: 0
+  - serializedVersion: 2
+    index: 57
+    uv:
+      serializedVersion: 2
+      x: 0.6818182
+      y: 0.046875
+      width: 0.3181818
+      height: 0.19140625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 42
+      height: -49
+    advance: 42
+    flipped: 0
+  - serializedVersion: 2
+    index: 70
+    uv:
+      serializedVersion: 2
+      x: 0
+      y: 0.76171875
+      width: 0.43939394
+      height: 0.23828125
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 30
+      width: 58
+      height: -61
+    advance: 58
+    flipped: 0
+  - serializedVersion: 2
+    index: 74
+    uv:
+      serializedVersion: 2
+      x: 0.68939394
+      y: 0.4453125
+      width: 0.25
+      height: 0.15625
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 20
+      width: 33
+      height: -40
+    advance: 33
+    flipped: 0
+  m_KerningValues: []
+  m_PixelScale: 0.1
+  m_FontData: 
+  m_Ascent: 0
+  m_Descent: 0
+  m_DefaultStyle: 0
+  m_FontNames: []
+  m_FallbackFonts: []
+  m_FontRenderingMode: 0
+  m_UseLegacyBoundsCalculation: 0

+ 8 - 0
Unity/Assets/Res/Fonts/addscore/mjaddscore.fontsettings.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: be045ab1a1f3a3d428cbe7b06c106165
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 12800000
+  userData: 
+  assetBundleName: fontaltas.unity3d
+  assetBundleVariant: 

+ 27 - 0
Unity/Assets/Res/Fonts/addscore/mjaddscore.mat

@@ -0,0 +1,27 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_Name: mjaddscore
+  m_Shader: {fileID: 10101, guid: 0000000000000000e000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 05a3216654c470a46b441bb020d7f4dd, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats: []
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}

+ 8 - 0
Unity/Assets/Res/Fonts/addscore/mjaddscore.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 041838b2e9b116944bab42dce8666ddb
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: fontaltas.unity3d
+  assetBundleVariant: 

BIN
Unity/Assets/Res/Fonts/addscore/mjaddscore.png


+ 459 - 0
Unity/Assets/Res/Fonts/addscore/mjaddscore.png.meta

@@ -0,0 +1,459 @@
+fileFormatVersion: 2
+guid: 05a3216654c470a46b441bb020d7f4dd
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 21300000
+    second: addscore_0
+  - first:
+      213: 21300002
+    second: addscore_1
+  - first:
+      213: 21300004
+    second: addscore_2
+  - first:
+      213: 21300006
+    second: addscore_3
+  - first:
+      213: 21300008
+    second: addscore_4
+  - first:
+      213: 21300010
+    second: addscore_5
+  - first:
+      213: 21300012
+    second: addscore_6
+  - first:
+      213: 21300014
+    second: addscore_7
+  - first:
+      213: 21300016
+    second: addscore_8
+  - first:
+      213: 21300018
+    second: addscore_9
+  - first:
+      213: 21300020
+    second: addscore_F
+  - first:
+      213: 21300022
+    second: addscore_J
+  externalObjects: {}
+  serializedVersion: 12
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 2
+  spriteExtrude: 1
+  spriteMeshType: 0
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 1
+  cookieLightType: 1
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 1
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 1
+  - serializedVersion: 3
+    buildTarget: Server
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 1
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 1
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 1
+  - serializedVersion: 3
+    buildTarget: WebGL
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 1
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: addscore_0
+      rect:
+        serializedVersion: 2
+        x: 60
+        y: 207
+        width: 45
+        height: 49
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: 02305410000000000800000000000000
+      internalID: 21300000
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_1
+      rect:
+        serializedVersion: 2
+        x: 91
+        y: 63
+        width: 28
+        height: 49
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: 22305410000000000800000000000000
+      internalID: 21300002
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_2
+      rect:
+        serializedVersion: 2
+        x: 46
+        y: 105
+        width: 43
+        height: 49
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: 42305410000000000800000000000000
+      internalID: 21300004
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_3
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 93
+        width: 43
+        height: 49
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: 62305410000000000800000000000000
+      internalID: 21300006
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_4
+      rect:
+        serializedVersion: 2
+        x: 60
+        y: 156
+        width: 45
+        height: 49
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: 82305410000000000800000000000000
+      internalID: 21300008
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_5
+      rect:
+        serializedVersion: 2
+        x: 45
+        y: 54
+        width: 43
+        height: 49
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: a2305410000000000800000000000000
+      internalID: 21300010
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_6
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 42
+        width: 43
+        height: 49
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: c2305410000000000800000000000000
+      internalID: 21300012
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_7
+      rect:
+        serializedVersion: 2
+        x: 45
+        y: 3
+        width: 43
+        height: 49
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: e2305410000000000800000000000000
+      internalID: 21300014
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_8
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 144
+        width: 44
+        height: 49
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: 03305410000000000800000000000000
+      internalID: 21300016
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_9
+      rect:
+        serializedVersion: 2
+        x: 90
+        y: 12
+        width: 42
+        height: 49
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: 23305410000000000800000000000000
+      internalID: 21300018
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_F
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 195
+        width: 58
+        height: 61
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: 43305410000000000800000000000000
+      internalID: 21300020
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    - serializedVersion: 2
+      name: addscore_J
+      rect:
+        serializedVersion: 2
+        x: 91
+        y: 114
+        width: 33
+        height: 40
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: -1
+      bones: []
+      spriteID: 63305410000000000800000000000000
+      internalID: 21300022
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable:
+      addscore_6: 21300012
+      addscore_0: 21300000
+      addscore_2: 21300004
+      addscore_4: 21300008
+      addscore_7: 21300014
+      addscore_1: 21300002
+      addscore_3: 21300006
+      addscore_9: 21300018
+      addscore_5: 21300010
+      addscore_F: 21300020
+      addscore_J: 21300022
+      addscore_8: 21300016
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: fontaltas.unity3d
+  assetBundleVariant: 

+ 8 - 0
Unity/Assets/Res/Fonts/subscore.meta

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

+ 22 - 0
Unity/Assets/Res/Fonts/subscore/atlas_qinghaidig_common_subscore.tpsheet

@@ -0,0 +1,22 @@
+#
+# Sprite sheet data for Unity.
+#
+# To import these sprites into your Unity project, download "TexturePackerImporter":
+# http://www.codeandweb.com/texturepacker/unity
+#
+# Sprite sheet: atlas_qinghaidig_common_subscore.png (248 x 100)
+# $TexturePacker:SmartUpdate:b855f20e41044f59fc0a324ec01318c3:8722d75fbe28b8bdc5fadc172fb7f756:c6427f7e4b100a15f033aa05cc46d452$
+#
+
+subscore_0;0;51;45;49;0.5;0.5
+subscore_1;183;51;28;49;0.5;0.5
+subscore_2;47;0;43;49;0.5;0.5
+subscore_3;92;0;43;49;0.5;0.5
+subscore_4;0;0;45;49;0.5;0.5
+subscore_5;93;51;43;49;0.5;0.5
+subscore_6;137;0;43;49;0.5;0.5
+subscore_7;138;51;43;49;0.5;0.5
+subscore_8;47;51;44;49;0.5;0.5
+subscore_9;182;0;42;49;0.5;0.5
+subscore_A;213;58;35;42;0.5;0.5
+subscore_J;226;42;20;14;0.5;0.5

+ 7 - 0
Unity/Assets/Res/Fonts/subscore/atlas_qinghaidig_common_subscore.tpsheet.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a539fa4c63ca2e9439222a2aacbda778
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: fontaltas.unity3d
+  assetBundleVariant: 

+ 221 - 0
Unity/Assets/Res/Fonts/subscore/mjsubscore.fontsettings

@@ -0,0 +1,221 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!128 &12800000
+Font:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_Name: mjsubscore
+  serializedVersion: 5
+  m_LineSpacing: 0.1
+  m_DefaultMaterial: {fileID: 2100000, guid: c3700ac8593807c4fac1305e848a9459, type: 2}
+  m_FontSize: 0
+  m_Texture: {fileID: 0}
+  m_AsciiStartOffset: 0
+  m_Tracking: 1
+  m_CharacterSpacing: 0
+  m_CharacterPadding: 1
+  m_ConvertCase: 0
+  m_CharacterRects:
+  - serializedVersion: 2
+    index: 48
+    uv:
+      serializedVersion: 2
+      x: 0
+      y: 0.51
+      width: 0.18145162
+      height: 0.49
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 45
+      height: -49
+    advance: 45
+    flipped: 0
+  - serializedVersion: 2
+    index: 49
+    uv:
+      serializedVersion: 2
+      x: 0.73790324
+      y: 0.51
+      width: 0.11290324
+      height: 0.49
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 28
+      height: -49
+    advance: 28
+    flipped: 0
+  - serializedVersion: 2
+    index: 50
+    uv:
+      serializedVersion: 2
+      x: 0.18951613
+      y: 0
+      width: 0.17338711
+      height: 0.49
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 43
+      height: -49
+    advance: 43
+    flipped: 0
+  - serializedVersion: 2
+    index: 51
+    uv:
+      serializedVersion: 2
+      x: 0.37096775
+      y: 0
+      width: 0.17338711
+      height: 0.49
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 43
+      height: -49
+    advance: 43
+    flipped: 0
+  - serializedVersion: 2
+    index: 52
+    uv:
+      serializedVersion: 2
+      x: 0
+      y: 0
+      width: 0.18145162
+      height: 0.49
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 45
+      height: -49
+    advance: 45
+    flipped: 0
+  - serializedVersion: 2
+    index: 53
+    uv:
+      serializedVersion: 2
+      x: 0.375
+      y: 0.51
+      width: 0.17338711
+      height: 0.49
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 43
+      height: -49
+    advance: 43
+    flipped: 0
+  - serializedVersion: 2
+    index: 54
+    uv:
+      serializedVersion: 2
+      x: 0.55241936
+      y: 0
+      width: 0.17338711
+      height: 0.49
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 43
+      height: -49
+    advance: 43
+    flipped: 0
+  - serializedVersion: 2
+    index: 55
+    uv:
+      serializedVersion: 2
+      x: 0.5564516
+      y: 0.51
+      width: 0.17338711
+      height: 0.49
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 43
+      height: -49
+    advance: 43
+    flipped: 0
+  - serializedVersion: 2
+    index: 56
+    uv:
+      serializedVersion: 2
+      x: 0.18951613
+      y: 0.51
+      width: 0.17741936
+      height: 0.49
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 44
+      height: -49
+    advance: 44
+    flipped: 0
+  - serializedVersion: 2
+    index: 57
+    uv:
+      serializedVersion: 2
+      x: 0.733871
+      y: 0
+      width: 0.1693548
+      height: 0.49
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 24
+      width: 42
+      height: -49
+    advance: 42
+    flipped: 0
+  - serializedVersion: 2
+    index: 65
+    uv:
+      serializedVersion: 2
+      x: 0.858871
+      y: 0.58
+      width: 0.14112902
+      height: 0.42000002
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 21
+      width: 35
+      height: -42
+    advance: 35
+    flipped: 0
+  - serializedVersion: 2
+    index: 74
+    uv:
+      serializedVersion: 2
+      x: 0.91129035
+      y: 0.42
+      width: 0.080645144
+      height: 0.14000002
+    vert:
+      serializedVersion: 2
+      x: 0
+      y: 7
+      width: 20
+      height: -14
+    advance: 20
+    flipped: 0
+  m_KerningValues: []
+  m_PixelScale: 0.1
+  m_FontData: 
+  m_Ascent: 0
+  m_Descent: 0
+  m_DefaultStyle: 0
+  m_FontNames: []
+  m_FallbackFonts: []
+  m_FontRenderingMode: 0
+  m_UseLegacyBoundsCalculation: 0

+ 8 - 0
Unity/Assets/Res/Fonts/subscore/mjsubscore.fontsettings.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1b33779893891c548bfc44f6ad2cd366
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 12800000
+  userData: 
+  assetBundleName: fontaltas.unity3d
+  assetBundleVariant: 

+ 27 - 0
Unity/Assets/Res/Fonts/subscore/mjsubscore.mat

@@ -0,0 +1,27 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_Name: mjsubscore
+  m_Shader: {fileID: 10101, guid: 0000000000000000e000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 4a3dcbc2764479349bf600a50228bbf5, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats: []
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}

+ 8 - 0
Unity/Assets/Res/Fonts/subscore/mjsubscore.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c3700ac8593807c4fac1305e848a9459
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: fontaltas.unity3d
+  assetBundleVariant: 

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