wangguan
2020-10-22 7a007a8d1e7cd712fa4571efdbc3f2eba7a7e4d0
增加事件中心,修改登录
1 files renamed
7 files deleted
28 files added
4 files modified
2681 ■■■■ changed files
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/TalkingDataGA.h 221 ●●●●● patch | view | raw | blame | history
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/TalkingDataGA.h.meta 27 ●●●●● patch | view | raw | blame | history
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/TalkingDataGA.mm 148 ●●●●● patch | view | raw | blame | history
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/TalkingDataGA.mm.meta 37 ●●●●● patch | view | raw | blame | history
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/libTalkingDataGA.a patch | view | raw | blame | history
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/libTalkingDataGA.a.meta 27 ●●●●● patch | view | raw | blame | history
Assets/GameAnalytics_SDK_Unity-master/TalkingDataScripts/TDGADemoScript.cs 14 ●●●● patch | view | raw | blame | history
Assets/Scenes/LoadingScene.unity 342 ●●●●● patch | view | raw | blame | history
Assets/Scenes/TestTalkingData.unity 313 ●●●●● patch | view | raw | blame | history
Assets/Scenes/TestTalkingData.unity.meta 7 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Common/CommonDebugHelper.cs 162 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Common/CommonDebugHelper.cs.meta 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Common/DoNotDestory.cs 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Common/DoNotDestory.cs.meta 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Common/GameConfig.cs 6 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Event.meta 8 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Event/EventBase.cs 303 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Event/EventBase.cs.meta 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Event/EventCenter.cs 17 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Event/EventCenter.cs.meta 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Event/EventType.cs 14 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Event/EventType.cs.meta 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Event/SocketEvent.cs 14 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Event/SocketEvent.cs.meta 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/GameAnalytics_SDK/GA_SDK_Manager.cs 55 ●●●●● patch | view | raw | blame | history
Assets/Scripts/GameAnalytics_SDK/GA_SDK_Manager.cs.meta patch | view | raw | blame | history
Assets/Scripts/GameAnalytics_SDK/GameAnalytics_SDK_Main.cs 20 ●●●●● patch | view | raw | blame | history
Assets/Scripts/GameAnalytics_SDK/UI.meta 8 ●●●●● patch | view | raw | blame | history
Assets/Scripts/GameAnalytics_SDK/UI/LoginUI.cs 249 ●●●●● patch | view | raw | blame | history
Assets/Scripts/GameAnalytics_SDK/UI/LoginUI.cs.meta 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Manager.meta 8 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Manager/ManagerRoot.cs 58 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Manager/ManagerRoot.cs.meta 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Net/BaseSocket.cs 362 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Net/BaseSocket.cs.meta 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Net/CircleBuffer.cs 64 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Net/CircleBuffer.cs.meta 11 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Net/MasterSocket.cs 62 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Net/MasterSocket.cs.meta 11 ●●●●● patch | view | raw | blame | history
ProjectSettings/EditorBuildSettings.asset 3 ●●●●● patch | view | raw | blame | history
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/TalkingDataGA.h
File was deleted
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/TalkingDataGA.h.meta
File was deleted
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/TalkingDataGA.mm
File was deleted
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/TalkingDataGA.mm.meta
File was deleted
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/libTalkingDataGA.a
Binary files differ
Assets/GameAnalytics_SDK_Unity-master/Plugins/iOS/libTalkingDataGA.a.meta
File was deleted
Assets/GameAnalytics_SDK_Unity-master/TalkingDataScripts/TDGADemoScript.cs
@@ -26,7 +26,7 @@
        }
        GUI.Label(new Rect(left, top + (step * i++), width, height), oaid);
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "getOAID"))
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "getOAID"))//由于IMEI属于隐私,高版本安卓 不支持获取
        {
            oaid = TalkingDataGA.GetOAID();
        }
@@ -81,7 +81,7 @@
            }
        }
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "Set Game Server"))
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "设置区服"))
        {
            if (account != null)
            {
@@ -104,27 +104,27 @@
            TDGAMission.OnFailed("miss001", "failed");
        }
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "Charge Request"))
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "充值"))
        {
            TDGAVirtualCurrency.OnChargeRequest("order01", "iap", 10, "CNY", 10, "UnionPay");
        }
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "Charge Success"))
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "充值 Success"))
        {
            TDGAVirtualCurrency.OnChargeSuccess("order01");
        }
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "Reward"))
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "追踪获赠的虚拟币"))
        {
            TDGAVirtualCurrency.OnReward(100, "reason");
        }
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "Item Purchase"))
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "记录付费点"))
        {
            TDGAItem.OnPurchase("itemid001", 10, 10);
        }
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "Item Use"))
        if (GUI.Button(new Rect(left, top + (step * i++), width, height), "消耗物品或服务等"))
        {
            TDGAItem.OnUse("itemid001", 1);
        }
Assets/Scenes/LoadingScene.unity
@@ -123,6 +123,49 @@
    debug:
      m_Flags: 0
  m_NavMeshData: {fileID: 0}
--- !u!1 &205049503
GameObject:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  serializedVersion: 6
  m_Component:
  - component: {fileID: 205049505}
  - component: {fileID: 205049504}
  m_Layer: 0
  m_Name: ManagerRoot
  m_TagString: Untagged
  m_Icon: {fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!114 &205049504
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 205049503}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: a2dbd68be62ff4e4dbab85b3bbae1547, type: 3}
  m_Name:
  m_EditorClassIdentifier:
--- !u!4 &205049505
Transform:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 205049503}
  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {x: 360, y: 640, z: 0}
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_Children: []
  m_Father: {fileID: 0}
  m_RootOrder: 2
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &295245702
GameObject:
  m_ObjectHideFlags: 0
@@ -271,6 +314,7 @@
  - component: {fileID: 501810473}
  - component: {fileID: 501810472}
  - component: {fileID: 501810471}
  - component: {fileID: 501810475}
  m_Layer: 5
  m_Name: MainUI
  m_TagString: Untagged
@@ -350,14 +394,30 @@
  m_LocalScale: {x: 0, y: 0, z: 0}
  m_Children:
  - {fileID: 2083383110}
  - {fileID: 1805855186}
  m_Father: {fileID: 0}
  m_RootOrder: 2
  m_RootOrder: 3
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
  m_AnchorMin: {x: 0, y: 0}
  m_AnchorMax: {x: 0, y: 0}
  m_AnchoredPosition: {x: 0, y: 0}
  m_SizeDelta: {x: 0, y: 0}
  m_Pivot: {x: 0, y: 0}
--- !u!114 &501810475
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 501810470}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 5671a738ca063f047a1619ba0c199f45, type: 3}
  m_Name:
  m_EditorClassIdentifier:
  imei0:
  imei1:
  meid:
--- !u!1 &901340337
GameObject:
  m_ObjectHideFlags: 0
@@ -450,6 +510,205 @@
  m_Father: {fileID: 0}
  m_RootOrder: 1
  m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
--- !u!1 &1121951090
GameObject:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  serializedVersion: 6
  m_Component:
  - component: {fileID: 1121951091}
  - component: {fileID: 1121951093}
  - component: {fileID: 1121951092}
  m_Layer: 5
  m_Name: Text
  m_TagString: Untagged
  m_Icon: {fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!224 &1121951091
RectTransform:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1121951090}
  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
  m_LocalPosition: {x: 0, y: 0, z: 0}
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_Children: []
  m_Father: {fileID: 1495759452}
  m_RootOrder: 0
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
  m_AnchorMin: {x: 0, y: 0}
  m_AnchorMax: {x: 1, y: 1}
  m_AnchoredPosition: {x: 0, y: 0}
  m_SizeDelta: {x: 0, y: 0}
  m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1121951092
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1121951090}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
  m_Name:
  m_EditorClassIdentifier:
  m_Material: {fileID: 0}
  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
  m_RaycastTarget: 1
  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
  m_Maskable: 1
  m_OnCullStateChanged:
    m_PersistentCalls:
      m_Calls: []
  m_FontData:
    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
    m_FontSize: 22
    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: Login
