Jelajahi Sumber

使用ILRuntime 加入热更新机制, C#代码热更新, 并且对其封装,使用起来你根本感觉不到自己使用了ILRuntime

tanghai 9 tahun lalu
induk
melakukan
e47fb8cd84
100 mengubah file dengan 4625 tambahan dan 10 penghapusan
  1. 4 0
      README
  2. 1 1
      Server/Hotfix/Component/RealmGateAddressComponent.cs
  3. 1 1
      Server/Model/Component/AppManagerComponent.cs
  4. 1 1
      Server/Model/Component/GateSessionKeyComponent.cs
  5. 1 1
      Server/Model/Component/OptionComponent.cs
  6. 1 1
      Server/Model/Component/StartConfigComponent.cs
  7. 1 1
      Server/Model/Component/Unit/LockComponent.cs
  8. 1 1
      Server/Model/Component/Unit/MasterComponent.cs
  9. 13 1
      Server/Model/Helper/DllHelper.cs
  10. 12 0
      Server/Model/Server.Model.csproj
  11. 9 0
      Unity/Assets/Bundles.meta
  12. 9 0
      Unity/Assets/Bundles/UI.meta
  13. 1077 0
      Unity/Assets/Bundles/UI/Lobby.prefab
  14. 8 0
      Unity/Assets/Bundles/UI/Lobby.prefab.meta
  15. 9 0
      Unity/Assets/Editor/ILRuntimeEditor.meta
  16. 45 0
      Unity/Assets/Editor/ILRuntimeEditor/ILRuntimeEditor.cs
  17. 2 2
      Unity/Assets/Editor/ILRuntimeEditor/ILRuntimeEditor.cs.meta
  18. 9 0
      Unity/Assets/Editor/SDKPorter.meta
  19. 49 0
      Unity/Assets/Editor/SDKPorter/ShareSDK.projmods
  20. 8 0
      Unity/Assets/Editor/SDKPorter/ShareSDK.projmods.meta
  21. 136 0
      Unity/Assets/Editor/SDKPorter/ShareSDKPostProcessBuild.cs
  22. 12 0
      Unity/Assets/Editor/SDKPorter/ShareSDKPostProcessBuild.cs.meta
  23. 59 0
      Unity/Assets/Editor/SDKPorter/XCPlist.cs
  24. 12 0
      Unity/Assets/Editor/SDKPorter/XCPlist.cs.meta
  25. 9 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor.meta
  26. TEMPAT SAMPAH
      Unity/Assets/Editor/SDKPorter/XCodeEditor/ICSharpCode.SharpZipLib.dll
  27. 24 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/ICSharpCode.SharpZipLib.dll.meta
  28. 22 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/LICENSE
  29. 6 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/LICENSE.meta
  30. 127 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXBuildFile.cs
  31. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXBuildFile.cs.meta
  32. 137 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXBuildPhase.cs
  33. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXBuildPhase.cs.meta
  34. 55 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXDictionary.cs
  35. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXDictionary.cs.meta
  36. 127 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXFileReference.cs
  37. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXFileReference.cs.meta
  38. 166 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXGroup.cs
  39. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXGroup.cs.meta
  40. 27 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXList.cs
  41. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXList.cs.meta
  42. 160 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXObject.cs
  43. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXObject.cs.meta
  44. 392 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXParser.cs
  45. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXParser.cs.meta
  46. 23 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXProject.cs
  47. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXProject.cs.meta
  48. 83 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/Readme.mdown
  49. 6 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/Readme.mdown.meta
  50. 233 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCBuildConfiguration.cs
  51. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCBuildConfiguration.cs.meta
  52. 16 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCConfigurationList.cs
  53. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCConfigurationList.cs.meta
  54. 15 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCFileOperationQueue.cs
  55. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCFileOperationQueue.cs.meta
  56. 130 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCMod.cs
  57. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCMod.cs.meta
  58. 750 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCProject.cs
  59. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCProject.cs.meta
  60. 15 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCSourceFile.cs
  61. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCSourceFile.cs.meta
  62. 15 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCTarget.cs
  63. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCTarget.cs.meta
  64. 97 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCodeEditorMenu.cs
  65. 10 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/XCodeEditorMenu.cs.meta
  66. 103 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/ZipHelper.cs
  67. 12 0
      Unity/Assets/Editor/SDKPorter/XCodeEditor/ZipHelper.cs.meta
  68. TEMPAT SAMPAH
      Unity/Assets/Editor/ShareSDK For Unity3D支持一键打包功能须知.docx
  69. 8 0
      Unity/Assets/Editor/ShareSDK For Unity3D支持一键打包功能须知.docx.meta
  70. 2 0
      Unity/Assets/ILRuntime/ILRuntime/Runtime/CLRBinding/BindingCodeGenerator.cs
  71. 7 0
      Unity/Assets/Plugins/Android.meta
  72. 19 0
      Unity/Assets/Plugins/Android/ShareSDK.meta
  73. 80 0
      Unity/Assets/Plugins/Android/ShareSDK/AndroidManifest.xml
  74. 6 0
      Unity/Assets/Plugins/Android/ShareSDK/AndroidManifest.xml.meta
  75. 7 0
      Unity/Assets/Plugins/Android/ShareSDK/libs.meta
  76. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/DemoCallback.jar
  77. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/DemoCallback.jar.meta
  78. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/MobCommons-2016.1222.1756.jar
  79. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/MobCommons-2016.1222.1756.jar.meta
  80. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/MobTools-2016.1222.1756.jar
  81. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/MobTools-2016.1222.1756.jar.meta
  82. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/OneKeyShare.jar
  83. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/OneKeyShare.jar.meta
  84. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/SSDKU3D.jar
  85. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/SSDKU3D.jar.meta
  86. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-2.8.0.jar
  87. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-2.8.0.jar.meta
  88. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-Core-2.8.0.jar
  89. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-Core-2.8.0.jar.meta
  90. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-Moments-2.8.0.jar
  91. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-Moments-2.8.0.jar.meta
  92. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Core-2.8.0.jar
  93. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Core-2.8.0.jar.meta
  94. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Douban-2.8.0.jar
  95. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Douban-2.8.0.jar.meta
  96. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Dropbox-2.8.0.jar
  97. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Dropbox-2.8.0.jar.meta
  98. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Email-2.8.0.jar
  99. 8 0
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Email-2.8.0.jar.meta
  100. TEMPAT SAMPAH
      Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Evernote-2.8.0.jar

+ 4 - 0
README

@@ -1,3 +1,7 @@
+更新:
+2017-2-17: 使用ILRuntime提供Unity C#代码热更新支持,并且抹平了Mono层和ILRuntime层差异,使用起来风格与原来用法保持一致, 扔掉你的lua代码吧!
+
+
 ET框架:一个Unity客户端和分布式游戏服务器框架
 
 无缝大世界功能正在开发

+ 1 - 1
Server/Hotfix/Component/RealmGateAddressComponent.cs

@@ -2,7 +2,7 @@
 
 namespace Hotfix
 {
-	[EntityEvent(typeof(RealmGateAddressComponent))]
+	[EntityEvent(EntityEventId.RealmGateAddressComponent)]
 	public static class RealmGateAddressComponentE
 	{
 		public static void Awake(this RealmGateAddressComponent component)

+ 1 - 1
Server/Model/Component/AppManagerComponent.cs

@@ -6,7 +6,7 @@ using Base;
 
 namespace Model
 {
-	[EntityEvent(typeof(AppManagerComponent))]
+	[EntityEvent(EntityEventId.AppManagerComponent)]
 	public class AppManagerComponent: Component
 	{
 		private readonly Dictionary<int, Process> processes = new Dictionary<int, Process>();

+ 1 - 1
Server/Model/Component/GateSessionKeyComponent.cs

@@ -3,7 +3,7 @@ using Base;
 
 namespace Model
 {
-	[EntityEvent(typeof(GateSessionKeyComponent))]
+	[EntityEvent(EntityEventId.GateSessionKeyComponent)]
 	public class GateSessionKeyComponent : Component
 	{
 		private TimerComponent timerComponent;

+ 1 - 1
Server/Model/Component/OptionComponent.cs

@@ -3,7 +3,7 @@ using CommandLine;
 
 namespace Model
 {
-	[EntityEvent(typeof(OptionComponent))]
+	[EntityEvent(EntityEventId.OptionComponent)]
 	public class OptionComponent : Component
 	{
 		public Options Options { get; } = new Options();

+ 1 - 1
Server/Model/Component/StartConfigComponent.cs

@@ -5,7 +5,7 @@ using Base;
 
 namespace Model
 {
-	[EntityEvent(typeof(StartConfigComponent))]
+	[EntityEvent(EntityEventId.StartConfigComponent)]
 	public class StartConfigComponent: Component
 	{
 		private readonly List<StartConfig> allConfigs = new List<StartConfig>();

+ 1 - 1
Server/Model/Component/Unit/LockComponent.cs

@@ -15,7 +15,7 @@ namespace Model
 	/// <summary>
 	/// 分布式锁组件,Unit对象可能在不同进程上有镜像,访问该对象的时候需要对他加锁
 	/// </summary>
-	[EntityEvent(typeof(LockComponent))]
+	[EntityEvent(EntityEventId.LockComponent)]
 	public class LockComponent: Component
 	{
 		private LockStatus status = LockStatus.LockedNot;

+ 1 - 1
Server/Model/Component/Unit/MasterComponent.cs

@@ -16,7 +16,7 @@ namespace Model
 		}
 	}
 
-	[EntityEvent(typeof(MasterComponent))]
+	[EntityEvent(EntityEventId.MasterComponent)]
 	public class MasterComponent : Component
 	{
 		/// 镜像的地址

+ 13 - 1
Server/Model/Helper/DllHelper.cs

@@ -1,4 +1,6 @@
-using System.IO;
+using System;
+using System.Collections.Generic;
+using System.IO;
 using System.Reflection;
 
 namespace Model
@@ -16,5 +18,15 @@ namespace Model
 			Assembly assembly = Assembly.Load(dllBytes, pdbBytes);
 			return assembly;
 		}
+
+		public static Type[] GetBaseTypes()
+		{
+			List<Type> types = new List<Type>();
+			foreach (Assembly assembly in Game.EntityEventManager.GetAssemblies())
+			{
+				types.AddRange(assembly.GetTypes());
+			}
+			return types.ToArray();
+		}
 	}
 }

+ 12 - 0
Server/Model/Server.Model.csproj

@@ -188,6 +188,18 @@
     <Compile Include="..\..\Unity\Assets\Scripts\Object\Object.cs">
       <Link>Object\Object.cs</Link>
     </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Other\EntityEventId.cs">
+      <Link>Other\EntityEventId.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Other\IInstanceMethod.cs">
+      <Link>Other\IInstanceMethod.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Other\ILBindingAttribute.cs">
+      <Link>Other\ILBindingAttribute.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Other\MonoMethod.cs">
+      <Link>Other\MonoMethod.cs</Link>
+    </Compile>
     <Compile Include="..\..\Unity\Assets\Scripts\Other\Options.cs">
       <Link>Other\Options.cs</Link>
     </Compile>

+ 9 - 0
Unity/Assets/Bundles.meta

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

+ 9 - 0
Unity/Assets/Bundles/UI.meta

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

+ 1077 - 0
Unity/Assets/Bundles/UI/Lobby.prefab

@@ -0,0 +1,1077 @@
+%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: 1000012140906046}
+  m_IsPrefabParent: 1
+--- !u!1 &1000010279990180
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000013306138686}
+  - 222: {fileID: 222000011260852292}
+  - 114: {fileID: 114000010075827648}
+  m_Layer: 5
+  m_Name: Return
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000010282139360
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000014261888288}
+  - 222: {fileID: 222000013767965188}
+  - 114: {fileID: 114000013938780624}
+  m_Layer: 5
+  m_Name: JoinRoom
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000010654722068
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000013995298894}
+  - 222: {fileID: 222000012286557312}
+  - 114: {fileID: 114000010390865150}
+  m_Layer: 5
+  m_Name: CreateRoom
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000010768706392
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000011127377422}
+  - 222: {fileID: 222000013477738492}
+  - 114: {fileID: 114000010018025894}
+  m_Layer: 5
+  m_Name: NameText
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000011046193616
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000014161230184}
+  m_Layer: 5
+  m_Name: Top
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000011264437648
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000010483783062}
+  - 222: {fileID: 222000013340801768}
+  - 114: {fileID: 114000012146228554}
+  m_Layer: 5
+  m_Name: NameBackground
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000011265503640
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000012493826100}
+  - 222: {fileID: 222000011891353488}
+  - 114: {fileID: 114000013049634718}
+  m_Layer: 5
+  m_Name: Gold
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000011463022836
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000012987451432}
+  - 222: {fileID: 222000014108952078}
+  - 114: {fileID: 114000013879378286}
+  m_Layer: 5
+  m_Name: Message
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000011988625458
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000013013133024}
+  - 222: {fileID: 222000010502849886}
+  - 114: {fileID: 114000010861932684}
+  m_Layer: 5
+  m_Name: More
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000012140906046
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000011433140006}
+  - 222: {fileID: 222000012393644854}
+  - 114: {fileID: 114000012430220302}
+  - 114: {fileID: 114000011231987512}
+  m_Layer: 5
+  m_Name: Lobby
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000012273643160
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000012832612498}
+  - 222: {fileID: 222000012472650716}
+  - 114: {fileID: 114000014225496034}
+  m_Layer: 5
+  m_Name: Kefu
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000013234089386
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000011685909774}
+  - 222: {fileID: 222000011206635248}
+  - 114: {fileID: 114000010640523976}
+  m_Layer: 5
+  m_Name: TouXiang
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000013273220736
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000010797904966}
+  - 222: {fileID: 222000010352788246}
+  - 114: {fileID: 114000010748204300}
+  - 114: {fileID: 114000012242520322}
+  m_Layer: 5
+  m_Name: ChongZhi
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000013579230402
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000012180277534}
+  - 222: {fileID: 222000011102980374}
+  - 114: {fileID: 114000012921558084}
+  m_Layer: 5
+  m_Name: BaoShi
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1000014196117232
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 4
+  m_Component:
+  - 224: {fileID: 224000012899174416}
+  - 222: {fileID: 222000012435440532}
+  - 114: {fileID: 114000013580934710}
+  m_Layer: 5
+  m_Name: Setting
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &114000010018025894
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010768706392}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 14
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 10
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: New Text
+--- !u!114 &114000010075827648
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010279990180}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: bcf5a192069e38542b8c1cd35b1fe323, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000010390865150
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010654722068}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: dcf85c2c02c070840ad89c01ff585fee, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000010640523976
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000013234089386}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: 947920d233348974a8cd50a4b8d8ddbb, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000010748204300
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000013273220736}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: 4ad538720a369ac42af17ac58ff8fc8f, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000010861932684
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011988625458}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: ab5ce638ab9b84d40a60c476e4307323, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000011231987512
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000012140906046}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 502d8cafd6a5a0447ab1db9a24cdcb10, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  data:
+  - key: CreateRoom
+    gameObject: {fileID: 1000010654722068}
+  - key: JoinRoom
+    gameObject: {fileID: 1000010282139360}
+--- !u!114 &114000012146228554
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011264437648}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: b25933244996151439a4138f5ecd44a9, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000012242520322
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000013273220736}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    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_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_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 114000010748204300}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+      Culture=neutral, PublicKeyToken=null
+--- !u!114 &114000012430220302
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000012140906046}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 0.392}
+  m_RaycastTarget: 0
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: 310c3376e6a94304f9348de3e3591d4b, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000012921558084
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000013579230402}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: 78f8e9d7ac314424a8d1472310240f59, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000013049634718
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011265503640}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: 771f3bcab43a15c41a5a932faf5e0845, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000013580934710
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000014196117232}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: fb93f0536483525498b6ff6dc25f6475, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000013879378286
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011463022836}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: 90684046d60017b4f8f46be35cab853a, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000013938780624
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010282139360}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: 09f10c2eecc124145bccba1947baeea1, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114000014225496034
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000012273643160}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 21300000, guid: d40bfa065c6fb4241950116f7efbe756, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!222 &222000010352788246
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000013273220736}
+--- !u!222 &222000010502849886
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011988625458}
+--- !u!222 &222000011102980374
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000013579230402}
+--- !u!222 &222000011206635248
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000013234089386}
+--- !u!222 &222000011260852292
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010279990180}
+--- !u!222 &222000011891353488
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011265503640}
+--- !u!222 &222000012286557312
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010654722068}
+--- !u!222 &222000012393644854
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000012140906046}
+--- !u!222 &222000012435440532
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000014196117232}
+--- !u!222 &222000012472650716
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000012273643160}
+--- !u!222 &222000013340801768
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011264437648}
+--- !u!222 &222000013477738492
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010768706392}
+--- !u!222 &222000013767965188
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010282139360}
+--- !u!222 &222000014108952078
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011463022836}
+--- !u!224 &224000010483783062
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011264437648}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5, z: 9.350306}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children:
+  - {fileID: 224000011127377422}
+  m_Father: {fileID: 224000014161230184}
+  m_RootOrder: 8
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -825, y: 383}
+  m_SizeDelta: {x: 122, y: 33}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000010797904966
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000013273220736}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 0.9999999}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000012493826100}
+  m_RootOrder: 0
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0.795, y: 0.04}
+  m_SizeDelta: {x: 0.7, y: 0.32}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000011127377422
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010768706392}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000010483783062}
+  m_RootOrder: 0
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 1.14, y: 0.31}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000011433140006
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000012140906046}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children:
+  - {fileID: 224000013995298894}
+  - {fileID: 224000014261888288}
+  - {fileID: 224000014161230184}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000011685909774
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000013234089386}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5, z: 9.3503065}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000014161230184}
+  m_RootOrder: 3
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -824.99994, y: 467}
+  m_SizeDelta: {x: 76, y: 76}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000012180277534
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000013579230402}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000014161230184}
+  m_RootOrder: 7
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -164, y: 463}
+  m_SizeDelta: {x: 172, y: 48}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000012493826100
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011265503640}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children:
+  - {fileID: 224000010797904966}
+  m_Father: {fileID: 224000014161230184}
+  m_RootOrder: 6
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -555, y: 467}
+  m_SizeDelta: {x: 242, y: 48}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000012832612498
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000012273643160}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000014161230184}
+  m_RootOrder: 2
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 506, y: 456}
+  m_SizeDelta: {x: 76, y: 71}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000012899174416
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000014196117232}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000014161230184}
+  m_RootOrder: 0
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 146, y: 455}
+  m_SizeDelta: {x: 76, y: 71}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000012987451432
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011463022836}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000014161230184}
+  m_RootOrder: 1
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 321.99997, y: 456}
+  m_SizeDelta: {x: 76, y: 71}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000013013133024
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011988625458}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000014161230184}
+  m_RootOrder: 4
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 684, y: 455}
+  m_SizeDelta: {x: 76, y: 71}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000013306138686
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010279990180}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5, z: 9.350306}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000014161230184}
+  m_RootOrder: 5
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 866, y: 459}
+  m_SizeDelta: {x: 76, y: 71}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000013995298894
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010654722068}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000011433140006}
+  m_RootOrder: 0
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -345, y: -7}
+  m_SizeDelta: {x: 289, y: 392}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000014161230184
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000011046193616}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children:
+  - {fileID: 224000012899174416}
+  - {fileID: 224000012987451432}
+  - {fileID: 224000012832612498}
+  - {fileID: 224000011685909774}
+  - {fileID: 224000013013133024}
+  - {fileID: 224000013306138686}
+  - {fileID: 224000012493826100}
+  - {fileID: 224000012180277534}
+  - {fileID: 224000010483783062}
+  m_Father: {fileID: 224000011433140006}
+  m_RootOrder: 2
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224000014261888288
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1000010282139360}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.5, y: 1.5000001, z: 1}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 224000011433140006}
+  m_RootOrder: 1
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 344, y: 0}
+  m_SizeDelta: {x: 289, y: 392}
+  m_Pivot: {x: 0.5, y: 0.5}