--- !u!222 &1121951093
CanvasRenderer:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1121951090}
  m_CullTransparentMesh: 0
--- !u!1 &1495759451
GameObject:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  serializedVersion: 6
  m_Component:
  - component: {fileID: 1495759452}
  - component: {fileID: 1495759455}
  - component: {fileID: 1495759454}
  - component: {fileID: 1495759453}
  m_Layer: 5
  m_Name: Button
  m_TagString: Untagged
  m_Icon: {fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!224 &1495759452
RectTransform:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1495759451}
  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {x: 0, y: 0, z: 0}
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_Children:
  - {fileID: 1121951091}
  m_Father: {fileID: 1805855186}
  m_RootOrder: 0
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
  m_AnchorMin: {x: 0.5, y: 0.5}
  m_AnchorMax: {x: 0.5, y: 0.5}
  m_AnchoredPosition: {x: 0, y: 0}
  m_SizeDelta: {x: 160, y: 50}
  m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1495759453
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1495759451}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, 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_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
    m_ColorMultiplier: 1
    m_FadeDuration: 0.1
  m_SpriteState:
    m_HighlightedSprite: {fileID: 0}
    m_PressedSprite: {fileID: 0}
    m_SelectedSprite: {fileID: 0}
    m_DisabledSprite: {fileID: 0}
  m_AnimationTriggers:
    m_NormalTrigger: Normal
    m_HighlightedTrigger: Highlighted
    m_PressedTrigger: Pressed
    m_SelectedTrigger: Selected
    m_DisabledTrigger: Disabled
  m_Interactable: 1
  m_TargetGraphic: {fileID: 1495759454}
  m_OnClick:
    m_PersistentCalls:
      m_Calls: []
--- !u!114 &1495759454
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1495759451}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
  m_Name:
  m_EditorClassIdentifier:
  m_Material: {fileID: 0}
  m_Color: {r: 1, g: 1, b: 1, a: 1}
  m_RaycastTarget: 1
  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
  m_Maskable: 1
  m_OnCullStateChanged:
    m_PersistentCalls:
      m_Calls: []
  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
  m_Type: 1
  m_PreserveAspect: 0
  m_FillCenter: 1
  m_FillMethod: 4
  m_FillAmount: 1
  m_FillClockwise: 1
  m_FillOrigin: 0
  m_UseSpriteMesh: 0
  m_PixelsPerUnitMultiplier: 1
--- !u!222 &1495759455
CanvasRenderer:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1495759451}
  m_CullTransparentMesh: 0
--- !u!1 &1575693006
GameObject:
  m_ObjectHideFlags: 0
@@ -514,7 +773,7 @@
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_Children: []
  m_Father: {fileID: 0}
  m_RootOrder: 3
  m_RootOrder: 4
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1601526459
GameObject:
@@ -718,6 +977,82 @@
  m_Father: {fileID: 0}
  m_RootOrder: 0
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1805855185
GameObject:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  serializedVersion: 6
  m_Component:
  - component: {fileID: 1805855186}
  - component: {fileID: 1805855188}
  - component: {fileID: 1805855187}
  m_Layer: 5
  m_Name: Panel
  m_TagString: Untagged
  m_Icon: {fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!224 &1805855186
RectTransform:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1805855185}
  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {x: 0, y: 0, z: 0}
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_Children:
  - {fileID: 1495759452}
  m_Father: {fileID: 501810474}
  m_RootOrder: 1
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
  m_AnchorMin: {x: 0, y: 0}
  m_AnchorMax: {x: 1, y: 1}
  m_AnchoredPosition: {x: 0, y: 0}
  m_SizeDelta: {x: 0, y: 0}
  m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1805855187
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1805855185}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
  m_Name:
  m_EditorClassIdentifier:
  m_Material: {fileID: 0}
  m_Color: {r: 1, g: 1, b: 1, a: 0.392}
  m_RaycastTarget: 1
  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
  m_Maskable: 1
  m_OnCullStateChanged:
    m_PersistentCalls:
      m_Calls: []
  m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
  m_Type: 1
  m_PreserveAspect: 0
  m_FillCenter: 1
  m_FillMethod: 4
  m_FillAmount: 1
  m_FillClockwise: 1
  m_FillOrigin: 0
  m_UseSpriteMesh: 0
  m_PixelsPerUnitMultiplier: 1
--- !u!222 &1805855188
CanvasRenderer:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1805855185}
  m_CullTransparentMesh: 0
--- !u!1 &2083383109
GameObject:
  m_ObjectHideFlags: 0
@@ -803,10 +1138,9 @@
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 2083383109}
  m_Enabled: 1
  m_Enabled: 0
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 1c3c4a281008bfb42a6882852b64f3b7, type: 3}
  m_Name: 
  m_EditorClassIdentifier: 
  loadingTxt: {fileID: 295245704}
  nextSceneName: Endless
Assets/Scenes/TestTalkingData.unity
New file
@@ -0,0 +1,313 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_OcclusionBakeSettings:
    smallestOccluder: 5
    smallestHole: 0.25
    backfaceThreshold: 100
  m_SceneGUID: 00000000000000000000000000000000
  m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 9
  m_Fog: 0
  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
  m_FogMode: 3
  m_FogDensity: 0.01
  m_LinearFogStart: 0
  m_LinearFogEnd: 300
  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
  m_AmbientIntensity: 1
  m_AmbientMode: 0
  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
  m_HaloStrength: 0.5
  m_FlareStrength: 1
  m_FlareFadeSpeed: 3
  m_HaloTexture: {fileID: 0}
  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
  m_DefaultReflectionMode: 0
  m_DefaultReflectionResolution: 128
  m_ReflectionBounces: 1
  m_ReflectionIntensity: 1
  m_CustomReflection: {fileID: 0}
  m_Sun: {fileID: 0}
  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
  m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 12
  m_GIWorkflowMode: 1
  m_GISettings:
    serializedVersion: 2
    m_BounceScale: 1
    m_IndirectOutputScale: 1
    m_AlbedoBoost: 1
    m_EnvironmentLightingMode: 0
    m_EnableBakedLightmaps: 1
    m_EnableRealtimeLightmaps: 0
  m_LightmapEditorSettings:
    serializedVersion: 12
    m_Resolution: 2
    m_BakeResolution: 40
    m_AtlasSize: 1024
    m_AO: 0
    m_AOMaxDistance: 1
    m_CompAOExponent: 1
    m_CompAOExponentDirect: 0
    m_ExtractAmbientOcclusion: 0
    m_Padding: 2
    m_LightmapParameters: {fileID: 0}
    m_LightmapsBakeMode: 1
    m_TextureCompression: 1
    m_FinalGather: 0
    m_FinalGatherFiltering: 1
    m_FinalGatherRayCount: 256
    m_ReflectionCompression: 2
    m_MixedBakeMode: 2
    m_BakeBackend: 1
    m_PVRSampling: 1
    m_PVRDirectSampleCount: 32
    m_PVRSampleCount: 512
    m_PVRBounces: 2
    m_PVREnvironmentSampleCount: 256
    m_PVREnvironmentReferencePointCount: 2048
    m_PVRFilteringMode: 1
    m_PVRDenoiserTypeDirect: 1
    m_PVRDenoiserTypeIndirect: 1
    m_PVRDenoiserTypeAO: 1
    m_PVRFilterTypeDirect: 0
    m_PVRFilterTypeIndirect: 0
    m_PVRFilterTypeAO: 0
    m_PVREnvironmentMIS: 1
    m_PVRCulling: 1
    m_PVRFilteringGaussRadiusDirect: 1
    m_PVRFilteringGaussRadiusIndirect: 5
    m_PVRFilteringGaussRadiusAO: 2
    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
    m_PVRFilteringAtrousPositionSigmaIndirect: 2
    m_PVRFilteringAtrousPositionSigmaAO: 1
    m_ExportTrainingData: 0
    m_TrainingDataDestination: TrainingData
    m_LightProbeSampleCountMultiplier: 4
  m_LightingDataAsset: {fileID: 0}
  m_LightingSettings: {fileID: 0}
--- !u!196 &4
NavMeshSettings:
  serializedVersion: 2
  m_ObjectHideFlags: 0
  m_BuildSettings:
    serializedVersion: 2
    agentTypeID: 0
    agentRadius: 0.5
    agentHeight: 2
    agentSlope: 45
    agentClimb: 0.4
    ledgeDropHeight: 0
    maxJumpAcrossDistance: 0
    minRegionArea: 2
    manualCellSize: 0
    cellSize: 0.16666667
    manualTileSize: 0
    tileSize: 256
    accuratePlacement: 0
    maxJobWorkers: 0
    preserveTilesOutsideBounds: 0
    debug:
      m_Flags: 0
  m_NavMeshData: {fileID: 0}
--- !u!1 &1424913889
GameObject:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  serializedVersion: 6
  m_Component:
  - component: {fileID: 1424913892}
  - component: {fileID: 1424913891}
  - component: {fileID: 1424913890}
  m_Layer: 0
  m_Name: Directional Light
  m_TagString: Untagged
  m_Icon: {fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!114 &1424913890
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1424913889}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 7f8ff66103660e04096defa0bf88ae0b, type: 3}
  m_Name:
  m_EditorClassIdentifier:
--- !u!108 &1424913891
Light:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1424913889}
  m_Enabled: 1
  serializedVersion: 10
  m_Type: 1
  m_Shape: 0
  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
  m_Intensity: 1
  m_Range: 10
  m_SpotAngle: 30
  m_InnerSpotAngle: 21.80208
  m_CookieSize: 10
  m_Shadows:
    m_Type: 2
    m_Resolution: -1
    m_CustomResolution: -1
    m_Strength: 1
    m_Bias: 0.05
    m_NormalBias: 0.4
    m_NearPlane: 0.2
    m_CullingMatrixOverride:
      e00: 1
      e01: 0
      e02: 0
      e03: 0
      e10: 0
      e11: 1
      e12: 0
      e13: 0
      e20: 0
      e21: 0
      e22: 1
      e23: 0
      e30: 0
      e31: 0
      e32: 0
      e33: 1
    m_UseCullingMatrixOverride: 0
  m_Cookie: {fileID: 0}
  m_DrawHalo: 0
  m_Flare: {fileID: 0}
  m_RenderMode: 0
  m_CullingMask:
    serializedVersion: 2
    m_Bits: 4294967295
  m_RenderingLayerMask: 1
  m_Lightmapping: 4
  m_LightShadowCasterMode: 0
  m_AreaSize: {x: 1, y: 1}
  m_BounceIntensity: 1
  m_ColorTemperature: 6570
  m_UseColorTemperature: 0
  m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
  m_UseBoundingSphereOverride: 0
  m_ShadowRadius: 0
  m_ShadowAngle: 0
--- !u!4 &1424913892
Transform:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1424913889}
  m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
  m_LocalPosition: {x: 0, y: 3, z: 0}
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_Children: []
  m_Father: {fileID: 0}
  m_RootOrder: 1
  m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
--- !u!1 &1771890347
GameObject:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  serializedVersion: 6
  m_Component:
  - component: {fileID: 1771890350}
  - component: {fileID: 1771890349}
  - component: {fileID: 1771890348}
  m_Layer: 0
  m_Name: Main Camera
  m_TagString: MainCamera
  m_Icon: {fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!81 &1771890348
AudioListener:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1771890347}
  m_Enabled: 1
--- !u!20 &1771890349
Camera:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1771890347}
  m_Enabled: 1
  serializedVersion: 2
  m_ClearFlags: 1
  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
  m_projectionMatrixMode: 1
  m_GateFitMode: 2
  m_FOVAxisMode: 0
  m_SensorSize: {x: 36, y: 24}
  m_LensShift: {x: 0, y: 0}
  m_FocalLength: 50
  m_NormalizedViewPortRect:
    serializedVersion: 2
    x: 0
    y: 0
    width: 1
    height: 1
  near clip plane: 0.3
  far clip plane: 1000
  field of view: 60
  orthographic: 0
  orthographic size: 5
  m_Depth: -1
  m_CullingMask:
    serializedVersion: 2
    m_Bits: 4294967295
  m_RenderingPath: -1
  m_TargetTexture: {fileID: 0}
  m_TargetDisplay: 0
  m_TargetEye: 3
  m_HDR: 1
  m_AllowMSAA: 1
  m_AllowDynamicResolution: 0
  m_ForceIntoRT: 0
  m_OcclusionCulling: 1
  m_StereoConvergence: 10
  m_StereoSeparation: 0.022