+ 8 - 0
Unity/Assets/Bundles/UI/Lobby.prefab.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ff8cd026c365b524ca9429d49f88f14d
+timeCreated: 1487236049
+licenseType: Pro
+NativeFormatImporter:
+  userData: 
+  assetBundleName: uilobby.unity3d
+  assetBundleVariant: 

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

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

+ 45 - 0
Unity/Assets/Editor/ILRuntimeEditor/ILRuntimeEditor.cs

@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using Base;
+using Model;
+using UnityEditor;
+
+namespace MyEditor
+{
+	public class ILRuntimeEditor: EditorWindow
+	{
+		[MenuItem("ILRuntime/Generate CLR Binding Code")]
+		static void GenerateCLRBinding()
+		{
+			List<Type> types = new List<Type>();
+			//在List中添加你想进行CLR绑定的类型
+			types.Add(typeof(int));
+			types.Add(typeof(float));
+			types.Add(typeof(long));
+			types.Add(typeof(object));
+			types.Add(typeof(string));
+			types.Add(typeof(Console));
+			types.Add(typeof(Array));
+			types.Add(typeof(Dictionary<string, int>));
+			types.Add(typeof(Type));
+			//所有ILRuntime中的类型,实际上在C#运行时中都是ILRuntime.Runtime.Intepreter.ILTypeInstance的实例,
+			//因此List<A> List<B>,如果A与B都是ILRuntime中的类型,只需要添加List<ILRuntime.Runtime.Intepreter.ILTypeInstance>即可
+			types.Add(typeof(Dictionary<ILRuntime.Runtime.Intepreter.ILTypeInstance, int>));
+
+			Assembly assemby = Game.EntityEventManager.GetAssembly("Model");
+			foreach (Type type in assemby.GetTypes())
+			{
+				if (type.GetCustomAttributes(typeof (ILBindingAttribute), false).Length == 0)
+				{
+					continue;
+				}
+				Log.Info(type.FullName);
+				types.Add(type);
+			}
+
+			//第二个参数为自动生成的代码保存在何处
+			ILRuntime.Runtime.CLRBinding.BindingCodeGenerator.GenerateBindingCode(types, "Assets/Scripts/ILGenerated");
+		}
+	}
+}

+ 2 - 2
Unity/Assets/Scripts/Component/ILRuntimeComponent.cs.meta → Unity/Assets/Editor/ILRuntimeEditor/ILRuntimeEditor.cs.meta

@@ -1,6 +1,6 @@
 fileFormatVersion: 2
-guid: d83d443700c93f549aaa52af4da20fa8
-timeCreated: 1486633782
+guid: 4f89b17b4dee4c54f94c32795da5820e
+timeCreated: 1487212456
 licenseType: Pro
 MonoImporter:
   serializedVersion: 2

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

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 31ad3e35a36e74ca29946bc821b85d2b
+folderAsset: yes
+timeCreated: 1470294472
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 49 - 0
Unity/Assets/Editor/SDKPorter/ShareSDK.projmods

@@ -0,0 +1,49 @@
+{
+    "group":       "ShareSDK",
+    "libs":        [],
+    "frameworks":  ["ImageIO.framework",
+                    "MessageUI.framework",
+                    "JavaScriptCore.framework",
+                    ],
+    "zips":         ["ShareSDK.zip"],                
+    "headerpaths": [],
+    "librarypaths": [],
+    "files":       ["ShareSDK/ShareSDK.framework",
+                    "ShareSDK/Support/Required/MOBFoundation.framework",
+                    "ShareSDK/Support/Required/ShareSDKConnector.framework",
+                    "ShareSDK/Support/Optional/ShareSDKExtension.framework",
+                    "ShareSDK/Support/Optional/ShareSDKUI.framework",
+                    "ShareSDK/Support/Optional/ShareSDKConfigFile.framework",
+                    "ShareSDK/Support/PlatformConnector/AliPayConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/CopyConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/EvernoteConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/FacebookConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/GooglePlusConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/InstagramConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/InstapaperConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/KakaoConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/LineConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/MailConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/PrintConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/QQConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/RenrenConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/SinaWeiboConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/SMSConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/WechatConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/WhatsAppConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/YiXinConnector.framework",
+                    "ShareSDK/Support/PlatformConnector/DingTalkConnector.framework",
+                    "ShareSDK/Support/PlatformSDK/FacebookMessengerSDK/FBSDKMessengerShareKit.framework",
+                    "ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework",
+                    "ShareSDK/Support/PlatformSDK/RenRenSDK/RennSDK.framework",
+                    "ShareSDK/Support/PlatformSDK/KaKaoSDK/KakaoOpenSDK.framework",
+                    "ShareSDK/Support/PlatformSDK/DingTalkSDK/DTShareKit.framework"],
+    "folders":     [],
+    "buildSettings": { 
+        "OTHER_LDFLAGS" : ["-ObjC",
+                           "-lsqlite3.0",
+                           "-lz",
+                           "licucore"]
+    },
+    "excludes":    ["^.*.meta$", "^.*.mdown^", "^.*.pdf$"]
+}

+ 8 - 0
Unity/Assets/Editor/SDKPorter/ShareSDK.projmods.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cb6cd777710dd4c049fb0c3e4e918148
+timeCreated: 1471246132
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 136 - 0
Unity/Assets/Editor/SDKPorter/ShareSDKPostProcessBuild.cs

@@ -0,0 +1,136 @@
+using UnityEngine;
+using UnityEditor;
+using UnityEditor.Callbacks;
+using System.Collections;
+using cn.sharesdk.unity3d.sdkporter;
+using System.IO;
+
+
+public static class ShareSDKPostProcessBuild {
+	//[PostProcessBuild]
+	[PostProcessBuildAttribute(88)]
+	public static void onPostProcessBuild(BuildTarget target,string targetPath){
+		string unityEditorAssetPath = Application.dataPath;
+
+		if (target != BuildTarget.iOS) {
+			Debug.LogWarning ("Target is not iPhone. XCodePostProcess will not run");
+			return;
+		}
+
+		XCProject project = new XCProject (targetPath);
+		//var files = System.IO.Directory.GetFiles( unityEditorAssetPath, "*.projmods", System.IO.SearchOption.AllDirectories );
+		var files = System.IO.Directory.GetFiles( unityEditorAssetPath + "/Editor/SDKPorter", "*.projmods", System.IO.SearchOption.AllDirectories);
+		foreach( var file in files ) {
+			project.ApplyMod( file );
+		}
+
+		//如需要预配置Xocode中的URLScheme 和 白名单,请打开下两行代码,并自行配置相关键值
+		string projPath = Path.GetFullPath (targetPath);
+		EditInfoPlist (projPath);
+
+
+		//Finally save the xcode project
+		project.Save();
+
+	}
+
+	private static void EditInfoPlist(string projPath){
+
+		XCPlist plist = new XCPlist (projPath);
+
+		//URL Scheme 添加
+		string PlistAdd = @"  
+            <key>CFBundleURLTypes</key>
+			<array>
+				<dict>
+					<key>CFBundleURLSchemes</key>
+					<array>
+						<string>dingoanxyrpiscaovl4qlw</string>
+					</array>
+					<key>CFBundleURLName</key>
+					<string>dingtalk</string>
+				</dict>
+				<dict>
+					<key>CFBundleURLSchemes</key>
+					<array>
+						<string>ap2015072400185895</string>
+					</array>
+					<key>CFBundleURLName</key>
+					<string>alipayShare</string>
+				</dict>
+				<dict>
+					<key>CFBundleURLSchemes</key>
+					<array>
+					<string>vk5312801</string>
+					<string>yx0d9a9f9088ea44d78680f3274da1765f</string>
+					<string>pin4797078908495202393</string>
+					<string>kakao48d3f524e4a636b08d81b3ceb50f1003</string>
+					<string>pdk4797078908495202393</string>
+					<string>tb2QUXqO9fcgGdtGG1FcvML6ZunIQzAEL8xY6hIaxdJnDti2DYwM</string>
+					<string>com.mob.demoShareSDK</string>
+					<string>rm226427com.mob.demoShareSDK</string>
+					<string>pocketapp1234</string>
+					<string>QQ05FB8B52</string>
+					<string>wx4868b35061f87885</string>
+					<string>tencent100371282</string>
+					<string>fb107704292745179</string>
+					<string>wb568898243</string>
+					</array>
+				</dict>
+			</array>";
+
+		//白名单添加
+		string LSAdd = @"
+		<key>LSApplicationQueriesSchemes</key>
+			<array>
+			<string>dingtalk-open</string>
+			<string>dingtalk</string>
+			<string>mqqopensdkapiV4</string>
+			<string>weibosdk</string>
+			<string>sinaweibohd</string>
+			<string>sinaweibo</string>
+			<string>vkauthorize</string>
+			<string>fb-messenger</string>
+			<string>yixinfav</string>
+			<string>yixinoauth</string>
+			<string>yixinopenapi</string>
+			<string>yixin</string>
+			<string>pinit</string>
+			<string>kakaolink</string>
+			<string>kakao48d3f524e4a636b08d81b3ceb50f1003</string>
+			<string>alipay</string>
+			<string>storykompassauth</string>
+			<string>pinterestsdk.v1</string>
+			<string>kakaokompassauth</string>
+			<string>alipayshare</string>
+			<string>pinit</string>
+			<string>line</string>
+			<string>whatsapp</string>
+			<string>mqqwpa</string>
+			<string>instagram</string>
+			<string>fbauth2</string>
+			<string>renren</string>
+			<string>renrenios</string>
+			<string>renrenapi</string>
+			<string>rm226427com.mob.demoShareSDK</string>
+			<string>mqq</string>
+			<string>mqqopensdkapiV2</string>
+			<string>mqqopensdkapiV3</string>
+			<string>wtloginmqq2</string>
+			<string>mqqapi</string>
+			<string>mqqOpensdkSSoLogin</string>
+			<string>sinaweibohdsso</string>
+			<string>sinaweibosso</string>
+			<string>wechat</string>
+			<string>weixin</string>
+		</array>";
+
+
+		//在plist里面增加一行
+		plist.AddKey(PlistAdd);
+		plist.AddKey (LSAdd);
+		plist.Save();
+	}
+
+
+}

+ 12 - 0
Unity/Assets/Editor/SDKPorter/ShareSDKPostProcessBuild.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 52c8293a5aac445bcaa44077cf8ef857
+timeCreated: 1471246135
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 59 - 0
Unity/Assets/Editor/SDKPorter/XCPlist.cs

@@ -0,0 +1,59 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+    public partial class XCPlist : System.IDisposable
+    {
+
+		private string filePath;
+		List<string> contents = new List<string>();
+		public XCPlist(string fPath)
+		{
+            filePath = Path.Combine( fPath, "info.plist" );
+            if( !System.IO.File.Exists( filePath ) ) {
+                Debug.LogError( filePath +"路径下文件不存在" );
+			    return;
+			}
+
+            FileInfo projectFileInfo = new FileInfo( filePath );
+			StreamReader sr = projectFileInfo.OpenText();
+			while (sr.Peek() >= 0) 
+			{
+				contents.Add(sr.ReadLine());
+			}
+			sr.Close();
+
+		}
+		public void AddKey(string key)
+		{
+				if(contents.Count < 2)
+						return;
+				contents.Insert(contents.Count - 2,key);
+
+		}
+
+		public void ReplaceKey(string key,string replace){
+			for(int i = 0;i < contents.Count;i++){
+					if(contents[i].IndexOf(key) != -1){
+							contents[i] = contents[i].Replace(key,replace);
+					}
+			}
+		}
+
+		public void Save()
+		{
+            StreamWriter saveFile = File.CreateText(filePath);
+			foreach(string line in contents)
+					saveFile.WriteLine(line);
+			saveFile.Close();
+    	}
+
+		public void Dispose()
+		{
+
+		}
+    }
+}

+ 12 - 0
Unity/Assets/Editor/SDKPorter/XCPlist.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 13c181aada65a4affa874687c91ffe28
+timeCreated: 1471246135
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 9 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 47cfba800344a46e9976cf99c65e928d
+folderAsset: yes
+timeCreated: 1471246132
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Editor/SDKPorter/XCodeEditor/ICSharpCode.SharpZipLib.dll


+ 24 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/ICSharpCode.SharpZipLib.dll.meta

@@ -0,0 +1,24 @@
+fileFormatVersion: 2
+guid: 11c6d205e5de6469c8508bdfd3800e59
+timeCreated: 1480761375
+licenseType: Free
+PluginImporter:
+  serializedVersion: 1
+  iconMap: {}
+  executionOrder: {}
+  isPreloaded: 0
+  platformData:
+    Any:
+      enabled: 0
+      settings: {}
+    Editor:
+      enabled: 1
+      settings:
+        DefaultValueInitialized: true
+    WindowsStoreApps:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 22 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/LICENSE