--- !u!4 &1771890350
Transform:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 1771890347}
  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {x: 0, y: 1, z: -10}
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_Children: []
  m_Father: {fileID: 0}
  m_RootOrder: 0
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
Assets/Scenes/TestTalkingData.unity.meta
New file
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 415e09a546f94cf4b883227ff1be6086
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Common/CommonDebugHelper.cs
New file
@@ -0,0 +1,162 @@
using Protobuf;
using UnityEngine;
namespace KTGMGemClient
{
    public class CommonDebugHelper
    {
        public static void Debug(object str)
        {
            if (GameConfig.OpenDebug)
            {
                UnityEngine.Debug.Log(str);
            }
        }
        public static void DebugLong(string str)
        {
            if (GameConfig.OpenDebug)
            {
                UnityEngine.Debug.Log("************** " + str + " **************");
            }
        }
        public static void DebugError(string str)
        {
            if (GameConfig.OpenDebug)
            {
                UnityEngine.Debug.LogError(str);
            }
        }
        public static void DebugSocket(int Errorcode)
        {
            string log = "";
            ErrorCode code = (ErrorCode)Errorcode;
            if (GameConfig.OpenDebug)
            {
                switch (code)
                {
                    case ErrorCode.Success:
                        log = "成功";
                        UnityEngine.Debug.Log("成功");
                        break;
                    case ErrorCode.ChannelIdNoExist:
                        log = "**************   渠道ID不存在  **************";
                        UnityEngine.Debug.LogWarning("**************   渠道ID不存在  **************");
                        break;
                    case ErrorCode.UserNameInvalid:
                        log = "**************   账号名太短  **************";
                        UnityEngine.Debug.LogWarning("**************   账号名太短  **************");
                        break;
                    case ErrorCode.UserPassWordInvalid:
                        log = "**************   账号密码不正确  **************";
                        UnityEngine.Debug.LogWarning("**************   账号密码不正确  **************");
                        break;
                    case ErrorCode.UnknowError:
                        log = "**************   内部错误  **************";
                        UnityEngine.Debug.LogWarning("**************   内部错误  **************");
                        break;
                    case ErrorCode.InputInvalid:
                        log = "**************   参数错误  **************";
                        UnityEngine.Debug.LogWarning("**************   参数错误  **************");
                        break;
                    case ErrorCode.Timeout:
                        log = "**************   超时  **************";
                        UnityEngine.Debug.LogWarning("**************   超时  **************");
                        break;
                    case ErrorCode.SessionKeyInvalid:
                        log = "**************   登陆失败,SessionKey错误  **************";
                        UnityEngine.Debug.LogWarning("**************   登陆失败,SessionKey错误  **************");
                        break;
                    case ErrorCode.LoginNoUser:
                        log = "**************   没有角色,请创建  **************";
                        UnityEngine.Debug.LogWarning("**************   没有角色,请创建  **************");
                        break;
                    case ErrorCode.NotEnoughMoney:
                        log = "**************   金币不足  **************";
                        UnityEngine.Debug.LogWarning("**************   金币不足  **************");
                        break;
                    case ErrorCode.NotEnoughGold:
                        log = "**************   钻石不足  **************";
                        UnityEngine.Debug.LogWarning("**************   钻石不足  **************");
                        break;
                    case ErrorCode.NotEnoughGem:
                        log = "**************   宝石不足  **************";
                        UnityEngine.Debug.LogWarning("**************   宝石不足  **************");
                        break;
                    case ErrorCode.NotFoundFriend:
                        log = "**************   好友没有找到  **************";
                        UnityEngine.Debug.LogWarning("**************   好友没有找到  **************");
                        break;
                    case ErrorCode.AlreadyFriend:
                        log = "**************   已经是好友了  **************";
                        UnityEngine.Debug.LogWarning("**************   已经是好友了  **************");
                        break;
                    case ErrorCode.InBlockFriend:
                        log = "**************   黑名单不能添加好友  **************";
                        UnityEngine.Debug.LogWarning("**************   黑名单不能添加好友  **************");
                        break;
                    case ErrorCode.MaxFriend:
                        log = "**************   好友已经达到上限  **************";
                        UnityEngine.Debug.LogWarning("**************   好友已经达到上限  **************");
                        break;
                    case ErrorCode.MaxNickName:
                        log = "**************   昵称大于最大长度  **************";
                        UnityEngine.Debug.LogWarning("**************   昵称大于最大长度  **************");
                        break;
                    case ErrorCode.InvalidNickName:
                        log = "**************   昵称有非法字符  **************";
                        UnityEngine.Debug.LogWarning("**************   昵称有非法字符  **************");
                        break;
                    case ErrorCode.MaxStoreLimit:
                        log = "**************   !购买失败,超过最大限制  **************";
                        UnityEngine.Debug.LogWarning("**************   !购买失败,超过最大限制  **************");
                        break;
                    case ErrorCode.NotEnoughStoreBuy:
                        log = "**************   !购买失败,货币不足  **************";
                        UnityEngine.Debug.LogWarning("**************   !购买失败,货币不足  **************");
                        break;
                    case ErrorCode.NotOpenPassPort:
                        log = "**************   !高级通行证购买失败,活动未开启  **************";
                        UnityEngine.Debug.LogWarning("**************   !高级通行证购买失败,活动未开启  **************");
                        break;
                    case ErrorCode.AlreadyPassPort:
                        log = "**************   !高级通行证购买失败,已经购买了  **************";
                        UnityEngine.Debug.LogWarning("**************   !高级通行证购买失败,已经购买了  **************");
                        break;
                    case ErrorCode.NeedVipPassPortTakeItem:
                        log = "**************   !领取通行证奖励失败,不是高级通行证  **************";
                        UnityEngine.Debug.LogWarning("**************   !领取通行证奖励失败,不是高级通行证  **************");
                        break;
                    case ErrorCode.NeedLevelPassPortTakeItem:
                        log = "**************   !领取通行证奖励失败,等级不足  **************";
                        UnityEngine.Debug.LogWarning("**************   !领取通行证奖励失败,等级不足  **************");
                        break;
                    case ErrorCode.AlreadyPassPortTakeItem:
                        log = "**************   !领取通行证奖励失败,已经领取了  **************";
                        UnityEngine.Debug.LogWarning("**************   !领取通行证奖励失败,已经领取了  **************");
                        break;
                    case ErrorCode.InvalidPassPortBuyLevel:
                        log = "**************   !购买通行证等级失败,购买等级小于当前等级  **************";
                        UnityEngine.Debug.LogWarning("**************   !购买通行证等级失败,购买等级小于当前等级  **************");
                        break;
                    case ErrorCode.HasUnlockArenaBox:
                        log = "**************   ! 解锁失败,已经解锁了 **************";
                        UnityEngine.Debug.LogWarning("**************   ! 解锁失败,已经解锁了  **************");
                        break;
                    case ErrorCode.OtherUnlockingArenaBox:
                        log = "**************   ! 解锁失败,另一个在解锁中 **************";
                        UnityEngine.Debug.LogWarning("**************   ! 解锁失败,另一个在解锁中  **************");
                        break;
                    case ErrorCode.NotTimeTakeArenaBox:
                        log = "**************   ! 开宝箱失败,时间没到 **************";
                        UnityEngine.Debug.LogWarning("**************   ! 开宝箱失败,时间没到  **************");
                        break;
                }
                //UIManager.Instance.ShowWarningWind(log);
            }
        }
    }
}
Assets/Scripts/Common/CommonDebugHelper.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: dd0cad843edf8c9468d7eb9c1c57fc1a
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Common/DoNotDestory.cs
New file
@@ -0,0 +1,11 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoNotDestory : MonoBehaviour
{
    public void Awake()
    {
        DontDestroyOnLoad(gameObject);
    }
}
Assets/Scripts/Common/DoNotDestory.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c0ec5249539813840acdad1e0bb1e045
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Common/GameConfig.cs
@@ -11,5 +11,11 @@
        /// LoadingScene 载入下一个场景的场景名
        /// </summary>
        public static string NextSceneName = "GemBattle";
        public static bool IsDebug = false;
        public static string TestLoginUrl = "http://10.5.3.227:9000/user/login";
        public static string LoginUrl = "http://172.16.1.52:9000/user/login";
        public static bool OpenDebug = true;
    }
}
Assets/Scripts/Event.meta
New file
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0236bbcdc61fb3e42bc1983e0f745ff7
folderAsset: yes
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Event/EventBase.cs
New file
@@ -0,0 +1,303 @@
using System;
using System.Collections.Generic;
namespace KTGMGemClient
{
    /// <summary>
    /// 事件中心基类
    /// </summary>
    public class EventBase
    {
        //携带不同参数个数的委托(系统自带的Action 只有四个参数)
        public delegate void CallBack();
        public delegate void CallBack<T>(T arg);
        public delegate void CallBack<T, X>(T arg1, X arg2);
        public delegate void CallBack<T, X, Y>(T arg1, X arg2, Y arg3);
        public delegate void CallBack<T, X, Y, Z>(T arg1, X arg2, Y arg3, Z arg4);
        public delegate void CallBack<T, X, Y, Z, W>(T arg1, X arg2, Y arg3, Z arg4, W arg5);
        //存放各种事件的字典
        protected Dictionary<int, Delegate> m_EventTable = new Dictionary<int, Delegate>();
        #region 私有方法
        private void OnListenerAdding(int eventType, Delegate callback)
        {
            if (!m_EventTable.ContainsKey(eventType))
            {
                m_EventTable.Add(eventType, null);
            }
            Delegate del = m_EventTable[eventType];
            //判断该事件码对应的事件类型(参数)是否一样
            if (del != null && del.GetType() != callback.GetType())
            {
                throw new Exception(string.Format("尝试添加事件失败"));
            }
        }
        private void OnListenerRemoving(int eventType, Delegate callback)
        {
            if (m_EventTable.ContainsKey(eventType))
            {
                Delegate del = m_EventTable[eventType];
                if (del == null)
                {
                    throw new Exception(string.Format("移除失败,对应事件为空"));
                }
                else if (del.GetType() != callback.GetType())
                {
                    throw new Exception(string.Format("移除失败,对应事件不同"));
                }
            }
            else
            {
                throw new Exception(string.Format("移除失败,事件码为空"));
            }
        }
        private void OnListenerRemoved(int eventType)
        {
            if (m_EventTable[eventType] == null)
            {
                m_EventTable.Remove(eventType);
            }
        }
        #endregion
        //下面方法自行扩展
        #region 没有参数,只传回调
        //添加事件
        public void Add(int eventType, CallBack callback)
        {
            OnListenerAdding(eventType, callback);
            m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callback;
        }
        //移除事件
        public void Remove(int eventType, CallBack callback)
        {
            OnListenerRemoving(eventType, callback);
            m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callback;
            OnListenerRemoved(eventType);
        }
        //事件的广播
        public void BroadCast(int eventType)
        {
            Delegate del;
            if (m_EventTable.TryGetValue(eventType, out del))
            {
                CallBack callback = del as CallBack;
                if (callback != null)
                {
                    callback();
                }
                else
                {
                    throw new Exception(string.Format("广播事件错误,对应事件为空"));
                }
            }
        }
        #endregion
        #region 一个参数
        //添加事件
        public void Add<T>(int eventType, CallBack<T> callback)
        {
            OnListenerAdding(eventType, callback);
            m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] + callback;
        }
        //移除事件
        public void Remove<T>(int eventType, CallBack<T> callback)
        {
            OnListenerRemoving(eventType, callback);
            m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] - callback;
            OnListenerRemoved(eventType);
        }
        //事件的广播
        public void BroadCast<T>(int eventType, T arg)
        {
            Delegate del;
            if (m_EventTable.TryGetValue(eventType, out del))
            {
                CallBack<T> callback = del as CallBack<T>;
                if (callback != null)
                {
                    callback(arg);
                }
                else
                {
                    throw new Exception(string.Format("广播事件错误,对应事件为空"));
                }
            }
        }
        #endregion
        #region 两个参数
        //添加事件
        public void Add<T, X>(int eventType, CallBack<T, X> callback)
        {
            OnListenerAdding(eventType, callback);
            m_EventTable[eventType] = (CallBack<T, X>)m_EventTable[eventType] + callback;
        }
        //移除事件
        public void Remove<T, X>(int eventType, CallBack<T, X> callback)
        {
            OnListenerRemoving(eventType, callback);
            m_EventTable[eventType] = (CallBack<T, X>)m_EventTable[eventType] - callback;
            OnListenerRemoved(eventType);
        }
        //事件的广播
        public void BroadCast<T, X>(int eventType, T arg1, X arg2)
        {
            Delegate del;
            if (m_EventTable.TryGetValue(eventType, out del))
            {
                CallBack<T, X> callback = del as CallBack<T, X>;
                if (callback != null)
                {
                    callback(arg1, arg2);
                }
                else
                {
                    throw new Exception(string.Format("广播事件错误,对应事件为空"));
                }
            }
        }
        #endregion
        #region 三个参数
        //添加事件
        public void Add<T, X, Y>(int eventType, CallBack<T, X, Y> callback)
        {
            OnListenerAdding(eventType, callback);
            m_EventTable[eventType] = (CallBack<T, X, Y>)m_EventTable[eventType] + callback;
        }
        //移除事件
        public void Remove<T, X, Y>(int eventType, CallBack<T, X, Y> callback)
        {
            OnListenerRemoving(eventType, callback);
            m_EventTable[eventType] = (CallBack<T, X, Y>)m_EventTable[eventType] - callback;
            OnListenerRemoved(eventType);
        }
        //事件的广播
        public void BroadCast<T, X, Y>(int eventType, T arg1, X arg2, Y arg3)
        {
            Delegate del;
            if (m_EventTable.TryGetValue(eventType, out del))
            {
                CallBack<T, X, Y> callback = del as CallBack<T, X, Y>;
                if (callback != null)
                {
                    callback(arg1, arg2, arg3);
                }
                else
                {
                    throw new Exception(string.Format("广播事件错误,对应事件为空"));
                }
            }
        }
        #endregion
        #region 四个参数
        //添加事件
        public void Add<T, X, Y, Z>(int eventType, CallBack<T, X, Y, Z> callback)
        {
            OnListenerAdding(eventType, callback);
            m_EventTable[eventType] = (CallBack<T, X, Y, Z>)m_EventTable[eventType] + callback;
        }
        //移除事件
        public void Remove<T, X, Y, Z>(int eventType, CallBack<T, X, Y, Z> callback)
        {
            OnListenerRemoving(eventType, callback);
            m_EventTable[eventType] = (CallBack<T, X, Y, Z>)m_EventTable[eventType] - callback;
            OnListenerRemoved(eventType);
        }
        //事件的广播
        public void BroadCast<T, X, Y, Z>(int eventType, T arg1, X arg2, Y arg3, Z arg4)
        {
            Delegate del;
            if (m_EventTable.TryGetValue(eventType, out del))
            {
                CallBack<T, X, Y, Z> callback = del as CallBack<T, X, Y, Z>;
                if (callback != null)
                {
                    callback(arg1, arg2, arg3, arg4);
                }
                else
                {
                    throw new Exception(string.Format("广播事件错误,对应事件为空"));
                }
            }
        }
        #endregion
        #region 五个参数
        //添加事件
        public void Add<T, X, Y, Z, W>(int eventType, CallBack<T, X, Y, Z, W> callback)
        {
            OnListenerAdding(eventType, callback);
            m_EventTable[eventType] = (CallBack<T, X, Y, Z, W>)m_EventTable[eventType] + callback;
        }
        //移除事件
        public void Remove<T, X, Y, Z, W>(int eventType, CallBack<T, X, Y, Z, W> callback)
        {
            OnListenerRemoving(eventType, callback);
            m_EventTable[eventType] = (CallBack<T, X, Y, Z, W>)m_EventTable[eventType] - callback;
            OnListenerRemoved(eventType);
        }
        //事件的广播
        public void BroadCast<T, X, Y, Z, W>(int eventType, T arg1, X arg2, Y arg3, Z arg4, W arg5)
        {
            Delegate del;
            if (m_EventTable.TryGetValue(eventType, out del))
            {
                CallBack<T, X, Y, Z, W> callback = del as CallBack<T, X, Y, Z, W>;
                if (callback != null)
                {
                    callback(arg1, arg2, arg3, arg4, arg5);
                }
                else
                {
                    throw new Exception(string.Format("广播事件错误,对应事件为空"));
                }
            }
        }
        #endregion
    }
}
Assets/Scripts/Event/EventBase.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6c80f8f5d59ea8e429ec761f4310c999
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Event/EventCenter.cs
New file
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
/**
 * 模块,UI逻辑事件处理中心
 * @Author: chenxin
 * @Date: 2020-09-02 17:34:25
 */
namespace KTGMGemClient
{
    public class EventCenter : EventBase
    {
        private EventCenter() { }
        private static EventCenter ins = new EventCenter();
        public static EventCenter Ins { get { return ins; } private set { } }
    }
}
Assets/Scripts/Event/EventCenter.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9c9cd972e2e717542a49d8e9f887f0e1
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Event/EventType.cs
New file
@@ -0,0 +1,14 @@

namespace KTGMGemClient
{
    /// <summary>
    /// 所有事件枚举
    /// </summary>
    public enum EventType
    {
        // MasterSocket连接结果
        MasterSocketConnectResult,
    }
}
Assets/Scripts/Event/EventType.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b54dbf06a816feb419ba97f345f2cd0e
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Event/SocketEvent.cs
New file
@@ -0,0 +1,14 @@
/**
 * 消息事件 例:SocketEvent.Ins.Add<Google.Protobuf.IMessage>((int)Opcode.LoginS2C, LoginS2C);
 * @Author: chenxin
 * @Date: 2020-09-02 17:03:27
 */
namespace KTGMGemClient
{
    public sealed class SocketEvent : EventBase
    {
        private SocketEvent() { }
        private static SocketEvent ins = new SocketEvent();
        public static SocketEvent Ins { get { return ins; } private set { } }
    }
}
Assets/Scripts/Event/SocketEvent.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: dc9d985ab44e50844a2f337b25b1a894
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/GameAnalytics_SDK/GA_SDK_Manager.cs
New file
@@ -0,0 +1,55 @@
using UnityEngine;
public class GA_SDK_Manager : MonoBehaviour
{
    private static GA_SDK_Manager _Ins;
    public static GA_SDK_Manager Ins
    {
        get
        {
            return _Ins;
        }
    }
    /// <summary>
    /// Awake is called when the script instance is being loaded.
    /// </summary>
    void Awake()
    {
        _Ins = this;
    }
    public string GetDeviceId()
    {
        return TalkingDataGA.GetDeviceId();
    }
    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="channelId">渠道id</param>
    public void SDKInit(string channelId)
    {
        Debug.Log("Unity SDK  init begin channelId:" + channelId);
        TalkingDataGA.OnStart("B220F5C737384030947B202F19E32086", channelId);//appID是定死的
        Debug.Log("Unity SDK  init completed ");
    }
    TDGAAccount account;//当前账户
    /// <summary>
    /// 登录,使用自定义的
    /// </summary>
    /// <param name="deviceID"></param>
    public void Login(string deviceID)
    {
        account = TDGAAccount.SetAccount(TalkingDataGA.GetDeviceId());
        account.SetAccountType(AccountType.ANONYMOUS);
    }
    private void OnDestroy()
    {
        Debug.Log("onDestroy");
        TalkingDataGA.OnEnd();
    }
}
Assets/Scripts/GameAnalytics_SDK/GA_SDK_Manager.cs.meta
Assets/Scripts/GameAnalytics_SDK/GameAnalytics_SDK_Main.cs
File was deleted
Assets/Scripts/GameAnalytics_SDK/UI.meta
New file
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 674cc1556f44ec642b009828ff006265
folderAsset: yes
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/GameAnalytics_SDK/UI/LoginUI.cs
New file
@@ -0,0 +1,249 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using KTGMGemClient;
using UnityEngine.UI;
using LitJson;
using UnityEngine.Networking;
using Protobuf;
using Google.Protobuf;
public class LoginUI : MonoBehaviour
{
    private AsyncOperation async = null;
    bool isLogining;
    private JsonData loginData;
    // Start is called before the first frame update
    void Start()
    {
        GA_SDK_Manager.Ins.SDKInit(ChannelID.Gm.ToString());
        isLogining = false;
        transform.Find("Panel/Button").GetComponent<Button>().onClick.AddListener(OnClickLoginBtn);
        // if (Application.platform == RuntimePlatform.Android)
        // {
        //     GetetDeviceIMEI();//获取安卓手机IMEI
        // }
        // else if (Application.platform == RuntimePlatform.WindowsEditor)
        // {
        //     imei0 = "MyTestGemBattle1";
        // }
        imei0 = GA_SDK_Manager.Ins. GetDeviceId();//使用设备ID
    }
    private void OnEnable()
    {
        SocketEvent.Ins.Add<IMessage>((int)Opcode.LoginS2C, LoginS2C);
    }
    private void OnDestroy()
    {
        SocketEvent.Ins.Remove<IMessage>((int)Opcode.LoginS2C, LoginS2C);
    }
    #region 获得安卓手机上的IMEI号
    public string imei0 = "";
    public string imei1 = "";
    public string meid = "";
    void GetetDeviceIMEI()
    {
        var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        var context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        var telephoneyManager = context.Call<AndroidJavaObject>("getSystemService", "phone");
        imei0 = telephoneyManager.Call<string>("getImei", 0);//如果手机双卡 双待  就会有两个MIEI号
        imei1 = telephoneyManager.Call<string>("getImei", 1);
        meid = telephoneyManager.Call<string>("getMeid");//电信的手机 是MEID
        CommonDebugHelper.Debug($"获取到了安卓手机的IMEI!!! imei0:{imei0}  imei1:{imei1}  meid:{meid}");
    }
    #endregion
    private void OnClickLoginBtn()
    {
        Debug.Log("登录");
        LoginRequest();
    }
    /// <summary>
    /// 登录请求处理
    /// </summary>
    /// <param name="req"></param>
    private void LoginRequest()
    {
        if (!isLogining)
        {
            isLogining = true;
            string url = GameConfig.IsDebug ? GameConfig.TestLoginUrl : GameConfig.LoginUrl;
            JsonData data = new JsonData();
            data["account"] = imei0;
            data["password"] = "123456";
            data["channelid"] = (int)ChannelID.Gm;
            byte[] postBytes = System.Text.Encoding.Default.GetBytes(data.ToJson());
            StartCoroutine(Post(url, postBytes));
        }
    }
    IEnumerator Post(string url, byte[] postBytes)
    {
        UnityWebRequest request = UnityWebRequest.Post(url, "POST");
        request.uploadHandler = new UploadHandlerRaw(postBytes);
        request.downloadHandler = new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");
        yield return request.SendWebRequest();
        if (request.isDone)
        {
            string text = request.downloadHandler.text;
            loginData = JsonMapper.ToObject(text);
            if (loginData.Keys.Contains("errorcode"))
            {
                JsonData errorData = loginData["errorcode"];
                isLogining = false;
                CommonDebugHelper.DebugSocket(int.Parse(errorData.ToString()));
                yield break;
            }
            if (!string.IsNullOrEmpty(text))
            {
                EventCenter.Ins.Add<bool>((int)KTGMGemClient.EventType.MasterSocketConnectResult, MasterSocketConnectSuccess);
                MasterSocket.Ins.MasterIp = loginData["masterip"].ToString();
                MasterSocket.Ins.MasterPort = int.Parse(loginData["masterport"].ToString());
                MasterSocket.Ins.StartConnect();
                // System.DateTime dt = GameUtils.GetTime(loginData["timestamp"].ToString());
                // GameConfig.dateTime = dt;
                // GameConfig.timeSpan = dt - System.DateTime.Now;
            }
            else
            {
                isLogining = false;
                //UIManager.Instance.ShowWarningWind("没有登录数据返回,text:" + text);
                //CommonDebugHelper.DebugError("--------------------- 没有登录数据返回 ---------------------text:" + text);
            }
        }
        else
        {
            isLogining = false;
            //UIManager.Instance.ShowWarningWind(request.error);
            //CommonDebugHelper.DebugError("登录失败 request.error" + request.error);
        }
    }
    private void MasterSocketConnectSuccess(bool res)
    {
        if (res)
        {
            Login_C2S login = new Login_C2S();
            login.Username = loginData["username"].ToString();
            login.Channel = (int)ChannelID.Gm;
            login.SessionKey = loginData["sessionKey"].ToString();
            MasterSocket.Ins.SendMsg(Opcode.LoginC2S, login);
        }
        else
        {
            CommonDebugHelper.DebugError("Socket 链接失败了");
        }
    }
    private void LoginS2C(IMessage msg)
    {
        Login_S2C login = (Login_S2C)msg;
        if (login.Errorcode == 0)
        {
            Debug.Log("--------------------- 登录成功 ---------------------");
            UserDataMsg userData = login.Userdata;
            GA_SDK_Manager.Ins.Login(imei0);
            //StartCoroutine(loginMy());
            StartCoroutine(LoadScene());
        }
        else
        {
            CommonDebugHelper.DebugSocket(login.Errorcode);
            isLogining = false;
        }
    }
    IEnumerator LoadScene()
    {
        async = SceneManager.LoadSceneAsync(GameConfig.NextSceneName);
        async.allowSceneActivation = true;
        /*while (!async.isDone)
        {
            if (async.progress < 0.9f)
                progressValue = async.progress;
            else
                progressValue = 1.0f;
            slider.value = progressValue;
            progress.text = (int)(slider.value * 100) + " %";
            if (async.progress >= 0.89)
            {
                Debug.Log("进展时间分别是:" + async.progress + "," + totalTime);
                if( totalTime >= 3.0f )
                    async.allowSceneActivation = true;
                progress.text = "按任意键继续";
                if (Input.anyKeyDown)
                {
                    async.allowSceneActivation = true;
                }
            }
            //yield return null;
        }*/
        yield return null;
    }
    IEnumerator loginMy()
    {
        int displayProgress = 0;
        int toProgress = 0;
        AsyncOperation op = SceneManager.LoadSceneAsync(GameConfig.NextSceneName);
        op.allowSceneActivation = false;
        while (op.progress < 0.9f) //此处如果是 <= 0.9f 则会出现死循环所以必须小0.9
        {
            toProgress = (int)op.progress * 100;
            while (displayProgress < toProgress)
            {
                ++displayProgress;
                SetLoadingPercentage(displayProgress);
                yield return new WaitForEndOfFrame();//ui渲染完成之后
            }
        }
        toProgress = 100;
        while (displayProgress < toProgress)
        {
            ++displayProgress;
            SetLoadingPercentage(displayProgress);
            yield return new WaitForEndOfFrame();
        }
        op.allowSceneActivation = true;
        yield break;
    }
    private void SetLoadingPercentage(int displayProgress)
    {
        CommonDebugHelper.Debug($"当前进度{displayProgress}%");
    }
}
Assets/Scripts/GameAnalytics_SDK/UI/LoginUI.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5671a738ca063f047a1619ba0c199f45
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Manager.meta
New file
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fb488c6ad5dea3846997a0be584afee4
folderAsset: yes
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Manager/ManagerRoot.cs
New file
@@ -0,0 +1,58 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Protobuf;
using UnityEngine;
namespace KTGMGemClient
{
    public class ManagerRoot : MonoBehaviour
    {
        //private bool canChangeScene = false;
        public void Awake()
        {
            gameObject.AddComponent<DoNotDestory>();
            gameObject.AddComponent<MasterSocket>();
            gameObject.AddComponent<GA_SDK_Manager>();
            //gameObject.AddComponent<ErrorLogOnGUIMyTools>();
            //gameObject.AddComponent<JsonDataReader>();
        }
        // public void AfterRead()
        // {
        //     JsonDataReader.Instance.StartRead(() =>
        //     {
        //         StartCoroutine(CloseUpdateCanvas());
        //     });
        // }
        // IEnumerator CloseUpdateCanvas()
        // {
        //     yield return new WaitForSeconds(1f);
        //     canChangeScene = true;
        //     //gameObject.AddComponent<GameEnter>();
        //     yield return new WaitForSeconds(1f);
        //     GameObject.Find("Canvas").SetActive(false);
        // }
        // private void OnGUI()
        // {
        //     // if (canChangeScene)
        //     // {
        //     //     GUILayout.BeginArea(new Rect(5, 460, 150, 300));
        //     //     if (GUILayout.Button("GM", GUILayout.Width(150), GUILayout.Height(70)))
        //     //     {
        //     //         //UIManager.Instance.ShowWind("GmWin");
        //     //     }
        //     //     GUILayout.EndArea();
        //     // }
        // }
    }
}
Assets/Scripts/Manager/ManagerRoot.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a2dbd68be62ff4e4dbab85b3bbae1547
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Net/BaseSocket.cs
New file
@@ -0,0 +1,362 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Protobuf;
using System.IO;
using System.Net;
using System.Net.Sockets;
using Google.Protobuf;
namespace KTGMGemClient
{
    public class BaseSocket : MonoBehaviour
    {
        protected static int NET_HEADER_SIZE = 4;
        //protected Dictionary<short, System.Type> packetReflections = new Dictionary<short, System.Type>();
        protected Socket tcpSock;
        string ip;
        int port;
        short remaining = 0;
        short size = 0;
        Opcode opcode;
        protected virtual void OnConnected(bool connected)
        {
        }
        protected virtual void OnData(Opcode opcode, IMessage msg)
        {
        }
        public void Connect(string _host, int _port)
        {
            NetMapping.Init();
            //IPHostEntry host = Dns.GetHostEntry(_host);
            //endPoint = new IPEndPoint(host.AddressList[0], _port);
            ip = _host;
            port = _port;
            //icount = 0;
            //if(Defines.DebugNetWork)
            //        Debug.Log("StartConnect New Socket");
            tcpSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //_hasRecvBuf = false;
            //! for next loop
            //yield return 0;
            // Setup our options:
            // * NoDelay - don't use packet coalescing
            // * DontLinger - don't keep sockets around once they've been disconnected
            tcpSock.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
            tcpSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
            //tcpSock.ReceiveTimeout = SOCKET_CONNECT_TIME_OUT * 1000;
            //tcpSock.SendTimeout = SOCKET_SEND_TIME_OUT * 1000;
            //if(Defines.DebugNetWork)
            //    Debug.Log("Net Connect:"+__ip+":"+__port);
            tcpSock.BeginConnect(ip, port, OnEndConnect, tcpSock);
            //float connectingTime = 0;
            //while (!tcpSock.Connected && connectingTime <= SOCKET_CONNECT_TIME_OUT)
            //{
            //    //if(Defines.DebugNetWork)
            //    //    Debug.Log("NetConnecting: Time:"+_connectingTime);
            //    connectingTime += Time.deltaTime;
            //    yield return 0;
            //}
        }
        private void OnEndConnect(System.IAsyncResult ar)
        {
            try
            {
                Socket client = (Socket)ar.AsyncState;
                if (client != null)
                {
                    client.EndConnect(ar);
                }
                OnConnected(true);
            }
            catch (System.Exception e)
            {
                Debug.Log(e);
                OnConnected(false);
            }
        }
        protected IEnumerator StartRecv()
        {
            //if(!_tcpSock.Connected)
            //    yield break;
            CircleBuffer receiveBuffer = new CircleBuffer();
            size = 0;
            remaining = 0;
            opcode = 0;
            //float connectingTime = 0;
            while (true)
            {
                yield return new WaitForEndOfFrame();
                if (tcpSock == null || !tcpSock.Connected)
                    yield break;
                //            connectingTime += Time.deltaTime;
                //DEBUG MODE DISABLE TRY CATCH...
                // must have ,just in some socketException case
                if (tcpSock.Poll(1, SelectMode.SelectRead))
                {
                    //   connectingTime = 0;
                    // try
                    // {
                    //byte[] buf = new byte[CircleBuffer.MAX_RECEIVE_BUFFER_SIZE];
                    int len = tcpSock.Receive(receiveBuffer.DataBuffer, receiveBuffer.Length, receiveBuffer.LeftSpaceSize, SocketFlags.None);
                    receiveBuffer.Enlarge(len);
                    // _totalBytesReceived += len;
                    // }
                    // catch (System.Exception)
                    // {
                    // Debug.LogWarning(e);
                    //     yield break;
                    //  }
                    OnReceive(receiveBuffer);
                }
            }
        }
        void OnReceive(CircleBuffer segment)
        {
            //Debug.Log("OnReceive: " );
            //byte[] recvBuffer = segment.DataBuffer;
            do
            {
                //const int offset = 0;
                if (remaining == 0)
                {
                    if (segment.Length < NET_HEADER_SIZE)
                        return;
                    //_option  = recvBuffer[4];
                    remaining = size = bytesToShort(segment.DataBuffer, 0);//recvBuffer[offset] | recvBuffer[offset + 1] << 8;
                    opcode = (Opcode)bytesToShort(segment.DataBuffer, 2);//(OpcodeType)(recvBuffer[offset + 2] | recvBuffer[offset + 3] << 8);
                }
                if (remaining > 0 && remaining > segment.Length)
                    return;
                //   bool compressed = ((_option & PACKAGE_OPTION_MASK_COMPRESS) == PACKAGE_OPTION_MASK_COMPRESS);
                //if(GameDefine.isDevelopBuild)
                //#if UNITY_EDITOR
                Debug.Log("rev:" + opcode.ToString() + " Size:" + size);
                //#endif
                //Stream stm = null;
                IMessage message = DesrializePacket(opcode, segment, NET_HEADER_SIZE, size);
                OnData(opcode, message);
                // Stream stm = new MemoryStream(recvBuffer, NET_HEADER_SIZE, size - NET_HEADER_SIZE);
                //if (compressed)
                //{
                //    stm = new InflaterInputStream(stm);
                //}
                // Packet pkt = packetMgr.DeserializeGamePacket(_opcode, stm);
                // packetMgr.HandleGamePacket(pkt);
                //UIManager.I.ReceiveSocketType(pkt.OpCode);
                // _hasRecvBuf = true;
                segment.Shrink(size);
                size = remaining = 0;
            } while (segment.Length > 0);
            //return ;
        }
        public void SendMsg(Opcode _opcode, IMessage _message)
        {
            byte[] databytes = _message.ToByteArray();
            short send_size = (short)(databytes.Length + NET_HEADER_SIZE);//+ 2;
            byte[] protobuf = new byte[send_size];
            //bool compressed = ((_option & PACKAGE_OPTION_MASK_COMPRESS) == PACKAGE_OPTION_MASK_COMPRESS);
            this.shortToBytes(send_size, ref protobuf, 0);
            this.shortToBytes((short)_opcode, ref protobuf, 2);
            System.Buffer.BlockCopy(databytes, 0, protobuf, NET_HEADER_SIZE, databytes.Length);
            tcpSock.Send(protobuf);
            //MemoryStream ms = new MemoryStream();
            ////FastBuf.BufferWriter bw = new FastBuf.BufferWriter(ms);
            //ms.SetLength(0);
            //send_pak.PacketObject.setSession(pid, key);
            //packetMgr.SerializePacket(ms, send_pak.PacketObject);
            //int size = (int)(ms.Length) + SEND_HEADER_SIZE;//+ 2;
            //byte[] protobuf = new byte[size];
            ////bool compressed = ((_option & PACKAGE_OPTION_MASK_COMPRESS) == PACKAGE_OPTION_MASK_COMPRESS);
            //MakePacketHeader(ref protobuf, size, (short)send_pak.OpCode, pid);
            //ms.Position = 0;
            //ms.Read(protobuf, SEND_HEADER_SIZE, (int)ms.Length);
            //if (send_pak.OpCode != OpcodeType.C2S_LOGIN)
            //{
            //    //byte[] encrypt_data = protobuf + SEND_HEADER_SIZE;
            //    RC4.Cipher(ref protobuf, SEND_HEADER_SIZE, rc4key + (icount).ToString());
            //}
            ////if(Application.isEditor||Defines.DebugNetWork)
            //_totalBytesSent += protobuf.Length;
            //try
            //{
            //    _tcpSock.Send(protobuf);
            //}
            //catch (System.Exception)
            //{
            //    return false;
            //}
            //return true;
        }
        private void shortToBytes(short s, ref byte[] bytes, int offset)
        {
            bytes[offset + 0] = (byte)s;
            bytes[offset + 1] = (byte)(s >> 8);
        }
        private short bytesToShort(byte[] bytes, int offset)
        {
            return (short)((bytes[offset] & 0xFF) | ((bytes[offset + 1] & 0xFF) << 8));
        }
        private IMessage DesrializePacket(Opcode opcode, CircleBuffer circleBuffer, int offset, int size)
        {
            //if (this._packetReflections.Count == 0)
            //{
            //}
            System.Type optype;
            if (NetMapping.packetReflections.TryGetValue(opcode, out optype))
            {
                if (null == optype)
                {
                    return null;
                }
                Stream stream = new MemoryStream(circleBuffer.DataBuffer, offset, size - offset);
                IMessage IMperson = System.Activator.CreateInstance(optype) as IMessage;
                //        Person2 p1 = new Person2();
                return IMperson.Descriptor.Parser.ParseFrom(stream);
                //return new Packet(opcode, msg);
            }
            return null;
        }
        /// <summary>
        /// 关闭socket
        /// </summary>
        protected void Close()
        {
            if (tcpSock != null)
            {
                CommonDebugHelper.Debug("开始关闭Socket");
                if (tcpSock.Connected) tcpSock.Shutdown(SocketShutdown.Both);
                tcpSock.Close();
                tcpSock = null;
                StopCoroutine(StartRecv());
            }
        }
        protected int reconnectTime = 0;//重连次数
        /// <summary>
        /// 断线重连
        /// </summary>
        /// <returns></returns>
        IEnumerator Reconnect()
        {
            Close();
            reconnectTime++;
            Connect(ip, port);
            if (!tcpSock.Connected)
            {
                if (reconnectTime <= 3)
                {
                    yield return new WaitForSecondsRealtime(5);
                    StartCoroutine(Reconnect());
                }
                else
                {
                    CommonDebugHelper.DebugError("重连超过3次,确定是断线了");
                }
            }
            else
            {
                CommonDebugHelper.Debug("重连成功");
                reconnectTime = 0;
                StartCoroutine(StartRecv());
            }
        }
    }
}
Assets/Scripts/Net/BaseSocket.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a914b2a2c1ec73d42947c3d23bb76664
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Net/CircleBuffer.cs
New file
@@ -0,0 +1,64 @@
//======================================
//        Copyright (C) 2014-2015 xkMob Technology Co., Ltd.
//        All rights reserved
//
//        filename :CircleBuffer.cs
//        description :
//======================================
using System;
using System.Collections;
public class CircleBuffer
{
    public static int MAX_RECEIVE_BUFFER_SIZE = 1024 * 2 * 1024; // 32k
    public int Length
    {
        get;
        internal set;
    }
    public byte[] DataBuffer
    {
        get;
        internal set;
    }
    public int LeftSpaceSize
    {
        get
        {
            return MAX_RECEIVE_BUFFER_SIZE - Length;
        }
    }
    public CircleBuffer()
    {
        DataBuffer = new byte[MAX_RECEIVE_BUFFER_SIZE];
        //Offset = 0;
        Length = 0;
    }
    public void Enlarge(int bufLength)
    {
        //Helpers.DebugAssert(Length + bufLength <= MAX_RECEIVE_BUFFER_SIZE);
        //if(Length + bufLength > SocketMgr.MAX_RECEIVE_BUFFER_SIZE)
        //    Debug.LogError("CircleBuffer Enlarge Out of Range ");
        //Array.Copy(buf, 0, DataBuffer, Length, bufLength);
        Length += bufLength;
    }
    public void Shrink(int size)
    {
        if (size >= Length)
            Length = 0;
        else
        {
            Array.Copy(DataBuffer, size, DataBuffer, 0, Length - size);
            Length -= size;
        }
    }
}
Assets/Scripts/Net/CircleBuffer.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3d1fd51dbc2da0a4baf10185e2d8540b
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Scripts/Net/MasterSocket.cs
New file
@@ -0,0 +1,62 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Protobuf;
using Google.Protobuf;
namespace KTGMGemClient
{
    public class MasterSocket : BaseSocket
    {
        private static MasterSocket _Ins;
        public static MasterSocket Ins{
            get{
                return _Ins;
            }
        }
        /// <summary>
        /// Awake is called when the script instance is being loaded.
        /// </summary>
        void Awake()
        {
            _Ins=this;
        }
        public string MasterIp;
        public int MasterPort;
        /// <summary>
        /// 建立tcp链接
        /// </summary>
        public void StartConnect()
        {
            Connect(MasterIp, MasterPort);
            StartCoroutine(StartRecv());
        }
        protected override void OnConnected(bool connected)
        {
            Debug.Log("connected master:" + connected);
            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.MasterSocketConnectResult, connected);
        }
        protected override void OnData(Opcode opcode, IMessage msg)
        {
            Debug.Log("on data: " + opcode + "   msg:" + msg);
            SocketEvent.Ins.BroadCast((int)opcode, msg);
        }
        public void SetTestData(Opcode opcode, IMessage msg){
            CommonDebugHelper.Debug("开始使用测试假数据");
            OnData(opcode,msg);
        }
        /// <summary>
        /// Callback sent to all game objects before the application is quit.
        /// </summary>
        void OnApplicationQuit()
        {
            Close();
        }
    }
}
Assets/Scripts/Net/MasterSocket.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2c5d1a0acc46c6c4d922e093fc11af32
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
ProjectSettings/EditorBuildSettings.asset
@@ -6,6 +6,9 @@
  serializedVersion: 2
  m_Scenes:
  - enabled: 1
    path: Assets/Scenes/TestTalkingData.unity
    guid: 415e09a546f94cf4b883227ff1be6086
  - enabled: 1
    path: Assets/Scenes/MainManuScene.unity
    guid: 520ddc4fdac3ea246b57984ad40aea6c
  - enabled: 1