@@ -0,0 +1,22 @@
+Copyright (c) 2012 Daniele Cariola
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.

+ 6 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/LICENSE.meta

@@ -0,0 +1,6 @@
+fileFormatVersion: 2
+guid: efd071e8beb084c7dbc945f03e3e9f6c
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 127 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXBuildFile.cs

@@ -0,0 +1,127 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class PBXBuildFile : PBXObject
+	{
+		private const string FILE_REF_KEY = "fileRef";
+		private const string SETTINGS_KEY = "settings";
+		private const string ATTRIBUTES_KEY = "ATTRIBUTES";
+		private const string WEAK_VALUE = "Weak";
+		private const string COMPILER_FLAGS_KEY = "COMPILER_FLAGS";
+		
+		public PBXBuildFile( PBXFileReference fileRef, bool weak = false ) : base()
+		{
+			
+			this.Add( FILE_REF_KEY, fileRef.guid );
+			SetWeakLink( weak );
+
+//    def Create(cls, file_ref, weak=False):
+//        if isinstance(file_ref, PBXFileReference):
+//            file_ref = file_ref.id
+//
+//        bf = cls()
+//        bf.id = cls.GenerateId()
+//        bf['fileRef'] = file_ref
+//
+//        if weak:
+//            bf.set_weak_link(True)
+//
+//        return bf
+		}
+		
+		public PBXBuildFile( string guid, PBXDictionary dictionary ) : base ( guid, dictionary )
+		{
+//			Debug.Log( "constructor child" );
+		}
+		
+		public bool SetWeakLink( bool weak = false )
+		{
+			PBXDictionary settings = null;
+			PBXList attributes = null;
+			
+			if( !_data.ContainsKey( SETTINGS_KEY ) ) {
+				if( weak ) {
+					attributes = new PBXList();
+					attributes.Add( WEAK_VALUE );
+					
+					settings = new PBXDictionary();
+					settings.Add( ATTRIBUTES_KEY, attributes );
+					_data[ SETTINGS_KEY ] = settings;
+				}
+				return true;
+			}
+			
+			settings = _data[ SETTINGS_KEY ] as PBXDictionary;
+			if( !settings.ContainsKey( ATTRIBUTES_KEY ) ) {
+				if( weak ) {
+					attributes = new PBXList();
+					attributes.Add( WEAK_VALUE );
+					settings.Add( ATTRIBUTES_KEY, attributes );
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				attributes = settings[ ATTRIBUTES_KEY ] as PBXList;
+			}
+			
+			if( weak ) {
+				attributes.Add( WEAK_VALUE );
+			}
+			else {
+				attributes.Remove( WEAK_VALUE );
+			}
+			
+			settings.Add( ATTRIBUTES_KEY, attributes );
+			this.Add( SETTINGS_KEY, settings );
+			
+			return true;
+		}
+		
+		public bool AddCompilerFlag( string flag )
+		{
+			if( !_data.ContainsKey( SETTINGS_KEY ) )
+				_data[ SETTINGS_KEY ] = new PBXDictionary();
+			
+			if( !((PBXDictionary)_data[ SETTINGS_KEY ]).ContainsKey( COMPILER_FLAGS_KEY ) ) {
+				((PBXDictionary)_data[ SETTINGS_KEY ]).Add( COMPILER_FLAGS_KEY, flag );
+				return true;
+			}
+			
+			string[] flags = ((string)((PBXDictionary)_data[ SETTINGS_KEY ])[ COMPILER_FLAGS_KEY ]).Split( ' ' );
+			foreach( string item in flags ) {
+				if( item.CompareTo( flag ) == 0 )
+					return false;
+			}
+			
+			((PBXDictionary)_data[ SETTINGS_KEY ])[ COMPILER_FLAGS_KEY ] = ( string.Join( " ", flags ) + " " + flag );
+			return true;
+			
+//		def add_compiler_flag(self, flag):
+//        k_settings = 'settings'
+//        k_attributes = 'COMPILER_FLAGS'
+//
+//        if not self.has_key(k_settings):
+//            self[k_settings] = PBXDict()
+//
+//        if not self[k_settings].has_key(k_attributes):
+//            self[k_settings][k_attributes] = flag
+//            return True
+//
+//        flags = self[k_settings][k_attributes].split(' ')
+//
+//        if flag in flags:
+//            return False
+//
+//        flags.append(flag)
+//
+//        self[k_settings][k_attributes] = ' '.join(flags)
+		}
+		
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXBuildFile.cs.meta

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

+ 137 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXBuildPhase.cs

@@ -0,0 +1,137 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class PBXBuildPhase : PBXObject
+	{
+		protected const string FILES_KEY = "files";
+		
+		public PBXBuildPhase() :base()
+		{
+//			Debug.Log( "base" );
+		}
+		
+		public PBXBuildPhase( string guid, PBXDictionary dictionary ) : base ( guid, dictionary )
+		{
+//			Debug.Log( "constructor " + GetType().Name );
+		}
+		
+		public bool AddBuildFile( PBXBuildFile file )
+		{
+//			if( ((string)file[ ISA_KEY ]).CompareTo( "PBXBuildFile" ) != 0 )
+//				return false;
+//			Debug.Log( "--> buildphase " + (string)_data[ ISA_KEY ] );
+			
+			
+			if( !ContainsKey( FILES_KEY ) ){
+//				Debug.Log( "key not present" );
+				this.Add( FILES_KEY, new PBXList() );
+			}
+//			Debug.Log( "key: " + _data[ FILES_KEY ] );
+//			Debug.Log( "Adding: " + file.guid );
+			((PBXList)_data[ FILES_KEY ]).Add( file.guid );
+//			if( ((PBXList)_data[ FILES_KEY ]).Contains( file.guid ) ) {
+//				Debug.Log( "AGGIUNTO" );
+//			}
+//			else {
+//				Debug.Log( "MANCA" );
+//			}
+			
+			return true;
+		}
+		
+		public void RemoveBuildFile( string id )
+		{
+			if( !ContainsKey( FILES_KEY ) ) {
+				this.Add( FILES_KEY, new PBXList() );
+				return;
+			}
+			
+			((PBXList)_data[ FILES_KEY ]).Remove( id );
+		}
+		
+		public bool HasBuildFile( string id )
+		{
+			if( !ContainsKey( FILES_KEY ) ) {
+				this.Add( FILES_KEY, new PBXList() );
+				return false;
+			}
+			
+			if( !IsGuid( id ) )
+				return false;
+			
+			return ((PBXList)_data[ FILES_KEY ]).Contains( id );
+		}
+		
+//	class PBXBuildPhase(PBXObject):
+//    def add_build_file(self, bf):
+//        if bf.get('isa') != 'PBXBuildFile':
+//            return False
+//
+//        if not self.has_key('files'):
+//            self['files'] = PBXList()
+//
+//        self['files'].add(bf.id)
+//
+//        return True
+//
+//    def remove_build_file(self, id):
+//        if not self.has_key('files'):
+//            self['files'] = PBXList()
+//            return
+//
+//        self['files'].remove(id)
+//
+//    def has_build_file(self, id):
+//        if not self.has_key('files'):
+//            self['files'] = PBXList()
+//            return False
+//
+//        if not PBXObject.IsGuid(id):
+//            id = id.id
+//
+//        return id in self['files']
+	}
+	
+	public class PBXFrameworksBuildPhase : PBXBuildPhase
+	{
+		public PBXFrameworksBuildPhase( string guid, PBXDictionary dictionary ) : base ( guid, dictionary )
+		{
+//			Debug.Log( "constructor child" + GetType().Name );
+		}
+	}
+
+	public class PBXResourcesBuildPhase : PBXBuildPhase
+	{
+		public PBXResourcesBuildPhase( string guid, PBXDictionary dictionary ) : base ( guid, dictionary )
+		{
+//			Debug.Log( "constructor child" + GetType().Name );
+		}
+	}
+
+	public class PBXShellScriptBuildPhase : PBXBuildPhase
+	{
+		public PBXShellScriptBuildPhase( string guid, PBXDictionary dictionary ) : base ( guid, dictionary )
+		{
+//			Debug.Log( "constructor child" + GetType().Name );
+		}
+	}
+
+	public class PBXSourcesBuildPhase : PBXBuildPhase
+	{
+		public PBXSourcesBuildPhase( string guid, PBXDictionary dictionary ) : base ( guid, dictionary )
+		{
+//			Debug.Log( "constructor child" + GetType().Name );
+		}
+	}
+
+	public class PBXCopyFilesBuildPhase : PBXBuildPhase
+	{
+		public PBXCopyFilesBuildPhase( string guid, PBXDictionary dictionary ) : base ( guid, dictionary )
+		{
+//			Debug.Log( "constructor child" + GetType().Name );
+		}
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXBuildPhase.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 45e20ea7193b74e02b784077e774b23f
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 55 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXDictionary.cs

@@ -0,0 +1,55 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class PBXDictionary : Dictionary<string, object>
+	{
+		
+		public void Append( PBXDictionary dictionary )
+		{
+			foreach( var item in dictionary) {
+				this.Add( item.Key, item.Value );
+			}
+		}
+		
+		public void Append<T>( PBXDictionary<T> dictionary ) where T : PBXObject
+		{
+			foreach( var item in dictionary) {
+				this.Add( item.Key, item.Value );
+			}
+		}
+	}
+	
+	public class PBXDictionary<T> : Dictionary<string, T> where T : PBXObject
+	{
+		public PBXDictionary()
+		{
+			
+		}
+		
+		public PBXDictionary( PBXDictionary genericDictionary )
+		{
+			foreach( KeyValuePair<string, object> currentItem in genericDictionary ) {
+				if( ((string)((PBXDictionary)currentItem.Value)[ "isa" ]).CompareTo( typeof(T).Name ) == 0 ) {
+					T instance = (T)System.Activator.CreateInstance( typeof(T), currentItem.Key, (PBXDictionary)currentItem.Value );
+					this.Add( currentItem.Key, instance );
+				}
+			}	
+		}
+		
+		public void Add( T newObject )
+		{
+			this.Add( newObject.guid, newObject );
+		}
+		
+		public void Append( PBXDictionary<T> dictionary )
+		{
+			foreach( KeyValuePair<string, T> item in dictionary) {
+				this.Add( item.Key, (T)item.Value );
+			}
+		}
+		
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXDictionary.cs.meta

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

+ 127 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXFileReference.cs

@@ -0,0 +1,127 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class PBXFileReference : PBXObject
+	{
+		protected const string PATH_KEY = "path";
+		protected const string NAME_KEY = "name";
+		protected const string SOURCETREE_KEY = "sourceTree";
+		protected const string EXPLICIT_FILE_TYPE_KEY = "explicitFileType";
+		protected const string LASTKNOWN_FILE_TYPE_KEY = "lastKnownFileType";
+		protected const string ENCODING_KEY = "fileEncoding";
+		
+		public string buildPhase;
+		public readonly Dictionary<TreeEnum, string> trees = new Dictionary<TreeEnum, string> {
+			{ TreeEnum.ABSOLUTE, "<absolute>" },
+			{ TreeEnum.GROUP, "<group>" },
+			{ TreeEnum.BUILT_PRODUCTS_DIR, "BUILT_PRODUCTS_DIR" },
+        	{ TreeEnum.DEVELOPER_DIR, "DEVELOPER_DIR" },
+        	{ TreeEnum.SDKROOT, "SDKROOT" },
+        	{ TreeEnum.SOURCE_ROOT, "SOURCE_ROOT" }
+		};
+		
+		public static readonly Dictionary<string, string> typeNames = new Dictionary<string, string> {
+			{ ".a", "archive.ar" },
+			{ ".app", "wrapper.application" },
+			{ ".s", "sourcecode.asm" },
+			{ ".c", "sourcecode.c.c" },
+			{ ".cpp", "sourcecode.cpp.cpp" },
+			{ ".framework", "wrapper.framework" },
+			{ ".h", "sourcecode.c.h" },
+			{ ".icns", "image.icns" },
+			{ ".m", "sourcecode.c.objc" },
+			{ ".mm", "sourcecode.cpp.objcpp" },
+			{ ".nib", "wrapper.nib" },
+			{ ".plist", "text.plist.xml" },
+			{ ".png", "image.png" },
+			{ ".rtf", "text.rtf" },
+			{ ".tiff", "image.tiff" },
+			{ ".txt", "text" },
+			{ ".xcodeproj", "wrapper.pb-project" },
+			{ ".xib", "file.xib" },
+			{ ".strings", "text.plist.strings" },
+			{ ".bundle", "wrapper.plug-in" },
+			{ ".dylib", "compiled.mach-o.dylib" }
+   		 };
+		
+		public static readonly Dictionary<string, string> typePhases = new Dictionary<string, string> {
+			{ ".a", "PBXFrameworksBuildPhase" },
+			{ ".app", null },
+			{ ".s", "PBXSourcesBuildPhase" },
+			{ ".c", "PBXSourcesBuildPhase" },
+			{ ".cpp", "PBXSourcesBuildPhase" },
+			{ ".framework", "PBXFrameworksBuildPhase" },
+			{ ".h", null },
+			{ ".icns", "PBXResourcesBuildPhase" },
+			{ ".m", "PBXSourcesBuildPhase" },
+			{ ".mm", "PBXSourcesBuildPhase" },
+			{ ".nib", "PBXResourcesBuildPhase" },
+			{ ".plist", "PBXResourcesBuildPhase" },
+			{ ".png", "PBXResourcesBuildPhase" },
+			{ ".rtf", "PBXResourcesBuildPhase" },
+			{ ".tiff", "PBXResourcesBuildPhase" },
+			{ ".txt", "PBXResourcesBuildPhase" },
+			{ ".xcodeproj", null },
+			{ ".xib", "PBXResourcesBuildPhase" },
+			{ ".strings", "PBXResourcesBuildPhase" },
+			{ ".bundle", "PBXResourcesBuildPhase" },
+			{ ".dylib", "PBXFrameworksBuildPhase" }
+    	};
+		
+		public PBXFileReference( string guid, PBXDictionary dictionary ) : base( guid, dictionary )
+		{
+			
+		}
+		
+		public PBXFileReference( string filePath, TreeEnum tree = TreeEnum.SOURCE_ROOT ) : base()
+		{
+			this.Add( PATH_KEY, filePath );
+			this.Add( NAME_KEY, System.IO.Path.GetFileName( filePath ) );
+			this.Add( SOURCETREE_KEY, (string)( System.IO.Path.IsPathRooted( filePath ) ? trees[TreeEnum.ABSOLUTE] : trees[tree] ) );
+			this.GuessFileType();
+		}
+		
+		public string name {
+			get {
+				if( !ContainsKey( NAME_KEY ) ) {
+					return null;
+				}
+				return (string)_data[NAME_KEY];
+			}
+		}
+		
+		private void GuessFileType()
+		{
+			this.Remove( EXPLICIT_FILE_TYPE_KEY );
+			this.Remove( LASTKNOWN_FILE_TYPE_KEY );
+			string extension = System.IO.Path.GetExtension( (string)_data[ PATH_KEY ] );
+			if( !PBXFileReference.typeNames.ContainsKey( extension ) ){
+//				Debug.LogWarning( "Unknown file extension: " + extension + "\nPlease add extension and Xcode type to PBXFileReference.types" );
+				return;
+			}
+			
+			this.Add( LASTKNOWN_FILE_TYPE_KEY, PBXFileReference.typeNames[ extension ] );
+			this.buildPhase = PBXFileReference.typePhases[ extension ];
+		}
+		
+		private void SetFileType( string fileType )
+		{
+			this.Remove( EXPLICIT_FILE_TYPE_KEY );
+			this.Remove( LASTKNOWN_FILE_TYPE_KEY );
+			
+			this.Add( EXPLICIT_FILE_TYPE_KEY, fileType );
+		}
+	}
+	
+	public enum TreeEnum {
+		ABSOLUTE,
+        GROUP,
+        BUILT_PRODUCTS_DIR,
+        DEVELOPER_DIR,
+        SDKROOT,
+        SOURCE_ROOT
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXFileReference.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 2792ed7b2a30d40c199e8e27ebf39ccf
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 166 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXGroup.cs

@@ -0,0 +1,166 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class PBXGroup : PBXObject
+	{
+		protected const string NAME_KEY = "name";
+		protected const string CHILDREN_KEY = "children";
+		protected const string PATH_KEY = "path";
+		protected const string SOURCETREE_KEY = "sourceTree";
+		
+		#region Constructor
+		
+		public PBXGroup( string name, string path = null, string tree = "SOURCE_ROOT" ) : base()
+		{	
+			this.Add( NAME_KEY, name );
+			this.Add( CHILDREN_KEY, new PBXList() );
+			
+			if( path != null ) {
+				this.Add( PATH_KEY, path );
+				this.Add( SOURCETREE_KEY, tree );
+			}
+			else {
+				this.Add( SOURCETREE_KEY, "<group>" );
+			}
+		}
+		
+		public PBXGroup( string guid, PBXDictionary dictionary ) : base( guid, dictionary )
+		{
+			
+		}
+		
+		#endregion
+		#region Properties
+		
+		public string name {
+			get {
+				if( !ContainsKey( NAME_KEY ) ) {
+					return null;
+				}
+				return (string)_data[NAME_KEY];
+			}
+		}
+		
+		public PBXList children {
+			get {
+				if( !ContainsKey( CHILDREN_KEY ) ) {
+					this.Add( CHILDREN_KEY, new PBXList() );
+				}
+				return (PBXList)_data[CHILDREN_KEY];
+			}
+		}
+		
+		public string path {
+			get {
+				if( !ContainsKey( PATH_KEY ) ) {
+					return null;
+				}
+				return (string)_data[PATH_KEY];
+			}
+		}
+		
+		public string sourceTree {
+			get {
+				return (string)_data[SOURCETREE_KEY];
+			}
+		}
+		
+		#endregion
+		
+		
+		public string AddChild( PBXObject child )
+		{
+			if( child is PBXFileReference || child is PBXGroup ) {
+				children.Add( child.guid );
+				return child.guid;
+			}
+				
+			return null;
+		}
+		
+		public void RemoveChild( string id )
+		{
+			if( !IsGuid( id ) )
+				return;
+			
+			children.Remove( id );
+		}
+		
+		public bool HasChild( string id )
+		{
+			if( !ContainsKey( CHILDREN_KEY ) ) {
+				this.Add( CHILDREN_KEY, new PBXList() );
+				return false;
+			}
+			
+			if( !IsGuid( id ) )
+				return false;
+			
+			return ((PBXList)_data[ CHILDREN_KEY ]).Contains( id );
+		}
+		
+		public string GetName()
+		{
+			return (string)_data[ NAME_KEY ];
+		}
+		
+//	class PBXGroup(PBXObject):
+//    def add_child(self, ref):
+//        if not isinstance(ref, PBXDict):
+//            return None
+//
+//        isa = ref.get('isa')
+//
+//        if isa != 'PBXFileReference' and isa != 'PBXGroup':
+//            return None
+//
+//        if not self.has_key('children'):
+//            self['children'] = PBXList()
+//
+//        self['children'].add(ref.id)
+//
+//        return ref.id
+//
+//    def remove_child(self, id):
+//        if not self.has_key('children'):
+//            self['children'] = PBXList()
+//            return
+//
+//        if not PBXObject.IsGuid(id):
+//            id = id.id
+//
+//        self['children'].remove(id)
+//
+//    def has_child(self, id):
+//        if not self.has_key('children'):
+//            self['children'] = PBXList()
+//            return False
+//
+//        if not PBXObject.IsGuid(id):
+//            id = id.id
+//
+//        return id in self['children']
+//
+//    def get_name(self):
+//        path_name = os.path.split(self.get('path',''))[1]
+//        return self.get('name', path_name)
+//
+//    @classmethod
+//    def Create(cls, name, path=None, tree='SOURCE_ROOT'):
+//        grp = cls()
+//        grp.id = cls.GenerateId()
+//        grp['name'] = name
+//        grp['children'] = PBXList()
+//
+//        if path:
+//            grp['path'] = path
+//            grp['sourceTree'] = tree
+//        else:
+//            grp['sourceTree'] = '<group>'
+//
+//        return grp
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXGroup.cs.meta

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

+ 27 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXList.cs

@@ -0,0 +1,27 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class PBXList : ArrayList
+	{
+		public PBXList()
+		{
+			
+		}
+		
+		public PBXList( object firstValue )
+		{
+			this.Add( firstValue );
+		}
+	}
+	
+//	public class PBXList<T> : ArrayList
+//	{
+//		public int Add( T value )
+//		{
+//			return (ArrayList)this.Add( value );
+//		}
+//	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXList.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 5dab64c67c818480d9451129a0e67e80
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 160 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXObject.cs

@@ -0,0 +1,160 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class PBXObject
+	{
+		protected const string ISA_KEY = "isa";
+		//
+		protected string _guid;
+		protected PBXDictionary _data;
+		
+		#region Properties
+		
+		public string guid {
+			get {
+				if( string.IsNullOrEmpty( _guid ) )
+					_guid = GenerateGuid();
+				
+				return _guid;
+			}
+		}
+		
+		public PBXDictionary data {
+			get {
+				if( _data == null )
+					_data = new PBXDictionary();
+				
+				return _data;
+			}
+		}
+		
+		
+		#endregion
+		#region Constructors
+		
+		public PBXObject()
+		{
+			_data = new PBXDictionary();
+			_data[ ISA_KEY ] = this.GetType().Name;
+			_guid = GenerateGuid();
+		}
+		
+		public PBXObject( string guid ) : this()
+		{
+			if( IsGuid( guid ) )
+				_guid = guid;
+		}
+		
+		public PBXObject( string guid, PBXDictionary dictionary ) : this( guid )
+		{
+//			Debug.Log( "constructor parent " + this.GetType().Name );
+			
+			if( !dictionary.ContainsKey( ISA_KEY ) || ((string)dictionary[ ISA_KEY ]).CompareTo( this.GetType().Name ) != 0 )
+				Debug.LogError( "PBXDictionary is not a valid ISA object" );
+			
+			foreach( KeyValuePair<string, object> item in dictionary ) {
+				_data[ item.Key ] = item.Value;
+			}
+		}
+		
+		#endregion
+		#region Static methods
+		
+		public static bool IsGuid( string aString )
+		{
+			return System.Text.RegularExpressions.Regex.IsMatch( aString, @"^[A-F0-9]{24}$" );
+		}
+		
+		public static string GenerateGuid()
+		{
+			return System.Guid.NewGuid().ToString("N").Substring( 8 ).ToUpper();
+		}
+		
+		
+		#endregion
+		#region Data manipulation
+		
+		public void Add( string key, object obj )
+		{
+			_data.Add( key, obj );
+		}
+		
+		public bool Remove( string key )
+		{
+			return _data.Remove( key );
+		}
+		
+		public bool ContainsKey( string key )
+		{
+			return _data.ContainsKey( key );
+		}
+		
+		#endregion
+//		class PBXObject(PBXDict):
+//    def __init__(self, d=None):
+//        PBXDict.__init__(self, d)
+//
+//        if not self.has_key('isa'):
+//            self['isa'] = self.__class__.__name__
+//        self.id = None
+//
+//    @staticmethod
+//    def Convert(o):
+//        if isinstance(o, list):
+//            return PBXList(o)
+//        elif isinstance(o, dict):
+//            isa = o.get('isa')
+//
+//            if not isa:
+//                return PBXDict(o)
+//
+//            cls = globals().get(isa)
+//
+//            if cls and issubclass(cls, PBXObject):
+//                return cls(o)
+//
+//            print 'warning: unknown PBX type: %s' % isa
+//            return PBXDict(o)
+//        else:
+//            return o
+	}
+	
+	public class PBXNativeTarget : PBXObject
+	{
+		public PBXNativeTarget() : base() {
+		}
+		
+		public PBXNativeTarget( string guid, PBXDictionary dictionary ) : base( guid, dictionary ) {	
+		}
+	}
+
+	public class PBXContainerItemProxy : PBXObject
+	{
+		public PBXContainerItemProxy() : base() {
+		}
+		
+		public PBXContainerItemProxy( string guid, PBXDictionary dictionary ) : base( guid, dictionary ) {	
+		}
+	}
+
+	public class PBXReferenceProxy : PBXObject
+	{
+		public PBXReferenceProxy() : base() {
+		}
+		
+		public PBXReferenceProxy( string guid, PBXDictionary dictionary ) : base( guid, dictionary ) {	
+		}
+	}
+
+	public class PBXVariantGroup : PBXObject
+	{
+		public PBXVariantGroup() : base() {
+		}
+		
+		public PBXVariantGroup( string guid, PBXDictionary dictionary ) : base( guid, dictionary ) {	
+		}
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXObject.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 32f133b9e55274ea89cb600dce102228
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 392 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXParser.cs

@@ -0,0 +1,392 @@
+using UnityEngine;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.RegularExpressions;
+
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class PBXParser
+	{
+		public const string PBX_HEADER_TOKEN = "// !$*UTF8*$!\n";
+		public const char WHITESPACE_SPACE = ' ';
+		public const char WHITESPACE_TAB = '\t';
+		public const char WHITESPACE_NEWLINE = '\n';
+		public const char WHITESPACE_CARRIAGE_RETURN = '\r';
+		public const char ARRAY_BEGIN_TOKEN = '(';
+		public const char ARRAY_END_TOKEN = ')';
+		public const char ARRAY_ITEM_DELIMITER_TOKEN = ',';
+		public const char DICTIONARY_BEGIN_TOKEN = '{';
+		public const char DICTIONARY_END_TOKEN = '}';
+		public const char DICTIONARY_ASSIGN_TOKEN = '=';
+		public const char DICTIONARY_ITEM_DELIMITER_TOKEN = ';';
+		public const char QUOTEDSTRING_BEGIN_TOKEN = '"';
+		public const char QUOTEDSTRING_END_TOKEN = '"';
+		public const char QUOTEDSTRING_ESCAPE_TOKEN = '\\';
+		public const char END_OF_FILE = (char)0x1A;
+		public const string COMMENT_BEGIN_TOKEN = "/*";
+		public const string COMMENT_END_TOKEN = "*/";
+		public const string COMMENT_LINE_TOKEN = "//";
+		private const int BUILDER_CAPACITY = 20000;
+
+		//
+		private char[] data;
+		private int index;
+//		public bool success;
+//		private int indent;
+	
+		public PBXDictionary Decode( string data )
+		{
+//			success = true;
+			if( !data.StartsWith( PBX_HEADER_TOKEN ) ) {
+				Debug.Log( "Wrong file format." );
+				return null;
+			}
+
+			data = data.Substring( 13 );
+			this.data = data.ToCharArray();
+			index = 0;
+			
+			return (PBXDictionary)ParseValue();
+		}
+
+		public string Encode( PBXDictionary pbxData, bool readable = false )
+		{
+//			indent = 0;
+
+			StringBuilder builder = new StringBuilder( PBX_HEADER_TOKEN, BUILDER_CAPACITY );
+			bool success = SerializeValue( pbxData, builder, readable );
+
+			return ( success ? builder.ToString() : null );
+		}
+
+		#region Move
+
+		private char NextToken()
+		{
+			SkipWhitespaces();
+			return StepForeward();
+		}
+		
+		private string Peek( int step = 1 )
+		{
+			string sneak = string.Empty;
+			for( int i = 1; i <= step; i++ ) {
+				if( data.Length - 1 < index + i ) {
+					break;
+				}
+				sneak += data[ index + i ];
+			}
+			return sneak;
+		}
+
+		private bool SkipWhitespaces()
+		{
+			bool whitespace = false;
+			while( Regex.IsMatch( StepForeward().ToString(), @"\s" ) )
+				whitespace = true;
+
+			StepBackward();
+
+			if( SkipComments() ) {
+				whitespace = true;
+				SkipWhitespaces();
+			}
+
+			return whitespace;
+		}
+
+		private bool SkipComments()
+		{
+			string s = string.Empty;
+			string tag = Peek( 2 );
+			switch( tag ) {
+				case COMMENT_BEGIN_TOKEN: {
+						while( Peek( 2 ).CompareTo( COMMENT_END_TOKEN ) != 0 ) {
+							s += StepForeward();
+						}
+						s += StepForeward( 2 );
+						break;
+					}
+				case COMMENT_LINE_TOKEN: {
+						while( !Regex.IsMatch( StepForeward().ToString(), @"\n" ) )
+							continue;
+
+						break;
+					}
+				default:
+					return false;
+			}
+			return true;
+		}
+		
+		private char StepForeward( int step = 1 )
+		{
+			index = Math.Min( data.Length, index + step );
+			return data[ index ];
+		}
+		
+		private char StepBackward( int step = 1 )
+		{
+			index = Math.Max( 0, index - step );
+			return data[ index ];
+		}
+
+		#endregion
+		#region Parse
+
+		private object ParseValue()
+		{
+			switch( NextToken() ) {
+				case END_OF_FILE:
+					Debug.Log( "End of file" );
+					return null;
+				case DICTIONARY_BEGIN_TOKEN:
+					return ParseDictionary();
+				case ARRAY_BEGIN_TOKEN:
+					return ParseArray();
+				case QUOTEDSTRING_BEGIN_TOKEN:
+					return ParseString();
+				default:
+					StepBackward();
+					return ParseEntity();
+			}
+		}
+		
+//		private T Convert<T>( PBXDictionary dictionary )
+//		{
+//			if( dictionary.ContainsKey( "isa" ) ){
+////				((string)dictionary["isa"]).CompareTo(
+//				Type targetType = Type.GetType( (string)dictionary["isa"] );
+//				if( targetType.IsSubclassOf( typeof(PBXObject) ) ) {
+//					Debug.Log( "ok" );
+//					T converted = (T)Activator.CreateInstance( targetType );
+//					return converted;
+//				}
+//				else {
+//					Debug.Log( "Warning: unknown PBX type: " + targetType.Name );
+//					return default(T);
+//				}
+//				
+//			}
+//			return default(T);
+//			
+//		}
+
+		private PBXDictionary ParseDictionary()
+		{
+			SkipWhitespaces();
+			PBXDictionary dictionary = new PBXDictionary();
+			string keyString = string.Empty;
+			object valueObject = null;
+
+			bool complete = false;
+			while( !complete ) {
+				switch( NextToken() ) {
+					case END_OF_FILE:
+						Debug.Log( "Error: reached end of file inside a dictionary: " + index );
+						complete = true;
+						break;
+
+					case DICTIONARY_ITEM_DELIMITER_TOKEN:
+						keyString = string.Empty;
+						valueObject = null;
+						break;
+
+					case DICTIONARY_END_TOKEN:
+						keyString = string.Empty;
+						valueObject = null;
+						complete = true;
+						break;
+
+					case DICTIONARY_ASSIGN_TOKEN:
+						valueObject = ParseValue();
+						dictionary.Add( keyString, valueObject );
+						break;
+
+					default:
+						StepBackward();
+						keyString = ParseValue() as string;
+						break;
+				}
+			}
+			return dictionary;
+		}
+
+		private PBXList ParseArray()
+		{
+			PBXList list = new PBXList();
+			bool complete = false;
+			while( !complete ) {
+				switch( NextToken() ) {
+					case END_OF_FILE:
+						Debug.Log( "Error: Reached end of file inside a list: " + list );
+						complete = true;
+						break;
+					case ARRAY_END_TOKEN:
+						complete = true;
+						break;
+					case ARRAY_ITEM_DELIMITER_TOKEN:
+						break;
+					default:
+						StepBackward();
+						list.Add( ParseValue() );
+						break;
+				}
+			}
+			return list;
+		}
+
+		private object ParseString()
+		{
+			string s = string.Empty;
+			char c = StepForeward();
+			while( c != QUOTEDSTRING_END_TOKEN ) {
+				s += c;
+
+				if( c == QUOTEDSTRING_ESCAPE_TOKEN )
+					s += StepForeward();
+
+				c = StepForeward();
+			}
+
+			return s;
+		}
+
+		private object ParseEntity()
+		{
+			string word = string.Empty;
+			
+			while( !Regex.IsMatch( Peek(), @"[;,\s=]" ) ) {
+				word += StepForeward();
+			}
+
+			if( word.Length != 24 && Regex.IsMatch( word, @"^\d+$" ) ) {
+				return Int32.Parse( word );
+			}
+			
+			return word;
+		}
+
+		#endregion
+		#region Serialize
+
+		private bool SerializeValue( object value, StringBuilder builder, bool readable = false )
+		{
+			if( value == null ) {
+				builder.Append( "null" );
+			}
+			else if( value is PBXObject ) {
+				SerializeDictionary( ((PBXObject)value).data, builder, readable );
+			}
+			else if( value is Dictionary<string, object> ) {
+				SerializeDictionary( (Dictionary<string, object>)value, builder, readable );
+			}
+			else if( value.GetType().IsArray ) {
+				SerializeArray( new ArrayList( (ICollection)value ), builder, readable );
+			}
+			else if( value is ArrayList ) {
+				SerializeArray( (ArrayList)value, builder, readable );
+			}
+			else if( value is string ) {
+				SerializeString( (string)value, builder, readable );
+			}
+			else if( value is Char ) {
+				SerializeString( Convert.ToString( (char)value ), builder, readable );
+			}
+			else if( value is bool ) {
+				builder.Append( Convert.ToInt32( value ).ToString() );
+			}
+			else if( value.GetType().IsPrimitive ) {
+				builder.Append( Convert.ToString( value ) );
+			}
+//			else if( value is Hashtable )
+//			{
+//				serializeObject( (Hashtable)value, builder );
+//			}
+//			else if( ( value is Boolean ) && ( (Boolean)value == true ) )
+//			{
+//				builder.Append( "NO" );
+//			}
+//			else if( ( value is Boolean ) && ( (Boolean)value == false ) )
+//			{
+//				builder.Append( "YES" );
+//			}
+			else {
+				Debug.LogWarning( "Error: unknown object of type " + value.GetType().Name );
+				return false;
+			}
+	
+			return true;
+		}
+
+		private bool SerializeDictionary( Dictionary<string, object> dictionary, StringBuilder builder, bool readable = false )
+		{
+			builder.Append( DICTIONARY_BEGIN_TOKEN );
+
+			foreach( KeyValuePair<string, object> pair in dictionary ) {
+				SerializeString( pair.Key, builder );
+				builder.Append( DICTIONARY_ASSIGN_TOKEN );
+				SerializeValue( pair.Value, builder );
+				builder.Append( DICTIONARY_ITEM_DELIMITER_TOKEN );
+			}
+
+			builder.Append( DICTIONARY_END_TOKEN );
+			return true;
+		}
+
+		private bool SerializeArray( ArrayList anArray, StringBuilder builder, bool readable = false )
+		{
+			builder.Append( ARRAY_BEGIN_TOKEN );
+
+			for( int i = 0; i < anArray.Count; i++ )
+			{
+				object value = anArray[i];
+	
+				if( !SerializeValue( value, builder ) )
+				{
+					return false;
+				}
+
+				builder.Append( ARRAY_ITEM_DELIMITER_TOKEN );
+			}
+	
+			builder.Append( ARRAY_END_TOKEN );
+			return true;
+		}
+
+		private bool SerializeString( string aString, StringBuilder builder, bool useQuotes = false, bool readable = false )
+		{
+			// Is a GUID?
+			if( Regex.IsMatch( aString, @"^[A-F0-9]{24}$" ) ) {
+				builder.Append( aString );
+				return true;
+			}
+
+			// Is an empty string?
+			if( string.IsNullOrEmpty( aString ) ) {
+				builder.Append( QUOTEDSTRING_BEGIN_TOKEN );
+				builder.Append( QUOTEDSTRING_END_TOKEN );
+				return true;
+			}
+
+			if( !Regex.IsMatch( aString, @"^[A-Za-z0-9_.]+$" ) ) {
+				useQuotes = true;
+			}
+
+			if( useQuotes )
+				builder.Append( QUOTEDSTRING_BEGIN_TOKEN );
+
+			builder.Append( aString );
+
+			if( useQuotes )
+				builder.Append( QUOTEDSTRING_END_TOKEN );
+
+			return true;
+		}
+
+		#endregion
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXParser.cs.meta

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

+ 23 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXProject.cs

@@ -0,0 +1,23 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class PBXProject : PBXObject
+	{
+		protected string MAINGROUP_KEY = "mainGroup";
+		
+		public PBXProject() : base() {
+		}
+		
+		public PBXProject( string guid, PBXDictionary dictionary ) : base( guid, dictionary ) {	
+		}
+		
+		public string mainGroupID {
+			get {
+				return (string)_data[ MAINGROUP_KEY ];
+			}
+		}
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/PBXProject.cs.meta

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

+ 83 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/Readme.mdown

@@ -0,0 +1,83 @@
+# XCode Editor for Unity
+
+## OVERVIEW
+
+The purpose of this project is to allow editing an XCode 4 project.
+
+This project is based upon the python project **Mod PBXProj** by Calvin Rien (http://the.darktable.com/). Due to the recent addiction of PostProcessBuild attribute to Unity, I found much useful having a C# version of the library.
+
+
+## INSTALLATION
+
+Clone this repo somewhere under Assets/Editor in your project. If your project is not yet checked into git, then you'll need to do the appropriate setup and add this as a submodule (google: git-submodule).
+
+If you already use git for your project, then just add this as a submodule.
+
+
+## USAGE
+
+You can use the XCProject class in any part of your editor and postprocess code. Taking advantage of the great powers of the new PostProcessBuild attribute, I suggest to use a small cs static class to run through all the projmods files in your asses folder and simply apply them to the newly created xcode project.
+
+```cs
+using UnityEditor;
+
+public static class XCodePostProcess
+{
+    [PostProcessBuild]
+    public static void OnPostProcessBuild( BuildTarget target, string path )
+    {
+        // Create a new project object from build target
+        XCodeEditor.XCProject project = new XCodeEditor.XCProject( targetPath );
+
+        // Find and run through all projmods files to patch the project
+        var files = System.IO.Directory.GetFiles( Application.dataPath, "*.projmods", SearchOption.AllDirectories );
+        foreach( var file in files ) {
+            project.ApplyMod( file );
+        }
+
+        // Finally save the xcode project
+        project.Save();
+    }
+}
+```
+
+The projmods file is a simple text file containing a JSON object. It will be used to pass the parameters to the ApplyMod method. This is the file I use for the GameCenter plugin as a brief example:
+
+```json
+{
+    "group":       "GameCenter",
+    "libs":        [],
+    "frameworks":  ["GameKit.framework"],
+    "headerpaths": ["Editor/iOS/GameCenter/**"],
+    "files":       ["Editor/iOS/GameCenter/GameCenterBinding.m",
+                    "Editor/iOS/GameCenter/GameCenterController.h",
+                    "Editor/iOS/GameCenter/GameCenterController.mm",
+                    "Editor/iOS/GameCenter/GameCenterManager.h",
+                    "Editor/iOS/GameCenter/GameCenterManager.m"],
+    "folders":     [],
+    "excludes":    ["^.*.meta$", "^.*.mdown^", "^.*.pdf$"]
+}
+```
+
+- group: all files and folders will be parented to this group;
+- libs: add libraries to build phase;
+- frameworks: add frameworks to the project;
+- headerpaths: add header paths to build phase;
+- files: add single files to the project;
+- folders: create a subgroup and add all files to the project (recursive);
+- excludes: file mask to exclude;
+
+Note: all paths are relative to projmods location
+
+
+## LICENSE
+
+This code is distributed under the terms and conditions of the MIT license.
+
+Copyright (c) 2012 Daniele Cariola
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 6 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/Readme.mdown.meta

@@ -0,0 +1,6 @@
+fileFormatVersion: 2
+guid: 5a8213bf10e38424b81ce56f7700deba
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 233 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCBuildConfiguration.cs

@@ -0,0 +1,233 @@
+using UnityEngine;
+using System.Collections;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class XCBuildConfiguration : PBXObject
+	{
+		protected const string BUILDSETTINGS_KEY = "buildSettings";
+		protected const string HEADER_SEARCH_PATHS_KEY = "HEADER_SEARCH_PATHS";
+		protected const string LIBRARY_SEARCH_PATHS_KEY = "LIBRARY_SEARCH_PATHS";
+		protected const string FRAMEWORK_SEARCH_PATHS_KEY = "FRAMEWORK_SEARCH_PATHS";
+		protected const string OTHER_C_FLAGS_KEY = "OTHER_CFLAGS";
+		protected const string OTHER_LD_FLAGS_KEY = "OTHER_LDFLAGS";
+		protected const string GCC_ENABLE_CPP_EXCEPTIONS_KEY = "GCC_ENABLE_CPP_EXCEPTIONS";
+		protected const string GCC_ENABLE_OBJC_EXCEPTIONS_KEY = "GCC_ENABLE_OBJC_EXCEPTIONS";
+
+		public XCBuildConfiguration( string guid, PBXDictionary dictionary ) : base( guid, dictionary )
+		{
+			
+		}
+		
+		public PBXDictionary buildSettings {
+			get {
+				if( ContainsKey( BUILDSETTINGS_KEY ) )
+					return (PBXDictionary)_data[BUILDSETTINGS_KEY];
+			
+				return null;
+			}
+		}
+		
+		protected bool AddSearchPaths( string path, string key, bool recursive = true )
+		{
+			PBXList paths = new PBXList();
+			paths.Add( path );
+			return AddSearchPaths( paths, key, recursive );
+		}
+		
+		protected bool AddSearchPaths( PBXList paths, string key, bool recursive = true )
+		{	
+			bool modified = false;
+			
+			if( !ContainsKey( BUILDSETTINGS_KEY ) )
+				this.Add( BUILDSETTINGS_KEY, new PBXDictionary() );
+			
+			foreach( string path in paths ) {
+				string currentPath = path;
+				if( recursive && !path.EndsWith( "/**" ) )
+					currentPath += "/**";
+				
+//				Debug.Log( "adding: " + currentPath );
+				if( !((PBXDictionary)_data[BUILDSETTINGS_KEY]).ContainsKey( key ) ) {
+					((PBXDictionary)_data[BUILDSETTINGS_KEY]).Add( key, new PBXList() );
+				}
+				else if( ((PBXDictionary)_data[BUILDSETTINGS_KEY])[key] is string ) {
+					PBXList list = new PBXList();
+					list.Add( ((PBXDictionary)_data[BUILDSETTINGS_KEY])[key] );
+					((PBXDictionary)_data[BUILDSETTINGS_KEY])[key] = list;
+				}
+				
+				currentPath = "\\\"" + currentPath + "\\\"";
+				
+				if( !((PBXList)((PBXDictionary)_data[BUILDSETTINGS_KEY])[key]).Contains( currentPath ) ) {
+					((PBXList)((PBXDictionary)_data[BUILDSETTINGS_KEY])[key]).Add( currentPath );
+					modified = true;
+				}
+			}
+		
+			return modified;
+		}
+		
+		public bool AddHeaderSearchPaths( PBXList paths, bool recursive = true )
+		{
+			return this.AddSearchPaths( paths, HEADER_SEARCH_PATHS_KEY, recursive );
+		}
+		
+		public bool AddLibrarySearchPaths( PBXList paths, bool recursive = true )
+		{
+			return this.AddSearchPaths( paths, LIBRARY_SEARCH_PATHS_KEY, recursive );
+		}
+
+		public bool AddFrameworkSearchPaths(PBXList paths, bool recursive = true)
+		{
+			return this.AddSearchPaths(paths, FRAMEWORK_SEARCH_PATHS_KEY, recursive);
+		}
+		
+		public bool AddOtherCFlags( string flag )
+		{
+			//Debug.Log( "INIZIO 1" );
+			PBXList flags = new PBXList();
+			flags.Add( flag );
+			return AddOtherCFlags( flags );
+		}
+		
+		public bool AddOtherCFlags( PBXList flags )
+		{
+			//Debug.Log( "INIZIO 2" );
+			
+			bool modified = false;
+			
+			if( !ContainsKey( BUILDSETTINGS_KEY ) )
+				this.Add( BUILDSETTINGS_KEY, new PBXDictionary() );
+			
+			foreach( string flag in flags ) {
+				
+				if( !((PBXDictionary)_data[BUILDSETTINGS_KEY]).ContainsKey( OTHER_C_FLAGS_KEY ) ) {
+					((PBXDictionary)_data[BUILDSETTINGS_KEY]).Add( OTHER_C_FLAGS_KEY, new PBXList() );
+				}
+				else if ( ((PBXDictionary)_data[BUILDSETTINGS_KEY])[ OTHER_C_FLAGS_KEY ] is string ) {
+					string tempString = (string)((PBXDictionary)_data[BUILDSETTINGS_KEY])[OTHER_C_FLAGS_KEY];
+					((PBXDictionary)_data[BUILDSETTINGS_KEY])[ OTHER_C_FLAGS_KEY ] = new PBXList();
+					((PBXList)((PBXDictionary)_data[BUILDSETTINGS_KEY])[OTHER_C_FLAGS_KEY]).Add( tempString );
+				}
+				
+				if( !((PBXList)((PBXDictionary)_data[BUILDSETTINGS_KEY])[OTHER_C_FLAGS_KEY]).Contains( flag ) ) {
+					((PBXList)((PBXDictionary)_data[BUILDSETTINGS_KEY])[OTHER_C_FLAGS_KEY]).Add( flag );
+					modified = true;
+				}
+			}
+			
+			return modified;
+		}
+
+		public bool AddOtherLDFlags( string flag )
+		{
+			//Debug.Log( "INIZIO A" );
+			PBXList flags = new PBXList();
+			flags.Add( flag );
+			return AddOtherLDFlags( flags );
+		}
+
+		public bool AddOtherLDFlags( PBXList flags )
+		{
+			//Debug.Log( "INIZIO B" );
+			
+			bool modified = false;
+			
+			if( !ContainsKey( BUILDSETTINGS_KEY ) )
+				this.Add( BUILDSETTINGS_KEY, new PBXDictionary() );
+			
+			foreach( string flag in flags ) {
+				
+				if( !((PBXDictionary)_data[BUILDSETTINGS_KEY]).ContainsKey( OTHER_LD_FLAGS_KEY ) ) {
+					((PBXDictionary)_data[BUILDSETTINGS_KEY]).Add( OTHER_LD_FLAGS_KEY, new PBXList() );
+				}
+				else if ( ((PBXDictionary)_data[BUILDSETTINGS_KEY])[ OTHER_LD_FLAGS_KEY ] is string ) {
+					string tempString = (string)((PBXDictionary)_data[BUILDSETTINGS_KEY])[OTHER_LD_FLAGS_KEY];
+					((PBXDictionary)_data[BUILDSETTINGS_KEY])[ OTHER_LD_FLAGS_KEY ] = new PBXList();
+					((PBXList)((PBXDictionary)_data[BUILDSETTINGS_KEY])[OTHER_LD_FLAGS_KEY]).Add( tempString );
+				}
+				
+				if( !((PBXList)((PBXDictionary)_data[BUILDSETTINGS_KEY])[OTHER_LD_FLAGS_KEY]).Contains( flag ) ) {
+					((PBXList)((PBXDictionary)_data[BUILDSETTINGS_KEY])[OTHER_LD_FLAGS_KEY]).Add( flag );
+					modified = true;
+				}
+			}
+			
+			return modified;
+		}
+
+		public bool GccEnableCppExceptions (string value)
+		{
+			if (!ContainsKey (BUILDSETTINGS_KEY))
+				this.Add (BUILDSETTINGS_KEY, new PBXDictionary ());
+
+			((PBXDictionary)_data [BUILDSETTINGS_KEY])[GCC_ENABLE_CPP_EXCEPTIONS_KEY] = value;
+			return true;
+		}
+
+		public bool GccEnableObjCExceptions (string value)
+		{
+			if (!ContainsKey (BUILDSETTINGS_KEY))
+				this.Add (BUILDSETTINGS_KEY, new PBXDictionary ());
+
+			((PBXDictionary)_data [BUILDSETTINGS_KEY])[GCC_ENABLE_OBJC_EXCEPTIONS_KEY] = value;
+			return true;
+		}
+		
+//	class XCBuildConfiguration(PBXType):
+//    def add_search_paths(self, paths, base, key, recursive=True):
+//        modified = False
+//
+//        if not isinstance(paths, list):
+//            paths = [paths]
+//
+//        if not self.has_key(base):
+//            self[base] = PBXDict()
+//
+//        for path in paths:
+//            if recursive and not path.endswith('/**'):
+//                path = os.path.join(path, '**')
+//
+//            if not self[base].has_key(key):
+//                self[base][key] = PBXList()
+//            elif isinstance(self[base][key], basestring):
+//                self[base][key] = PBXList(self[base][key])
+//
+//            if self[base][key].add('\\"%s\\"' % path):
+//                modified = True
+//
+//        return modified
+//
+//    def add_header_search_paths(self, paths, recursive=True):
+//        return self.add_search_paths(paths, 'buildSettings', 'HEADER_SEARCH_PATHS', recursive=recursive)
+//
+//    def add_library_search_paths(self, paths, recursive=True):
+//        return self.add_search_paths(paths, 'buildSettings', 'LIBRARY_SEARCH_PATHS', recursive=recursive)
+//
+//    def add_other_cflags(self, flags):
+//        modified = False
+//
+//        base = 'buildSettings'
+//        key = 'OTHER_CFLAGS'
+//
+//        if isinstance(flags, basestring):
+//            flags = PBXList(flags)
+//
+//        if not self.has_key(base):
+//            self[base] = PBXDict()
+//
+//        for flag in flags:
+//
+//            if not self[base].has_key(key):
+//                self[base][key] = PBXList()
+//            elif isinstance(self[base][key], basestring):
+//                self[base][key] = PBXList(self[base][key])
+//
+//            if self[base][key].add(flag):
+//                self[base][key] = [e for e in self[base][key] if e]
+//                modified = True
+//
+//        return modified
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCBuildConfiguration.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 6072c24958d074bbba00b6654dea8a07
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 16 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCConfigurationList.cs

@@ -0,0 +1,16 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class XCConfigurationList : PBXObject
+	{	
+//		XCBuildConfigurationList buildConfigurations;
+//		bool defaultConfigurationIsVisible = false;
+//		string defaultConfigurationName;
+		
+		public XCConfigurationList( string guid, PBXDictionary dictionary ) : base( guid, dictionary ) {	
+		}
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCConfigurationList.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 186b7292bd62b4867bff9c84f77ba73e
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 15 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCFileOperationQueue.cs

@@ -0,0 +1,15 @@
+using UnityEngine;
+using System.Collections;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class XCFileOperationQueue : System.IDisposable
+	{
+
+		public void Dispose()
+		{
+			
+		}
+		
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCFileOperationQueue.cs.meta

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

+ 130 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCMod.cs

@@ -0,0 +1,130 @@
+using UnityEngine;
+using System.Collections;
+using System.IO;
+
+namespace cn.sharesdk.unity3d.sdkporter 
+{
+	public class XCMod 
+	{
+//		private string group;
+//		private ArrayList patches;
+//		private ArrayList libs;
+//		private ArrayList frameworks;
+//		private ArrayList headerpaths;
+//		private ArrayList files;
+//		private ArrayList folders;
+//		private ArrayList excludes;
+		private Hashtable _datastore;
+		private ArrayList _libs;
+		
+		public string name { get; private set; }
+		public string path { get; private set; }
+		
+		public string group {
+			get {
+				return (string)_datastore["group"];
+			}
+		}
+		
+		public ArrayList patches {
+			get {
+				return (ArrayList)_datastore["patches"];
+			}
+		}
+		
+		public ArrayList libs {
+			get {
+				if( _libs == null ) {
+					_libs = new ArrayList( ((ArrayList)_datastore["libs"]).Count );
+					foreach( string fileRef in (ArrayList)_datastore["libs"] ) {
+						_libs.Add( new XCModFile( fileRef ) );
+					}
+				}
+				return _libs;
+			}
+		}
+
+		public ArrayList zipPaths {
+			get{
+				return (ArrayList)_datastore ["zips"];
+			}
+		}
+
+		public ArrayList frameworks {
+			get {
+				return (ArrayList)_datastore["frameworks"];
+			}
+		}
+		
+		public ArrayList headerpaths {
+			get {
+				return (ArrayList)_datastore["headerpaths"];
+			}
+		}
+		public ArrayList librarypaths {
+			get {
+				return (ArrayList)_datastore["librarypaths"];
+			}
+		}
+
+		public Hashtable buildSettings {
+			get {
+				return (Hashtable)_datastore["buildSettings"];
+			}
+		}
+		
+		public ArrayList files {
+			get {
+				return (ArrayList)_datastore["files"];
+			}
+		}
+		
+		public ArrayList folders {
+			get {
+				return (ArrayList)_datastore["folders"];
+			}
+		}
+		
+		public ArrayList excludes {
+			get {
+				return (ArrayList)_datastore["excludes"];
+			}
+		}
+		
+		public XCMod( string filename )
+		{	
+			FileInfo projectFileInfo = new FileInfo( filename );
+			if( !projectFileInfo.Exists ) 
+			{
+				Debug.LogWarning( "File does not exist." );
+			}
+			
+			name = System.IO.Path.GetFileNameWithoutExtension( filename );
+			path = System.IO.Path.GetDirectoryName( filename );
+			
+			string contents = projectFileInfo.OpenText().ReadToEnd();
+			_datastore = (Hashtable)MiniJSON.jsonDecode( contents );
+		}
+	}
+	
+	public class XCModFile
+	{
+		public string filePath { get; private set; }
+		public bool isWeak { get; private set; }
+		
+		public XCModFile( string inputString )
+		{
+			isWeak = false;
+			
+			if( inputString.Contains( ":" ) ) {
+				string[] parts = inputString.Split( ':' );
+				filePath = parts[0];
+				isWeak = ( parts[1].CompareTo( "weak" ) == 0 );	
+			}
+			else 
+			{
+				filePath = inputString;
+			}
+		}
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCMod.cs.meta

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

+ 750 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCProject.cs

@@ -0,0 +1,750 @@
+using UnityEngine;
+using UnityEditor;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System;
+using System.Text.RegularExpressions;
+using System.Diagnostics;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public partial class XCProject : System.IDisposable
+	{
+		
+//		private string _filePath;
+		private PBXDictionary _datastore;
+		public PBXDictionary _objects;
+		private PBXDictionary _configurations;
+		
+		private PBXGroup _rootGroup;
+		private string _defaultConfigurationName;
+		private string _rootObjectKey;
+	
+		public string projectRootPath { get; private set; }
+		private FileInfo projectFileInfo;
+		
+		public string filePath { get; private set; }
+		private string sourcePathRoot;
+		private bool modified = false;
+		
+		#region Data
+		
+		// Objects
+		private PBXDictionary<PBXBuildFile> _buildFiles;
+		private PBXDictionary<PBXGroup> _groups;
+		private PBXDictionary<PBXFileReference> _fileReferences;
+		private PBXDictionary<PBXNativeTarget> _nativeTargets;
+		
+		private PBXDictionary<PBXFrameworksBuildPhase> _frameworkBuildPhases;
+		private PBXDictionary<PBXResourcesBuildPhase> _resourcesBuildPhases;
+		private PBXDictionary<PBXShellScriptBuildPhase> _shellScriptBuildPhases;
+		private PBXDictionary<PBXSourcesBuildPhase> _sourcesBuildPhases;
+		private PBXDictionary<PBXCopyFilesBuildPhase> _copyBuildPhases;
+				
+		private PBXDictionary<XCBuildConfiguration> _buildConfigurations;
+		private PBXDictionary<XCConfigurationList> _configurationLists;
+		
+		private PBXProject _project;
+		
+		#endregion
+		#region Constructor
+		
+		public XCProject()
+		{
+			
+		}
+		
+		public XCProject( string filePath ) : this()
+		{
+			if( !System.IO.Directory.Exists( filePath ) ) {
+				UnityEngine.Debug.LogWarning( "Path does not exists." );
+				return;
+			}
+			
+			if( filePath.EndsWith( ".xcodeproj" ) ) {
+//				UnityEngine.Debug.Log( "Opening project " + filePath );
+				this.projectRootPath = Path.GetDirectoryName( filePath );
+				this.filePath = filePath;
+			} else {
+//				UnityEngine.Debug.Log( "Looking for xcodeproj files in " + filePath );
+				string[] projects = System.IO.Directory.GetDirectories( filePath, "*.xcodeproj" );
+				if( projects.Length == 0 ) {
+					UnityEngine.Debug.LogWarning( "Error: missing xcodeproj file" );
+					return;
+				}
+				
+				this.projectRootPath = filePath;
+				this.filePath = projects[ 0 ];	
+			}
+			
+			// Convert to absolute
+			this.projectRootPath = Path.GetFullPath(this.projectRootPath);
+			
+			projectFileInfo = new FileInfo( Path.Combine( this.filePath, "project.pbxproj" ) );
+			StreamReader sr = projectFileInfo.OpenText();
+			string contents = sr.ReadToEnd();
+			sr.Close();
+			
+			PBXParser parser = new PBXParser();
+			_datastore = parser.Decode( contents );
+			if( _datastore == null ) {
+				throw new System.Exception( "Project file not found at file path " + filePath );
+			}
+
+			if( !_datastore.ContainsKey( "objects" ) ) {
+				UnityEngine.Debug.Log( "Errore " + _datastore.Count );
+				return;
+			}
+			
+			_objects = (PBXDictionary)_datastore["objects"];
+			modified = false;
+			
+			_rootObjectKey = (string)_datastore["rootObject"];
+			if( !string.IsNullOrEmpty( _rootObjectKey ) ) {
+//				_rootObject = (PBXDictionary)_objects[ _rootObjectKey ];
+				_project = new PBXProject( _rootObjectKey, (PBXDictionary)_objects[ _rootObjectKey ] );
+//				_rootGroup = (PBXDictionary)_objects[ (string)_rootObject[ "mainGroup" ] ];
+				_rootGroup = new PBXGroup( _rootObjectKey, (PBXDictionary)_objects[ _project.mainGroupID ] );
+			}
+			else {
+				UnityEngine.Debug.LogWarning( "error: project has no root object" );
+				_project = null;
+				_rootGroup = null;
+			}
+
+		}
+		
+		#endregion
+		#region Properties
+		
+		public PBXProject project {
+			get {
+				return _project;
+			}
+		}
+		
+		public PBXGroup rootGroup {
+			get {
+				return _rootGroup;
+			}
+		}
+		
+		public PBXDictionary<PBXBuildFile> buildFiles {
+			get {
+				if( _buildFiles == null ) {
+					_buildFiles = new PBXDictionary<PBXBuildFile>( _objects );
+				}
+				return _buildFiles;
+			}
+		}
+		
+		public PBXDictionary<PBXGroup> groups {
+			get {
+				if( _groups == null ) {
+					_groups = new PBXDictionary<PBXGroup>( _objects );
+				}
+				return _groups;
+			}
+		}
+		
+		public PBXDictionary<PBXFileReference> fileReferences {
+			get {
+				if( _fileReferences == null ) {
+					_fileReferences = new PBXDictionary<PBXFileReference>( _objects );
+				}
+				return _fileReferences;
+			}
+		}
+		
+		public PBXDictionary<PBXNativeTarget> nativeTargets {
+			get {
+				if( _nativeTargets == null ) {
+					_nativeTargets = new PBXDictionary<PBXNativeTarget>( _objects );
+				}
+				return _nativeTargets;
+			}
+		}
+		
+		public PBXDictionary<XCBuildConfiguration> buildConfigurations {
+			get {
+				if( _buildConfigurations == null ) {
+					_buildConfigurations = new PBXDictionary<XCBuildConfiguration>( _objects );
+				}
+				return _buildConfigurations;
+			}
+		}
+		
+		public PBXDictionary<XCConfigurationList> configurationLists {
+			get {
+				if( _configurationLists == null ) {
+					_configurationLists = new PBXDictionary<XCConfigurationList>( _objects );
+				}
+				return _configurationLists;
+			}
+		}
+		
+		public PBXDictionary<PBXFrameworksBuildPhase> frameworkBuildPhases {
+			get {
+				if( _frameworkBuildPhases == null ) {
+					_frameworkBuildPhases = new PBXDictionary<PBXFrameworksBuildPhase>( _objects );
+				}
+				return _frameworkBuildPhases;
+			}
+		}
+	
+		public PBXDictionary<PBXResourcesBuildPhase> resourcesBuildPhases {
+			get {
+				if( _resourcesBuildPhases == null ) {
+					_resourcesBuildPhases = new PBXDictionary<PBXResourcesBuildPhase>( _objects );
+				}
+				return _resourcesBuildPhases;
+			}
+		}
+	
+		public PBXDictionary<PBXShellScriptBuildPhase> shellScriptBuildPhases {
+			get {
+				if( _shellScriptBuildPhases == null ) {
+					_shellScriptBuildPhases = new PBXDictionary<PBXShellScriptBuildPhase>( _objects );
+				}
+				return _shellScriptBuildPhases;
+			}
+		}
+	
+		public PBXDictionary<PBXSourcesBuildPhase> sourcesBuildPhases {
+			get {
+				if( _sourcesBuildPhases == null ) {
+					_sourcesBuildPhases = new PBXDictionary<PBXSourcesBuildPhase>( _objects );
+				}
+				return _sourcesBuildPhases;
+			}
+		}
+	
+		public PBXDictionary<PBXCopyFilesBuildPhase> copyBuildPhases {
+			get {
+				if( _copyBuildPhases == null ) {
+					_copyBuildPhases = new PBXDictionary<PBXCopyFilesBuildPhase>( _objects );
+				}
+				return _copyBuildPhases;
+			}
+		}
+								
+		
+		#endregion
+		#region PBXMOD
+		
+		public bool AddOtherCFlags( string flag )
+		{
+			return AddOtherCFlags( new PBXList( flag ) ); 
+		}
+		
+		public bool AddOtherCFlags( PBXList flags )
+		{
+			foreach( KeyValuePair<string, XCBuildConfiguration> buildConfig in buildConfigurations ) {
+				buildConfig.Value.AddOtherCFlags( flags );
+			}
+			modified = true;
+			return modified;	
+		}
+
+		public bool AddOtherLDFlags( string flag )
+		{
+			return AddOtherLDFlags( new PBXList( flag ) ); 
+		}
+		
+		public bool AddOtherLDFlags( PBXList flags )
+		{
+			foreach( KeyValuePair<string, XCBuildConfiguration> buildConfig in buildConfigurations ) {
+				buildConfig.Value.AddOtherLDFlags( flags );
+			}
+			modified = true;
+			return modified;	
+		}
+
+		public bool GccEnableCppExceptions (string value)
+		{
+			foreach( KeyValuePair<string, XCBuildConfiguration> buildConfig in buildConfigurations ) {
+				buildConfig.Value.GccEnableCppExceptions( value );
+			}
+			modified = true;
+			return modified;	
+		}
+
+		public bool GccEnableObjCExceptions (string value)
+		{
+			foreach( KeyValuePair<string, XCBuildConfiguration> buildConfig in buildConfigurations ) {
+				buildConfig.Value.GccEnableObjCExceptions( value );
+			}
+			modified = true;
+			return modified;
+		}
+
+		public bool AddHeaderSearchPaths( string path )
+		{
+			return AddHeaderSearchPaths( new PBXList( path ) );
+		}
+		
+		public bool AddHeaderSearchPaths( PBXList paths )
+		{
+			foreach( KeyValuePair<string, XCBuildConfiguration> buildConfig in buildConfigurations ) {
+//				UnityEngine.Debug.Log( "ADDING HEADER PATH: " + paths + " to " + buildConfig.Key );
+				buildConfig.Value.AddHeaderSearchPaths( paths );
+			}
+			modified = true;
+			return modified;
+		}
+		
+		public bool AddLibrarySearchPaths( string path )
+		{
+			return AddLibrarySearchPaths( new PBXList( path ) );
+		}
+		
+		public bool AddLibrarySearchPaths( PBXList paths )
+		{
+			foreach( KeyValuePair<string, XCBuildConfiguration> buildConfig in buildConfigurations ) {
+				buildConfig.Value.AddLibrarySearchPaths( paths );
+			}
+			modified = true;
+			return modified;
+		}
+
+		public bool AddFrameworkSearchPaths(string path)
+		{
+			return AddFrameworkSearchPaths(new PBXList(path));
+		}
+
+		public bool AddFrameworkSearchPaths(PBXList paths)
+		{
+			foreach (KeyValuePair<string, XCBuildConfiguration> buildConfig in buildConfigurations)
+			{
+				buildConfig.Value.AddFrameworkSearchPaths(paths);
+			}
+			modified = true;
+			return modified;
+		}
+			
+		public object GetObject( string guid )
+		{
+			return _objects[guid];
+		}
+	
+		public PBXDictionary AddFile( string filePath, PBXGroup parent = null, string tree = "SOURCE_ROOT", bool createBuildFiles = true, bool weak = false )
+		{
+			PBXDictionary results = new PBXDictionary();
+			string absPath = string.Empty;
+			
+			if( Path.IsPathRooted( filePath ) ) {
+				absPath = filePath;
+//				UnityEngine.Debug.Log( "Is rooted: " + absPath );
+			}
+			else if( tree.CompareTo( "SDKROOT" ) != 0) {
+				absPath = Path.Combine( Application.dataPath.Replace("Assets", ""), filePath );
+//				UnityEngine.Debug.Log( "RElative: " + absPath );
+			}
+			
+			if( !( File.Exists( absPath ) || Directory.Exists( absPath ) ) && tree.CompareTo( "SDKROOT" ) != 0 ) {
+//				UnityEngine.Debug.Log( "Missing file: " + absPath + " > " + filePath );
+				return results;
+			}
+			else if( tree.CompareTo( "SOURCE_ROOT" ) == 0 || tree.CompareTo( "GROUP" ) == 0 ) {
+				System.Uri fileURI = new System.Uri( absPath );
+				System.Uri rootURI = new System.Uri( ( projectRootPath + "/." ) );
+				filePath = rootURI.MakeRelativeUri( fileURI ).ToString();
+			}
+
+//			UnityEngine.Debug.Log( "Add file result path: " + filePath );
+			
+			if( parent == null ) {
+				parent = _rootGroup;
+			}
+			
+			// TODO: Aggiungere controllo se file già presente
+			PBXFileReference fileReference = GetFile( System.IO.Path.GetFileName( filePath ) );	
+			if( fileReference != null ) {
+//				UnityEngine.Debug.Log( "File già presente." );
+				return null;
+			}
+			
+			fileReference = new PBXFileReference( filePath, (TreeEnum)System.Enum.Parse( typeof(TreeEnum), tree ) );
+			parent.AddChild( fileReference );
+			fileReferences.Add( fileReference );
+			results.Add( fileReference.guid, fileReference );
+
+			//Create a build file for reference
+			if( !string.IsNullOrEmpty( fileReference.buildPhase ) && createBuildFiles ) {
+//				PBXDictionary<PBXBuildPhase> currentPhase = GetBuildPhase( fileReference.buildPhase );
+				PBXBuildFile buildFile;
+				switch( fileReference.buildPhase ) {
+					case "PBXFrameworksBuildPhase":
+						foreach( KeyValuePair<string, PBXFrameworksBuildPhase> currentObject in frameworkBuildPhases ) {
+							buildFile = new PBXBuildFile( fileReference, weak );
+							buildFiles.Add( buildFile );
+							currentObject.Value.AddBuildFile( buildFile );
+						}
+
+						if ( !string.IsNullOrEmpty( absPath ) && File.Exists(absPath) && tree.CompareTo( "SOURCE_ROOT" ) == 0 ) {
+//							UnityEngine.Debug.LogError(absPath);
+							string libraryPath = Path.Combine( "$(SRCROOT)", Path.GetDirectoryName( filePath ) );
+							this.AddLibrarySearchPaths( new PBXList(libraryPath) );
+						}
+						else if (!string.IsNullOrEmpty( absPath ) && Directory.Exists(absPath) && absPath.EndsWith(".framework") && tree.CompareTo("GROUP") == 0) { // Annt: Add framework search path for FacebookSDK
+							string frameworkPath = Path.Combine( "$(SRCROOT)", Path.GetDirectoryName( filePath ) );
+							this.AddFrameworkSearchPaths(new PBXList(frameworkPath));
+						}
+						break;
+					case "PBXResourcesBuildPhase":
+						foreach( KeyValuePair<string, PBXResourcesBuildPhase> currentObject in resourcesBuildPhases ) {
+							buildFile = new PBXBuildFile( fileReference, weak );
+							buildFiles.Add( buildFile );
+							currentObject.Value.AddBuildFile( buildFile );
+						}
+						break;
+					case "PBXShellScriptBuildPhase":
+						foreach( KeyValuePair<string, PBXShellScriptBuildPhase> currentObject in shellScriptBuildPhases ) {
+							buildFile = new PBXBuildFile( fileReference, weak );
+							buildFiles.Add( buildFile );
+							currentObject.Value.AddBuildFile( buildFile );
+						}
+						break;
+					case "PBXSourcesBuildPhase":
+						foreach( KeyValuePair<string, PBXSourcesBuildPhase> currentObject in sourcesBuildPhases ) {
+							buildFile = new PBXBuildFile( fileReference, weak );
+							buildFiles.Add( buildFile );
+							currentObject.Value.AddBuildFile( buildFile );
+						}
+						break;
+					case "PBXCopyFilesBuildPhase":
+						foreach( KeyValuePair<string, PBXCopyFilesBuildPhase> currentObject in copyBuildPhases ) {
+							buildFile = new PBXBuildFile( fileReference, weak );
+							buildFiles.Add( buildFile );
+							currentObject.Value.AddBuildFile( buildFile );
+						}
+						break;
+					case null:
+						UnityEngine.Debug.LogWarning( "fase non supportata null" );
+						break;
+					default:
+						UnityEngine.Debug.LogWarning( "fase non supportata def" );
+						return null;
+				}
+			}
+
+			return results;
+		}
+		
+		public bool AddFolder( string folderPath, PBXGroup parent = null, string[] exclude = null, bool recursive = true, bool createBuildFile = true )
+		{
+			if( !Directory.Exists( folderPath ) )
+				return false;
+			DirectoryInfo sourceDirectoryInfo = new DirectoryInfo( folderPath );
+
+			if( exclude == null )
+				exclude = new string[] {};
+			string regexExclude = string.Format( @"{0}", string.Join( "|", exclude ) );
+			
+//			PBXDictionary results = new PBXDictionary();
+			
+			if( parent == null )
+				parent = rootGroup;
+			
+			// Create group
+			PBXGroup newGroup = GetGroup( sourceDirectoryInfo.Name, null /*relative path*/, parent );
+//			groups.Add( newGroup );
+			
+			foreach( string directory in Directory.GetDirectories( folderPath ) )
+			{
+				if( Regex.IsMatch( directory, regexExclude ) ) {
+					continue;
+				}
+
+//				special_folders = ['.bundle', '.framework', '.xcodeproj']	
+//				UnityEngine.Debug.Log( "DIR: " + directory );
+				if( directory.EndsWith( ".bundle" ) ) {
+					// Treath it like a file and copy even if not recursive
+					UnityEngine.Debug.LogWarning( "This is a special folder: " + directory );
+					AddFile( directory, newGroup, "SOURCE_ROOT", createBuildFile );
+//					UnityEngine.Debug.Log( "fatto" );
+					continue;
+				}
+				
+				if( recursive ) {
+//					UnityEngine.Debug.Log( "recursive" );
+					AddFolder( directory, newGroup, exclude, recursive, createBuildFile );
+				}
+			}
+			// Adding files.
+			foreach( string file in Directory.GetFiles( folderPath ) ) {
+				if( Regex.IsMatch( file, regexExclude ) ) {
+					continue;
+				}
+//				UnityEngine.Debug.Log( "--> " + file + ", " + newGroup );
+				AddFile( file, newGroup, "SOURCE_ROOT", createBuildFile );
+			}
+
+			modified = true;
+			return modified;
+		}
+		
+		#endregion
+		#region Getters
+		public PBXFileReference GetFile( string name )
+		{
+			if( string.IsNullOrEmpty( name ) ) {
+				return null;
+			}
+			
+			foreach( KeyValuePair<string, PBXFileReference> current in fileReferences ) {
+				if( !string.IsNullOrEmpty( current.Value.name ) && current.Value.name.CompareTo( name ) == 0 ) {
+					return current.Value;
+				}
+			}
+			
+			return null;
+		}
+		
+		
+		public PBXGroup GetGroup( string name, string path = null, PBXGroup parent = null )
+		{
+//			UnityEngine.Debug.Log( "GetGroup: " + name + ", " + path + ", " + parent );
+			if( string.IsNullOrEmpty( name ) )
+				return null;
+			
+			if( parent == null )
+				parent = rootGroup;
+			
+			foreach( KeyValuePair<string, PBXGroup> current in groups ) {
+				
+//				UnityEngine.Debug.Log( "current: " + current.Value.guid + ", " + current.Value.name + ", " + current.Value.path + " - " + parent.HasChild( current.Key ) );
+				if( string.IsNullOrEmpty( current.Value.name ) ) { 
+					if( current.Value.path.CompareTo( name ) == 0 && parent.HasChild( current.Key ) ) {
+						return current.Value;
+					}
+				}
+				else if( current.Value.name.CompareTo( name ) == 0 && parent.HasChild( current.Key ) ) {
+					return current.Value;
+				}
+			}
+			
+			PBXGroup result = new PBXGroup( name, path );
+			groups.Add( result );
+			parent.AddChild( result );
+			
+			modified = true;
+			return result;
+		}
+			
+		#endregion
+
+		#region Mods
+		
+		public void ApplyMod( string pbxmod )
+		{
+			XCMod mod = new XCMod( pbxmod );
+			ApplyMod( mod );
+		}
+		
+		public void ApplyMod( XCMod mod )
+		{	
+			PBXGroup modGroup = this.GetGroup( mod.group );
+			
+//			UnityEngine.Debug.Log( "Adding libraries..." );
+//			PBXGroup librariesGroup = this.GetGroup( "Libraries" );
+			foreach( XCModFile libRef in mod.libs ) {
+				string completeLibPath = System.IO.Path.Combine( "usr/lib", libRef.filePath );
+				this.AddFile( completeLibPath, modGroup, "SDKROOT", true, libRef.isWeak );
+			}
+			
+//			UnityEngine.Debug.Log( "Adding frameworks..." );
+			PBXGroup frameworkGroup = this.GetGroup( "Frameworks" );
+			foreach( string framework in mod.frameworks ) {
+				string[] filename = framework.Split( ':' );
+				bool isWeak = ( filename.Length > 1 ) ? true : false;
+				string completePath = System.IO.Path.Combine( "System/Library/Frameworks", filename[0] );
+				this.AddFile( completePath, frameworkGroup, "SDKROOT", true, isWeak );
+			}
+			
+//			UnityEngine.Debug.Log( "Adding files..." );
+//			foreach( string filePath in mod.files ) {
+//				string absoluteFilePath = System.IO.Path.Combine( mod.path, filePath );
+//
+//
+//				if( filePath.EndsWith(".framework") )
+//					this.AddFile( absoluteFilePath, frameworkGroup, "GROUP", true, false);
+//				else
+//					this.AddFile( absoluteFilePath, modGroup );
+//			}
+			
+//			UnityEngine.Debug.Log( "Adding folders..." );
+			foreach( string folderPath in mod.folders ) {
+				string absoluteFolderPath = System.IO.Path.Combine( mod.path, folderPath );
+				this.AddFolder( absoluteFolderPath, modGroup, (string[])mod.excludes.ToArray( typeof(string) ) );
+			}
+			
+//			UnityEngine.Debug.Log( "Adding headerpaths..." );
+			foreach( string headerpath in mod.headerpaths ) {
+				string absoluteHeaderPath = System.IO.Path.Combine( mod.path, headerpath );
+				this.AddHeaderSearchPaths( absoluteHeaderPath );
+			}
+//			UnityEngine.Debug.Log( "Adding librarypaths..." );
+			foreach( string headerpath in mod.librarypaths ) {
+				string absoluteLibraryPath = System.IO.Path.Combine( mod.path, headerpath );
+				this.AddLibrarySearchPaths( absoluteLibraryPath );
+			}
+
+//			UnityEngine.Debug.Log ("Adding Zip...");
+			foreach (string zipPath in mod.zipPaths) {
+
+				string zipFileName = zipPath;
+				string sdkName = zipFileName.Remove(zipFileName.LastIndexOf("."));
+
+				string unzipLoc = mod.path + "/" + zipFileName;
+				string dirpath = this.projectRootPath;
+				ZipHelper zipTool = new ZipHelper();
+				zipTool.UnzipWithPath (unzipLoc, dirpath);
+
+				//删除多余解压文件
+				DirectoryInfo di = new DirectoryInfo(dirpath + "/__MACOSX");
+				di.Delete(true);
+
+				string absoluteFolderPath = System.IO.Path.Combine( this.projectRootPath, sdkName + "/" );
+//				this.AddFolder( absoluteFolderPath, modGroup, (string[])mod.excludes.ToArray( typeof(string) ) );
+				//第二个参数传null,能够在xcode项目再减少一层文件夹
+				this.AddFolder( absoluteFolderPath, null, (string[])mod.excludes.ToArray( typeof(string) ) );
+			}
+
+//			UnityEngine.Debug.Log( "Adding files..." );
+			foreach( string filePath in mod.files ) {
+				//原版为根据.projmods中的files来添加
+//				string absoluteFilePath = System.IO.Path.Combine( mod.path, filePath );
+
+				//对于ShareSDK,由于解压的文件夹已经移动至Xcode根目录,所以要根据根目录路径进行库路径添加
+				string absoluteFilePath = System.IO.Path.Combine(this.projectRootPath, filePath );
+
+				if( filePath.EndsWith(".framework") )
+					this.AddFile( absoluteFilePath, frameworkGroup, "GROUP", true, false);
+				else
+					this.AddFile( absoluteFilePath, modGroup );
+			}
+
+
+//			UnityEngine.Debug.Log( "Configure build settings..." );
+			Hashtable buildSettings = mod.buildSettings;
+			if( buildSettings.ContainsKey("OTHER_LDFLAGS") )
+			{
+//				UnityEngine.Debug.Log( "    Adding other linker flags..." );
+				ArrayList otherLinkerFlags = (ArrayList) buildSettings["OTHER_LDFLAGS"];
+				foreach( string linker in otherLinkerFlags ) 
+				{
+					string _linker = linker;
+					if( !_linker.StartsWith("-") )
+						_linker = "-" + _linker;
+					this.AddOtherLDFlags( _linker );
+				}
+			}
+
+			if( buildSettings.ContainsKey("GCC_ENABLE_CPP_EXCEPTIONS") )
+			{
+//				UnityEngine.Debug.Log( "    GCC_ENABLE_CPP_EXCEPTIONS = " + buildSettings["GCC_ENABLE_CPP_EXCEPTIONS"] );
+				this.GccEnableCppExceptions( (string) buildSettings["GCC_ENABLE_CPP_EXCEPTIONS"] );
+			}
+
+			if( buildSettings.ContainsKey("GCC_ENABLE_OBJC_EXCEPTIONS") )
+			{
+//				UnityEngine.Debug.Log( "    GCC_ENABLE_OBJC_EXCEPTIONS = " + buildSettings["GCC_ENABLE_OBJC_EXCEPTIONS"] );
+				this.GccEnableObjCExceptions( (string) buildSettings["GCC_ENABLE_OBJC_EXCEPTIONS"] );
+			}
+
+			this.Consolidate();
+		}
+		
+		#endregion
+		#region Savings
+			
+		public void Consolidate()
+		{
+			PBXDictionary consolidated = new PBXDictionary();
+			consolidated.Append<PBXBuildFile>( this.buildFiles );
+			consolidated.Append<PBXGroup>( this.groups );
+			consolidated.Append<PBXFileReference>( this.fileReferences );
+//			consolidated.Append<PBXProject>( this.project );
+			consolidated.Append<PBXNativeTarget>( this.nativeTargets );
+			consolidated.Append<PBXFrameworksBuildPhase>( this.frameworkBuildPhases );
+			consolidated.Append<PBXResourcesBuildPhase>( this.resourcesBuildPhases );
+			consolidated.Append<PBXShellScriptBuildPhase>( this.shellScriptBuildPhases );
+			consolidated.Append<PBXSourcesBuildPhase>( this.sourcesBuildPhases );
+			consolidated.Append<PBXCopyFilesBuildPhase>( this.copyBuildPhases );
+			consolidated.Append<XCBuildConfiguration>( this.buildConfigurations );
+			consolidated.Append<XCConfigurationList>( this.configurationLists );
+			consolidated.Add( project.guid, project.data );
+			_objects = consolidated;
+			consolidated = null;
+		}
+		
+		
+		public void Backup()
+		{
+			string backupPath = Path.Combine( this.filePath, "project.backup.pbxproj" );
+			
+			// Delete previous backup file
+			if( File.Exists( backupPath ) )
+				File.Delete( backupPath );
+			
+			// Backup original pbxproj file first
+			File.Copy( System.IO.Path.Combine( this.filePath, "project.pbxproj" ), backupPath );
+		}
+		
+		/// <summary>
+		/// Saves a project after editing.
+		/// </summary>
+		public void Save()
+		{
+			PBXDictionary result = new PBXDictionary();
+			result.Add( "archiveVersion", 1 );
+			result.Add( "classes", new PBXDictionary() );
+			result.Add( "objectVersion", 45 );
+			
+			Consolidate();
+			result.Add( "objects", _objects );
+			
+			result.Add( "rootObject", _rootObjectKey );
+			
+			Backup();
+			
+			// Parse result object directly into file
+			PBXParser parser = new PBXParser();
+			StreamWriter saveFile = File.CreateText( System.IO.Path.Combine( this.filePath, "project.pbxproj" ) );
+			saveFile.Write( parser.Encode( result, false ) );
+			saveFile.Close();
+		
+		}
+		
+		/**
+		* Raw project data.
+		*/
+		public Dictionary<string, object> objects {
+			get {
+				return null;
+			}
+		}
+		
+		
+		#endregion
+
+		public void Dispose()
+		{
+			
+		}
+
+
+
+
+
+
+
+
+
+
+
+	}
+}
+

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCProject.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 99d07ffc2f1ec4dd2a3d4c80a5b81e51
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 15 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCSourceFile.cs

@@ -0,0 +1,15 @@
+using UnityEngine;
+using System.Collections;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class XCSourceFile : System.IDisposable
+	{
+
+		public void Dispose()
+		{
+			
+		}
+		
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCSourceFile.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 88d0290a28a6c4c339fa14fef6465310
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 15 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCTarget.cs

@@ -0,0 +1,15 @@
+using UnityEngine;
+using System.Collections;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class XCTarget : System.IDisposable
+	{
+
+		public void Dispose()
+		{
+			
+		}
+		
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCTarget.cs.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 69423e6564ea64fc3b96ea9a712863e6
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 97 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCodeEditorMenu.cs

@@ -0,0 +1,97 @@
+using UnityEngine;
+using UnityEditor;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+
+namespace cn.sharesdk.unity3d.sdkporter
+{
+	public class XCodeEditorMenu
+	{
+
+		//[MenuItem ("Build Tools/XCode Editor/DebugTest %t")]
+		static void DebugTest()
+		{	
+//			string projectPath = Path.Combine( Directory.GetParent( Application.dataPath ).ToString(), "XCode" );
+//			Debug.Log( "XcodePath: " + projectPath );
+			
+//			XCProject currentProject = new XCProject( projectPath );
+			//XCProject.ApplyMod( projectPath, "/Users/Elyn/Projects/UnityPlugins/Unity Sandbox Project/Assets/Modules/GameCenter/Editor/iOS/GameCenter.projmods" );
+			
+			//Debug.Log(
+//			PBXDictionary test = new PBXDictionary();
+//			bool result = false;
+//			if( test is Dictionary<string, object> )
+//				result = true;
+//			
+//			Debug.Log( result );
+			
+//			PBXType type = new PBXType();
+//			Debug.Log( "TYPE: " + type["isa"] );
+//			
+//			PBXBuildFile build = new PBXBuildFile( "" );
+//			Debug.Log( "BUILDFILE: " + build["isa"] );
+			
+//			Debug.Log( PBXObject.GenerateGuid().ToUpper() );
+//			PBXList testList = currentProject.GetObjectOfType( "XCBuildConfiguration" );
+//			Debug.Log( testList.Count );
+//			Debug.Log( currentProject.rootGroup.guid + " " + currentProject.rootGroup.name + " " + currentProject.rootGroup.path);
+//			string path1 = "Data/mainData";
+
+//			string path2 = "/Users/Elyn/Projects/UnityPlugins/Modules/GameCenter/Editor/iOS/";
+//			Debug.Log( "Objects: " + currentProject._objects.Count );
+//			Debug.Log( "Files: " + currentProject.buildFiles.Count );
+//			Debug.Log( "Groups: " + currentProject.groups.Count );
+//			string[] excludes = new string[] {"^.*\\.meta$", "^.*\\.mdown^", "^.*\\.pdf$"};
+//			currentProject.AddFolder( path2, null, excludes );
+//			currentProject.Consolidate();
+//			Debug.Log( "Objects: " + currentProject._objects.Count );
+//			currentProject.Save();
+			
+			//ALTRO
+//			currentProject.AddOtherCFlags( "TEST_FLAG" );
+//			
+//			foreach( KeyValuePair<string, XCBuildConfiguration> config in currentProject.buildConfigurations ) {
+//				Debug.Log( "C: " + config.Value.buildSettings["OTHER_CFLAGS"] );
+//				foreach( string keys in (PBXList)config.Value.buildSettings["OTHER_CFLAGS"]  )
+//					Debug.Log( keys );
+//			}
+			
+//			currentProject.Save();
+			
+		}
+		
+		
+		//[MenuItem ("Build Tools/XCode Editor/DebugTest2 %y")]
+		static void DebugTest2()
+		{
+			string path1 = "/Users/Elyn/Projects/UnityPlugins/Unity Sandbox Project/Assets/Modules/GameCenter/Editor/iOS/GameCenterManager.m";
+			string path2 = "/Users/Elyn/Projects/UnityPlugins/Unity Sandbox Project/XCode/.";
+			
+			System.Uri fileURI = new System.Uri( path1 );
+			System.Uri rootURI = new System.Uri( path2 );
+			Debug.Log( fileURI.MakeRelativeUri( rootURI ).ToString() );
+			Debug.Log( rootURI.MakeRelativeUri( fileURI ).ToString() );
+			
+//			string projectPath = Path.Combine( Directory.GetParent( Application.dataPath ).ToString(), "XCode" );
+			
+//			string[] files = System.IO.Directory.GetFiles( projectPath, "Info.plist" );
+//			string contents = System.IO.File.OpenText( files[0] ).ReadToEnd();
+			
+//			string[] projects = System.IO.Directory.GetDirectories( projectPath, "*.xcodeproj" );
+//			string projPath = System.IO.Path.Combine( projects[0], "project.pbxproj" );
+//			string contents = System.IO.File.OpenText( projPath ).ReadToEnd();
+//			Debug.Log( System.IO.File.OpenText( projPath ).ReadToEnd );
+
+//			PBXParser parser = new PBXParser();
+//			Hashtable test = (Hashtable)parser.Decode( contents );
+//			PBXDictionary test = parser.Decode( contents );
+//			Debug.Log( MiniJSON.jsonEncode( test ) );
+//			Debug.Log( test + " - " + test.Count );
+//			Debug.Log( parser.Encode( test ) );
+			
+			
+		}
+
+	}
+}

+ 10 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/XCodeEditorMenu.cs.meta

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

+ 103 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/ZipHelper.cs

@@ -0,0 +1,103 @@
+using UnityEngine;
+using System.Collections;
+using System;
+using System.IO;
+using ICSharpCode.SharpZipLib.Checksums;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace cn.sharesdk.unity3d
+{
+
+	public class ZipHelper
+	{
+		public void UnzipWithPath(string path, string dirpath)
+		{
+			//这是根目录的路径  
+			string dirPath = dirpath;
+			//ZipEntry:文件条目 就是该目录下所有的文件列表(也就是所有文件的路径)  
+			ZipEntry zip = null;
+			//输入的所有的文件流都是存储在这里面的  
+			ZipInputStream zipInStream = null;
+			//读取文件流到zipInputStream  
+			zipInStream = new ZipInputStream(File.OpenRead(path));
+			//循环读取Zip目录下的所有文件  
+			while ((zip = zipInStream.GetNextEntry()) != null)
+			{
+				UnzipFile(zip, zipInStream, dirPath);
+			}
+			try
+			{
+				zipInStream.Close();
+			}
+			catch (Exception ex)
+			{
+				Debug.Log("UnZip Error");
+				throw ex;
+			}
+		}
+
+		private void UnzipFile(ZipEntry zip, ZipInputStream zipInStream, string dirPath)
+		{
+			try
+			{
+				//文件名不为空  
+				if (!string.IsNullOrEmpty(zip.Name))
+				{
+					string filePath = dirPath;
+					filePath += ("/" + zip.Name);
+
+					//如果是一个新的文件路径 这里需要创建这个文件路径  
+					if (IsDirectory(filePath))
+					{
+						if (!Directory.Exists(filePath))
+						{
+							Directory.CreateDirectory(filePath);
+						}
+					}
+					else
+					{
+						FileStream fs = null;
+						//当前文件夹下有该文件  删掉  重新创建  
+						if (File.Exists(filePath))
+						{
+							File.Delete(filePath);
+						}
+						fs = File.Create(filePath);
+						int size = 2048;
+						byte[] data = new byte[2048];
+						//每次读取2MB  直到把这个内容读完  
+						while (true)
+						{
+							size = zipInStream.Read(data, 0, data.Length);
+							//小于0, 也就读完了当前的流  
+							if (size > 0)
+							{
+								fs.Write(data, 0, size);
+							}
+							else
+							{
+								break;
+							}
+						}
+						fs.Close();
+					}
+				}
+			}
+			catch (Exception e)
+			{
+				throw new Exception();
+			}
+		}
+			
+		private bool IsDirectory(string path)
+		{
+
+			if (path[path.Length - 1] == '/')
+			{
+				return true;
+			}
+			return false;
+		}
+	}
+
+}

+ 12 - 0
Unity/Assets/Editor/SDKPorter/XCodeEditor/ZipHelper.cs.meta

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

TEMPAT SAMPAH
Unity/Assets/Editor/ShareSDK For Unity3D支持一键打包功能须知.docx


+ 8 - 0
Unity/Assets/Editor/ShareSDK For Unity3D支持一键打包功能须知.docx.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 716e2f2e4d52d4313ad86fce04233fd3
+timeCreated: 1471249147
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 2 - 0
Unity/Assets/ILRuntime/ILRuntime/Runtime/CLRBinding/BindingCodeGenerator.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Reflection;
 using System.Linq;
 using System.Text;
+using Base;
 using ILRuntime.Runtime.Enviorment;
 
 namespace ILRuntime.Runtime.CLRBinding
@@ -27,6 +28,7 @@ namespace ILRuntime.Runtime.CLRBinding
                     continue;
                 GetClassName(i, out clsName, out realClsName, out isByRef);
                 clsNames.Add(clsName);
+				Log.Debug("class " + clsName);
                 using (System.IO.StreamWriter sw = new System.IO.StreamWriter(outputPath + "/" + clsName + ".cs", false, Encoding.UTF8))
                 {
                     sw.Write(@"using System;

+ 7 - 0
Unity/Assets/Plugins/Android.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9bd7c367fb0a40c4fb5b3fb99edbec3e
+folderAsset: yes
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 19 - 0
Unity/Assets/Plugins/Android/ShareSDK.meta

@@ -0,0 +1,19 @@
+fileFormatVersion: 2
+guid: 431bb603be334a64088f26cf2702d333
+folderAsset: yes
+PluginImporter:
+  serializedVersion: 1
+  iconMap: {}
+  executionOrder: {}
+  isPreloaded: 0
+  platformData:
+    Any:
+      enabled: 1
+      settings: {}
+    Editor:
+      enabled: 0
+      settings:
+        DefaultValueInitialized: true
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 80 - 0
Unity/Assets/Plugins/Android/ShareSDK/AndroidManifest.xml

@@ -0,0 +1,80 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="cn.sharesdk.demo"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-permission android:name="android.permission.GET_TASKS" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
+    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
+    <!-- 蓝牙分享所需的权限 -->
+    <uses-permission android:name="android.permission.BLUETOOTH" />
+    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+    
+    <uses-sdk
+        android:minSdkVersion="8"
+        android:targetSdkVersion="17" />
+
+    <application>
+        <activity
+            android:name="com.mob.tools.MobUIShell"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:theme="@android:style/Theme.Translucent.NoTitleBar"
+            android:windowSoftInputMode="stateHidden|adjustResize" >
+			
+            <!--
+            	如果集成QQ分享,或者使用QQ客户端来进行QQ空间的分享,须要在此处添加一个对ACTION_VIEW
+            	事件的过滤器,其中的scheme是“tencent”前缀再开发者应用的加上appId。如果此过滤器不设置,
+            	则分享结束以后不能得到正确的回调
+            -->
+            <intent-filter android:priority="1000" >
+                <data android:scheme="tencent100371282" />
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+            </intent-filter>
+            
+		 				<!-- 新浪回调 -->
+            <intent-filter>
+							 <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
+							 <category android:name="android.intent.category.DEFAULT" />
+						</intent-filter>
+						
+					 <!-- 集成Line客户端登录授权,需要添加如下格式的过滤器 -->
+            <intent-filter android:priority="1000">
+               <action android:name="android.intent.action.VIEW" />
+               <category android:name="android.intent.category.DEFAULT" />
+               <category android:name="android.intent.category.BROWSABLE" />
+  						 <data android:scheme="line.1477692153" />
+            </intent-filter>	
+        </activity>
+		
+        <!-- 微信分享回调 -->
+        <activity
+            android:name=".wxapi.WXEntryActivity"
+            android:theme="@android:style/Theme.Translucent.NoTitleBar"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:exported="true" />
+        <!-- 易信分享回调 -->
+        <activity
+            android:name=".yxapi.YXEntryActivity"
+            android:theme="@android:style/Theme.Translucent.NoTitleBar"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:excludeFromRecents="true"
+            android:exported="true"
+            android:launchMode="singleTop" />			
+        <!-- 支付宝分享回调 -->
+        <activity
+            android:name=".apshare.ShareEntryActivity"
+            android:theme="@android:style/Theme.Translucent.NoTitleBar"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:exported="true"/>
+				
+    </application>
+
+</manifest>

+ 6 - 0
Unity/Assets/Plugins/Android/ShareSDK/AndroidManifest.xml.meta

@@ -0,0 +1,6 @@
+fileFormatVersion: 2
+guid: d116e58a8e42db84d92906e32cb9ec71
+TextScriptImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 7 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d99f5600dd659504d868bd30b0fce8c6
+folderAsset: yes
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/DemoCallback.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/DemoCallback.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 655ab450540b3c6499a087e22324e931
+timeCreated: 1482811318
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/MobCommons-2016.1222.1756.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/MobCommons-2016.1222.1756.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: deaeec5316ff77d499add9449a0dea23
+timeCreated: 1482811319
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/MobTools-2016.1222.1756.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/MobTools-2016.1222.1756.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5b963c5cc93344147a52c383ffb37c29
+timeCreated: 1482811318
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/OneKeyShare.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/OneKeyShare.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2ce91c7ffb8c5e942a6de7e882335955
+timeCreated: 1482811317
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/SSDKU3D.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/SSDKU3D.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a3b4331e55c549944bb1496e8097a54b
+timeCreated: 1482811318
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-2.8.0.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-2.8.0.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ed379b251c8891f4497ca6ac2e527b2b
+timeCreated: 1482811319
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-Core-2.8.0.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-Core-2.8.0.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 44ff469a28acdb047836101f75cb5acc
+timeCreated: 1482811317
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-Moments-2.8.0.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Alipay-Moments-2.8.0.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 27232e173417a6f489a9941ec85fae25
+timeCreated: 1482811317
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Core-2.8.0.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Core-2.8.0.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: edfaa612b64159944ab4d9c582175526
+timeCreated: 1482811319
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Douban-2.8.0.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Douban-2.8.0.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5f52904180e12234bbb45a0104f173c2
+timeCreated: 1482811318
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Dropbox-2.8.0.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Dropbox-2.8.0.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 190fd4cfa39dff543bcda96be89c9c4a
+timeCreated: 1482811317
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Email-2.8.0.jar


+ 8 - 0
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Email-2.8.0.jar.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ef27b3b72844dba44907da2993a9bc60
+timeCreated: 1482811319
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

TEMPAT SAMPAH
Unity/Assets/Plugins/Android/ShareSDK/libs/ShareSDK-Evernote-2.8.0.jar


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini