From b37bfe58c4e565018712d4dea535ad7e137f27b7 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 6 Jul 2026 09:56:40 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A1=E3=80=81h5=20sdk=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.idea.Uni2SDK/.idea/.gitignore | 13 + .idea/.idea.Uni2SDK/.idea/.name | 1 + .../.idea/MarsCodeWorkspaceAppSettings.xml | 6 + .idea/.idea.Uni2SDK/.idea/indexLayout.xml | 8 + .idea/.idea.Uni2SDK/.idea/vcs.xml | 9 + .idea/.idea.WV2SDK/.idea/workspace.xml | 91 ++ Uni2SDK.sln | 16 + Uni2SDK.sln.DotSettings.user | 33 + WV2SDK.sln.DotSettings.user | 2 + WV2SDK/Adnroid/AndroidKit.cs | 229 +++++ WV2SDK/Adnroid/MainThreadDispatcher.cs | 41 + WV2SDK/Async/AsyncDealData.cs | 52 ++ WV2SDK/Async/AsyncKitUnityBehaviour.cs | 92 ++ WV2SDK/Async/SugarAsyKit.cs | 63 ++ WV2SDK/Base/BaseCtrl.cs | 115 +++ WV2SDK/Base/BaseInterfaceManager.cs | 55 ++ WV2SDK/Base/BaseModel.cs | 108 +++ WV2SDK/Base/BaseSystem.cs | 29 + WV2SDK/Base/BaseUICtrl.cs | 33 + WV2SDK/Base/InterfaceManager.cs | 10 + WV2SDK/Base/ModuleManager.cs | 201 ++++ WV2SDK/Common/Uni2SDKAutoRefresh.cs | 257 +++++ WV2SDK/Config/ConfigSystem.cs | 245 +++++ WV2SDK/Config/GameUrlsModel.cs | 26 + WV2SDK/Config/IDataList.cs | 9 + WV2SDK/Define/Const/AppConst.cs | 49 + WV2SDK/Define/Const/AppObjConst.cs | 38 + WV2SDK/Define/Const/ScreenConst.cs | 16 + WV2SDK/Define/Const/Uni2SDKConst.cs | 16 + WV2SDK/Define/Message/AppMsg_Frame_0-9999.cs | 27 + WV2SDK/Define/Message/CtrlMsg_Base_0-9999.cs | 13 + WV2SDK/Define/Message/CtrlMsg_Logic.cs | 18 + WV2SDK/Define/Message/CtrlMsg_WebView.cs | 10 + WV2SDK/Define/Message/NetworkMsg_Logic.cs | 11 + WV2SDK/Define/Message/UICtrlMsg_OpenClose.cs | 114 +++ WV2SDK/Dispatcher/AppDispatcher.cs | 6 + WV2SDK/Dispatcher/BaseDispatcher.cs | 133 +++ WV2SDK/Dispatcher/CtrlDispatcher.cs | 6 + WV2SDK/Dispatcher/NetworkDispatcher.cs | 6 + WV2SDK/Dispatcher/UICtrlDispatcher.cs | 6 + WV2SDK/Helper/CommonHelper.cs | 171 ++++ WV2SDK/Helper/DownloadKit.cs | 164 ++++ WV2SDK/Helper/GameHelper.cs | 135 +++ WV2SDK/Helper/SugarConstant.cs | 18 + WV2SDK/Helper/SugarFileKit.cs | 32 + WV2SDK/Manager/BaseUnityManager.cs | 38 + WV2SDK/Manager/THManager.cs | 31 + WV2SDK/Model/CommonModel.cs | 202 ++++ WV2SDK/Model/LoginModel.cs | 24 + WV2SDK/Net/LoginSystem.cs | 83 ++ WV2SDK/Net/NetworkManager.cs | 64 ++ WV2SDK/SGModule/Common/README.md | 138 +++ .../SGModule/Plugins/iOS/KeychainPlugin.mm | 66 ++ .../Scripts/Base/SingletonMonoBehaviour.cs | 69 ++ .../Scripts/Extensions/ArrayExtensions.cs | 18 + .../Scripts/Extensions/EnumExtensions.cs | 15 + .../Scripts/Extensions/ListExtensions.cs | 25 + .../Scripts/Extensions/ObjectExtensions.cs | 203 ++++ .../Scripts/Extensions/StringExtensions.cs | 10 + .../Common/SGModule/Scripts/GM/GMTool.cs | 401 ++++++++ .../SGModule/Scripts/Helper/Base64Helper.cs | 32 + .../SGModule/Scripts/Helper/CommonUtils.cs | 26 + .../Common/SGModule/Scripts/Helper/Cryptor.cs | 43 + .../SGModule/Scripts/Helper/DeviceHelper.cs | 26 + .../Common/SGModule/Scripts/Helper/Log.cs | 114 +++ .../SGModule/Scripts/Helper/MD5Helper.cs | 72 ++ .../SGModule/Scripts/Helper/ModuleVersion.cs | 70 ++ .../SGModule/Scripts/Helper/RandomHelper.cs | 30 + .../Scripts/Helper/SerializeHelper.cs | 52 ++ .../SGModule/Scripts/Helper/TimeHelper.cs | 62 ++ .../SGModule/Scripts/Interface/IWeighted.cs | 7 + .../SGModule/Scripts/Keychain/Keychain.cs | 49 + WV2SDK/SGModule/Net/README.md | 67 ++ .../Net/SGModule/Scripts/Core/NetChecker.cs | 333 +++++++ .../Net/SGModule/Scripts/Core/NetCore.cs | 306 ++++++ .../Net/SGModule/Scripts/Core/ServerClock.cs | 25 + .../Net/SGModule/Scripts/Core/TokenManager.cs | 252 +++++ .../SGModule/Scripts/Models/ResponseData.cs | 24 + .../Scripts/WebSocket/ResponseData.cs | 18 + .../Scripts/WebSocket/WebSocketData.cs | 5 + .../Scripts/WebSocket/WebSocketEvent.cs | 8 + .../Scripts/WebSocket/WebSocketService.cs | 262 ++++++ .../Scripts/WebSocket/WebSocketTools.cs | 88 ++ .../Samples~/WebSocketExample/Connection.cs | 60 ++ .../WebSocketExampleScene.unity | 326 +++++++ .../WebSocket/WebSocket.cs | 882 ++++++++++++++++++ .../WebSocket/WebSocket.jslib | 333 +++++++ .../WebSocket/endel.nativewebsocket.asmdef | 3 + .../com.endel.nativewebsocket/package.json | 32 + WV2SDK/SGModule/NetKit/README.md | 62 ++ .../SGModule/NetKit/SGModule/Model/H5Model.cs | 16 + .../NetKit/SGModule/Model/LoginModel.cs | 24 + .../NetKit/SGModule/Model/OrderModel.cs | 36 + .../NetKit/SGModule/Model/RequestLoginData.cs | 20 + .../SGModule/Model/RequestResultData.cs | 10 + .../SGModule/Model/RequestSavePlayData.cs | 10 + .../NetKit/SGModule/Model/RequestStageData.cs | 17 + .../NetKit/SGModule/Model/RespDebugData.cs | 19 + .../SGModule/Model/RespLoginFunnelData.cs | 15 + .../NetKit/SGModule/Model/TrackData.cs | 11 + .../NetKit/SGModule/Scripts/Core/NetKit.cs | 113 +++ .../SGModule/Scripts/Kits/ErrorLogKit.cs | 88 ++ .../SGModule/Scripts/Kits/HeartbeatKit.cs | 149 +++ .../NetKit/SGModule/Scripts/Kits/LoginKit.cs | 114 +++ .../NetKit/SGModule/Scripts/Kits/NetGmTool.cs | 51 + .../SGModule/Scripts/Kits/Track/TrackEvent.cs | 51 + .../SGModule/Scripts/Kits/Track/TrackKit.cs | 191 ++++ .../Scripts/Kits/Track/TrackProperty.cs | 50 + .../NetKit/SGModule/Scripts/NetApi.cs | 141 +++ WV2SDK/Singleton/ISingleton.cs | 7 + WV2SDK/Singleton/Singleton.cs | 34 + WV2SDK/Singleton/SingletonUnity.cs | 100 ++ WV2SDK/ToolKit/Base64EncodeUtil.cs | 32 + WV2SDK/ToolKit/Base64Kit.cs | 95 ++ WV2SDK/ToolKit/EventKit.cs | 24 + WV2SDK/ToolKit/GameObjectExtend.cs | 24 + WV2SDK/ToolKit/GeneralKit.cs | 25 + WV2SDK/ToolKit/LogKit.cs | 30 + WV2SDK/ToolKit/MD5Kit.cs | 74 ++ WV2SDK/ToolKit/SerializeUtil.cs | 49 + WV2SDK/ToolKit/StringExtend.cs | 19 + WV2SDK/ToolKit/YieldConst.cs | 13 + WV2SDK/Uni2SDKCtrl.cs | 144 +++ WV2SDK/Uni2SDKManager.cs | 116 +++ WV2SDK/Uni2SDKMgr.cs | 582 ++++++++++++ WV2SDK/Util/Uni2SDKMaskUtil.cs | 15 + WV2SDK/Util/Uni2SDKUtil.cs | 18 + WV2SDK/WV2SDK.csproj | 18 + .../bin/Debug/netstandard2.1/WV2SDK.deps.json | 62 ++ WV2SDK/bin/Debug/netstandard2.1/WV2SDK.dll | Bin 0 -> 166912 bytes WV2SDK/bin/Debug/netstandard2.1/WV2SDK.nrproj | Bin 0 -> 24202 bytes WV2SDK/bin/Debug/netstandard2.1/WV2SDK.pdb | Bin 0 -> 75148 bytes .../WV2SDK_Secure/WV2SDK.deps.json | 62 ++ .../netstandard2.1/WV2SDK_Secure/WV2SDK.dll | Bin 0 -> 356352 bytes .../netstandard2.1/WV2SDK_Secure/WV2SDK.pdb | Bin 0 -> 115712 bytes ...tandard,Version=v2.0.AssemblyAttributes.cs | 4 + .../netstandard2.0/WV2SDK.AssemblyInfo.cs | 22 + .../WV2SDK.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 3 + .../Debug/netstandard2.0/WV2SDK.assets.cache | Bin 0 -> 1134 bytes .../WV2SDK.csproj.AssemblyReference.cache | Bin 0 -> 53570 bytes .../WV2SDK.csproj.CoreCompileInputs.cache | 1 + .../WV2SDK.csproj.FileListAbsolute.txt | 5 + ...tandard,Version=v2.1.AssemblyAttributes.cs | 4 + .../netstandard2.1/WV2SDK.AssemblyInfo.cs | 22 + .../WV2SDK.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 8 + .../Debug/netstandard2.1/WV2SDK.assets.cache | Bin 0 -> 2093 bytes .../WV2SDK.csproj.AssemblyReference.cache | Bin 0 -> 925 bytes .../WV2SDK.csproj.CoreCompileInputs.cache | 1 + .../WV2SDK.csproj.FileListAbsolute.txt | 30 + WV2SDK/obj/Debug/netstandard2.1/WV2SDK.dll | Bin 0 -> 166912 bytes WV2SDK/obj/Debug/netstandard2.1/WV2SDK.pdb | Bin 0 -> 75148 bytes WV2SDK/obj/WV2SDK.csproj.nuget.dgspec.json | 77 ++ WV2SDK/obj/WV2SDK.csproj.nuget.g.props | 15 + WV2SDK/obj/WV2SDK.csproj.nuget.g.targets | 2 + WV2SDK/obj/project.assets.json | 168 ++++ WV2SDK/obj/project.nuget.cache | 24 + WV2SDK/obj/project.packagespec.json | 1 + WV2SDK/obj/rider.project.model.nuget.info | 1 + WV2SDK/obj/rider.project.restore.info | 1 + gupm.toml | 6 + 162 files changed, 10855 insertions(+) create mode 100644 .idea/.idea.Uni2SDK/.idea/.gitignore create mode 100644 .idea/.idea.Uni2SDK/.idea/.name create mode 100644 .idea/.idea.Uni2SDK/.idea/MarsCodeWorkspaceAppSettings.xml create mode 100644 .idea/.idea.Uni2SDK/.idea/indexLayout.xml create mode 100644 .idea/.idea.Uni2SDK/.idea/vcs.xml create mode 100644 .idea/.idea.WV2SDK/.idea/workspace.xml create mode 100644 Uni2SDK.sln create mode 100644 Uni2SDK.sln.DotSettings.user create mode 100644 WV2SDK.sln.DotSettings.user create mode 100644 WV2SDK/Adnroid/AndroidKit.cs create mode 100644 WV2SDK/Adnroid/MainThreadDispatcher.cs create mode 100644 WV2SDK/Async/AsyncDealData.cs create mode 100644 WV2SDK/Async/AsyncKitUnityBehaviour.cs create mode 100644 WV2SDK/Async/SugarAsyKit.cs create mode 100644 WV2SDK/Base/BaseCtrl.cs create mode 100644 WV2SDK/Base/BaseInterfaceManager.cs create mode 100644 WV2SDK/Base/BaseModel.cs create mode 100644 WV2SDK/Base/BaseSystem.cs create mode 100644 WV2SDK/Base/BaseUICtrl.cs create mode 100644 WV2SDK/Base/InterfaceManager.cs create mode 100644 WV2SDK/Base/ModuleManager.cs create mode 100644 WV2SDK/Common/Uni2SDKAutoRefresh.cs create mode 100644 WV2SDK/Config/ConfigSystem.cs create mode 100644 WV2SDK/Config/GameUrlsModel.cs create mode 100644 WV2SDK/Config/IDataList.cs create mode 100644 WV2SDK/Define/Const/AppConst.cs create mode 100644 WV2SDK/Define/Const/AppObjConst.cs create mode 100644 WV2SDK/Define/Const/ScreenConst.cs create mode 100644 WV2SDK/Define/Const/Uni2SDKConst.cs create mode 100644 WV2SDK/Define/Message/AppMsg_Frame_0-9999.cs create mode 100644 WV2SDK/Define/Message/CtrlMsg_Base_0-9999.cs create mode 100644 WV2SDK/Define/Message/CtrlMsg_Logic.cs create mode 100644 WV2SDK/Define/Message/CtrlMsg_WebView.cs create mode 100644 WV2SDK/Define/Message/NetworkMsg_Logic.cs create mode 100644 WV2SDK/Define/Message/UICtrlMsg_OpenClose.cs create mode 100644 WV2SDK/Dispatcher/AppDispatcher.cs create mode 100644 WV2SDK/Dispatcher/BaseDispatcher.cs create mode 100644 WV2SDK/Dispatcher/CtrlDispatcher.cs create mode 100644 WV2SDK/Dispatcher/NetworkDispatcher.cs create mode 100644 WV2SDK/Dispatcher/UICtrlDispatcher.cs create mode 100644 WV2SDK/Helper/CommonHelper.cs create mode 100644 WV2SDK/Helper/DownloadKit.cs create mode 100644 WV2SDK/Helper/GameHelper.cs create mode 100644 WV2SDK/Helper/SugarConstant.cs create mode 100644 WV2SDK/Helper/SugarFileKit.cs create mode 100644 WV2SDK/Manager/BaseUnityManager.cs create mode 100644 WV2SDK/Manager/THManager.cs create mode 100644 WV2SDK/Model/CommonModel.cs create mode 100644 WV2SDK/Model/LoginModel.cs create mode 100644 WV2SDK/Net/LoginSystem.cs create mode 100644 WV2SDK/Net/NetworkManager.cs create mode 100644 WV2SDK/SGModule/Common/README.md create mode 100644 WV2SDK/SGModule/Common/SGModule/Plugins/iOS/KeychainPlugin.mm create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Base/SingletonMonoBehaviour.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ArrayExtensions.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/EnumExtensions.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ListExtensions.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ObjectExtensions.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/StringExtensions.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/GM/GMTool.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Base64Helper.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Helper/CommonUtils.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Cryptor.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Helper/DeviceHelper.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Log.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Helper/MD5Helper.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Helper/ModuleVersion.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Helper/RandomHelper.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Helper/SerializeHelper.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Helper/TimeHelper.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Interface/IWeighted.cs create mode 100644 WV2SDK/SGModule/Common/SGModule/Scripts/Keychain/Keychain.cs create mode 100644 WV2SDK/SGModule/Net/README.md create mode 100644 WV2SDK/SGModule/Net/SGModule/Scripts/Core/NetChecker.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/Scripts/Core/NetCore.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/Scripts/Core/ServerClock.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/Scripts/Core/TokenManager.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/Scripts/Models/ResponseData.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/ResponseData.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketData.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketEvent.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketService.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketTools.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/Samples~/WebSocketExample/Connection.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/Samples~/WebSocketExample/WebSocketExampleScene.unity create mode 100644 WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/WebSocket.cs create mode 100644 WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/WebSocket.jslib create mode 100644 WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/endel.nativewebsocket.asmdef create mode 100644 WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/package.json create mode 100644 WV2SDK/SGModule/NetKit/README.md create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Model/H5Model.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Model/LoginModel.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Model/OrderModel.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Model/RequestLoginData.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Model/RequestResultData.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Model/RequestSavePlayData.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Model/RequestStageData.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Model/RespDebugData.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Model/RespLoginFunnelData.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Model/TrackData.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Scripts/Core/NetKit.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/ErrorLogKit.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/HeartbeatKit.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/LoginKit.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/NetGmTool.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackEvent.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackKit.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackProperty.cs create mode 100644 WV2SDK/SGModule/NetKit/SGModule/Scripts/NetApi.cs create mode 100644 WV2SDK/Singleton/ISingleton.cs create mode 100644 WV2SDK/Singleton/Singleton.cs create mode 100644 WV2SDK/Singleton/SingletonUnity.cs create mode 100644 WV2SDK/ToolKit/Base64EncodeUtil.cs create mode 100644 WV2SDK/ToolKit/Base64Kit.cs create mode 100644 WV2SDK/ToolKit/EventKit.cs create mode 100644 WV2SDK/ToolKit/GameObjectExtend.cs create mode 100644 WV2SDK/ToolKit/GeneralKit.cs create mode 100644 WV2SDK/ToolKit/LogKit.cs create mode 100644 WV2SDK/ToolKit/MD5Kit.cs create mode 100644 WV2SDK/ToolKit/SerializeUtil.cs create mode 100644 WV2SDK/ToolKit/StringExtend.cs create mode 100644 WV2SDK/ToolKit/YieldConst.cs create mode 100644 WV2SDK/Uni2SDKCtrl.cs create mode 100644 WV2SDK/Uni2SDKManager.cs create mode 100644 WV2SDK/Uni2SDKMgr.cs create mode 100644 WV2SDK/Util/Uni2SDKMaskUtil.cs create mode 100644 WV2SDK/Util/Uni2SDKUtil.cs create mode 100644 WV2SDK/WV2SDK.csproj create mode 100644 WV2SDK/bin/Debug/netstandard2.1/WV2SDK.deps.json create mode 100644 WV2SDK/bin/Debug/netstandard2.1/WV2SDK.dll create mode 100644 WV2SDK/bin/Debug/netstandard2.1/WV2SDK.nrproj create mode 100644 WV2SDK/bin/Debug/netstandard2.1/WV2SDK.pdb create mode 100644 WV2SDK/bin/Debug/netstandard2.1/WV2SDK_Secure/WV2SDK.deps.json create mode 100644 WV2SDK/bin/Debug/netstandard2.1/WV2SDK_Secure/WV2SDK.dll create mode 100644 WV2SDK/bin/Debug/netstandard2.1/WV2SDK_Secure/WV2SDK.pdb create mode 100644 WV2SDK/obj/Debug/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.cs create mode 100644 WV2SDK/obj/Debug/netstandard2.0/WV2SDK.AssemblyInfo.cs create mode 100644 WV2SDK/obj/Debug/netstandard2.0/WV2SDK.AssemblyInfoInputs.cache create mode 100644 WV2SDK/obj/Debug/netstandard2.0/WV2SDK.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 WV2SDK/obj/Debug/netstandard2.0/WV2SDK.assets.cache create mode 100644 WV2SDK/obj/Debug/netstandard2.0/WV2SDK.csproj.AssemblyReference.cache create mode 100644 WV2SDK/obj/Debug/netstandard2.0/WV2SDK.csproj.CoreCompileInputs.cache create mode 100644 WV2SDK/obj/Debug/netstandard2.0/WV2SDK.csproj.FileListAbsolute.txt create mode 100644 WV2SDK/obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs create mode 100644 WV2SDK/obj/Debug/netstandard2.1/WV2SDK.AssemblyInfo.cs create mode 100644 WV2SDK/obj/Debug/netstandard2.1/WV2SDK.AssemblyInfoInputs.cache create mode 100644 WV2SDK/obj/Debug/netstandard2.1/WV2SDK.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 WV2SDK/obj/Debug/netstandard2.1/WV2SDK.assets.cache create mode 100644 WV2SDK/obj/Debug/netstandard2.1/WV2SDK.csproj.AssemblyReference.cache create mode 100644 WV2SDK/obj/Debug/netstandard2.1/WV2SDK.csproj.CoreCompileInputs.cache create mode 100644 WV2SDK/obj/Debug/netstandard2.1/WV2SDK.csproj.FileListAbsolute.txt create mode 100644 WV2SDK/obj/Debug/netstandard2.1/WV2SDK.dll create mode 100644 WV2SDK/obj/Debug/netstandard2.1/WV2SDK.pdb create mode 100644 WV2SDK/obj/WV2SDK.csproj.nuget.dgspec.json create mode 100644 WV2SDK/obj/WV2SDK.csproj.nuget.g.props create mode 100644 WV2SDK/obj/WV2SDK.csproj.nuget.g.targets create mode 100644 WV2SDK/obj/project.assets.json create mode 100644 WV2SDK/obj/project.nuget.cache create mode 100644 WV2SDK/obj/project.packagespec.json create mode 100644 WV2SDK/obj/rider.project.model.nuget.info create mode 100644 WV2SDK/obj/rider.project.restore.info create mode 100644 gupm.toml diff --git a/.idea/.idea.Uni2SDK/.idea/.gitignore b/.idea/.idea.Uni2SDK/.idea/.gitignore new file mode 100644 index 0000000..5252128 --- /dev/null +++ b/.idea/.idea.Uni2SDK/.idea/.gitignore @@ -0,0 +1,13 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# Rider 忽略的文件 +/.idea.WV2SDK.iml +/modules.xml +/contentModel.xml +/projectSettingsUpdater.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.Uni2SDK/.idea/.name b/.idea/.idea.Uni2SDK/.idea/.name new file mode 100644 index 0000000..3d8027e --- /dev/null +++ b/.idea/.idea.Uni2SDK/.idea/.name @@ -0,0 +1 @@ +Uni2SDK \ No newline at end of file diff --git a/.idea/.idea.Uni2SDK/.idea/MarsCodeWorkspaceAppSettings.xml b/.idea/.idea.Uni2SDK/.idea/MarsCodeWorkspaceAppSettings.xml new file mode 100644 index 0000000..c4cdb72 --- /dev/null +++ b/.idea/.idea.Uni2SDK/.idea/MarsCodeWorkspaceAppSettings.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.Uni2SDK/.idea/indexLayout.xml b/.idea/.idea.Uni2SDK/.idea/indexLayout.xml new file mode 100644 index 0000000..f5a863a --- /dev/null +++ b/.idea/.idea.Uni2SDK/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.Uni2SDK/.idea/vcs.xml b/.idea/.idea.Uni2SDK/.idea/vcs.xml new file mode 100644 index 0000000..012064f --- /dev/null +++ b/.idea/.idea.Uni2SDK/.idea/vcs.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.WV2SDK/.idea/workspace.xml b/.idea/.idea.WV2SDK/.idea/workspace.xml new file mode 100644 index 0000000..042f151 --- /dev/null +++ b/.idea/.idea.WV2SDK/.idea/workspace.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + { + "associatedIndex": 5 +} + + + + { + "keyToString": { + "RunOnceActivity.ShowReadmeOnStart": "true", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "settings.editor.selected.configurable": "preferences.lookFeel", + "vue.rearranger.settings.migration": "true" + } +} + + + + + + + + + + + + + + + + 1746611058126 + + + + + + + + + + + \ No newline at end of file diff --git a/Uni2SDK.sln b/Uni2SDK.sln new file mode 100644 index 0000000..e5763bf --- /dev/null +++ b/Uni2SDK.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WV2SDK", "WV2SDK\WV2SDK.csproj", "{1ABFEB96-089E-4743-8A22-0A34FE6327D4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1ABFEB96-089E-4743-8A22-0A34FE6327D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1ABFEB96-089E-4743-8A22-0A34FE6327D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1ABFEB96-089E-4743-8A22-0A34FE6327D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1ABFEB96-089E-4743-8A22-0A34FE6327D4}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Uni2SDK.sln.DotSettings.user b/Uni2SDK.sln.DotSettings.user new file mode 100644 index 0000000..1281a2f --- /dev/null +++ b/Uni2SDK.sln.DotSettings.user @@ -0,0 +1,33 @@ + + True + True + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded \ No newline at end of file diff --git a/WV2SDK.sln.DotSettings.user b/WV2SDK.sln.DotSettings.user new file mode 100644 index 0000000..0f6f5db --- /dev/null +++ b/WV2SDK.sln.DotSettings.user @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/WV2SDK/Adnroid/AndroidKit.cs b/WV2SDK/Adnroid/AndroidKit.cs new file mode 100644 index 0000000..01c260c --- /dev/null +++ b/WV2SDK/Adnroid/AndroidKit.cs @@ -0,0 +1,229 @@ +using UnityEngine; +using System; +using Newtonsoft.Json; + +namespace Uni2SDK +{ + /// + /// Android交互工具(v3.0) + /// 核心优化:统一调用模板 + 智能参数处理 + /// + public static class AndroidKit + { + #region 核心字段 + + private static readonly AndroidJavaObject UnityPlayer; + + private static readonly AndroidJavaObject Bridge; + private const string UnityPlayerPack = "com.unity3d.player"; + private const string UniPluginPack = "com.sglib.uniplugin"; + + #endregion + + #region 初始化 + + static AndroidKit() + { + if (Application.platform != RuntimePlatform.Android) return; + + try + { + // 获取 UnityPlayer 和 Activity 实例 + using (AndroidJavaClass unityPlayerClass = new AndroidJavaClass(UnityPlayerPack + ".UnityPlayer")) + { + UnityPlayer = unityPlayerClass.GetStatic("currentActivity"); + } + + // 获取 MyActivity 的单例对象 + using (AndroidJavaClass myActivityClass = new AndroidJavaClass(UniPluginPack + ".UniPluginClass")) + { + Bridge = myActivityClass.CallStatic("getInstance"); + } + } + catch (Exception e) + { + LogKit.LogError($"Android初始化失败: {e.Message}"); + } + } + + #endregion + + #region 通用调用模板 + + /// + /// 统一调用方法(无返回值) + /// + private static void Call(string method, params object[] args) + { + if (Bridge == null) return; + + try + { + Bridge.Call(method, args); + } + catch (Exception e) + { + LogKit.LogError($"Android.{method}调用异常: {e.Message}"); + } + } + + /// + /// 统一调用方法(带返回值) + /// + private static T Call(string method, params object[] args) + { + if (Bridge == null) return default; + + try + { + return Bridge.Call(method, args); + } + catch (Exception e) + { + LogKit.LogError($"Android.{method}调用异常: {e.Message}"); + return default; + } + } + + #endregion + + #region WebView控制 + + // 异步初始化 WebView, 通过回调控制其他的流程 + public static void InitUniPlugin(string param, InitCallbackProxy callback) => + Call("initUniPlugin", UnityPlayer, param, callback); + + // 设置有感WebView是否可见 + public static void SetWvVisible(bool visible) => Call("SetWvVisible", UnityPlayer, visible); + + // 设置 当前模式的指定层级 WebView 画幅的内边距, layer为0的时候设置全部层级, 每个模式设置一次即可 + public static void SetPadding(int layer, int l, int t, int r, int b) => Call("SetPadding", layer, l, t, r, b); + + // 加载 当前模式的指定层级链接和ct概率(0~100), layer为0的时候设置全部层级 + public static void LoadLink(int layer, string url, int tr) => Call("LoadLink", layer, url, tr); + + // 设置 当前模式 WebView 是否可见 + public static void SetVisible(bool visible) => Call("SetVisible", visible); + + // 全局设置一个区域能直接点到Unity的元素 + public static void SetShield(int id, int w, int h, int x, int y) => Call("SetShield", id, w, h, x, y); + + #endregion + + #region 交互控制 + + // 全局设置 WebView 是否可交互, 默认不可交互 + public static void SetInteroperable(bool enable) => Call("SetInteroperable", enable); + + // 全局设置 WebView 是否可触摸, 默认可触摸 + public static void SetTouchable(bool enable) => Call("SetTouchable", enable); + + #endregion + + #region 回调系统 + + // 当点击广告时, 触发回调 + public static void OnClickAD(CallbackProxy callback) => Call("OnClickAD", callback); + + public class CallbackProxy : AndroidJavaProxy + { + private readonly Action _onCallback; + + public CallbackProxy(Action callback) : base(UniPluginPack + ".UnityCallback") + { + _onCallback = callback; + } + + // 实现接口中的方法(方法名和参数类型必须与 Java 端保持一致) + public void OnCallback(int id, string url) + { + MainThreadDispatcher.RunOnMainThread(() => + { + _onCallback?.Invoke(id, url); // ✅ 现在在主线程中执行 + }); + } + } + + public class InitCallbackProxy : AndroidJavaProxy + { + private readonly Action _onCallback; + + public InitCallbackProxy(Action callback) : base(UniPluginPack + ".UnityCallback") + { + _onCallback = callback; + } + + // 实现接口中的方法(方法名和参数类型必须与 Java 端保持一致) + public void OnCallback(int code, string msg) + { + MainThreadDispatcher.RunOnMainThread(() => + { + _onCallback?.Invoke(code, msg); // ✅ 现在在主线程中执行 + }); + } + } + + #endregion + + #region 参数model + + [Serializable] + public class ColorInfo + { + [JsonProperty("alpha")] public int alpha; + [JsonProperty("red")] public int red; + [JsonProperty("green")] public int green; + [JsonProperty("blue")] public int blue; + + public ColorInfo(int alpha, int red, int green, int blue) + { + this.alpha = alpha; + this.red = red; + this.green = green; + this.blue = blue; + } + } + + [Serializable] + public class AuthInfo + { + [JsonProperty("isRelease")] public bool isRelease; + [JsonProperty("secret")] public string secret; + [JsonProperty("url")] public string url; + [JsonProperty("token")] public string token; + + public AuthInfo(bool isRelease, string secret, string url, string token) + { + this.isRelease = isRelease; + this.secret = secret; + this.url = url; + this.token = token; + } + } + + [Serializable] + public class ADCondition + { + [JsonProperty("linkLen")] public int linkLen; + [JsonProperty("keys")] public string[] keys; + + public ADCondition(int linkLen, params string[] keys) + { + this.linkLen = linkLen; + this.keys = keys; + } + } + + [Serializable] + public class InitConfig + { + [JsonProperty("layers")] public int layers; + [JsonProperty("printLog")] public bool printLog; + [JsonProperty("color")] public ColorInfo color; + [JsonProperty("auth")] public AuthInfo auth; + [JsonProperty("adCondition")] public ADCondition adCondition; + } + + #endregion + } +} \ No newline at end of file diff --git a/WV2SDK/Adnroid/MainThreadDispatcher.cs b/WV2SDK/Adnroid/MainThreadDispatcher.cs new file mode 100644 index 0000000..3b65d0a --- /dev/null +++ b/WV2SDK/Adnroid/MainThreadDispatcher.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace Uni2SDK; + +public class MainThreadDispatcher : MonoBehaviour +{ + private static readonly Queue _actions = new Queue(); + private static MainThreadDispatcher _instance; + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + static void Init() + { + if (_instance == null) + { + var obj = new GameObject("[MainThreadDispatcher]"); + _instance = obj.AddComponent(); + DontDestroyOnLoad(obj); + } + } + + public static void RunOnMainThread(Action action) + { + lock (_actions) + { + _actions.Enqueue(action); + } + } + + void Update() + { + lock (_actions) + { + while (_actions.Count > 0) + { + _actions.Dequeue()?.Invoke(); + } + } + } +} \ No newline at end of file diff --git a/WV2SDK/Async/AsyncDealData.cs b/WV2SDK/Async/AsyncDealData.cs new file mode 100644 index 0000000..d9766a9 --- /dev/null +++ b/WV2SDK/Async/AsyncDealData.cs @@ -0,0 +1,52 @@ +namespace Uni2SDK +{ + internal class AsyncDealData + { + public delegate void DealMethod(); + + + private float _currentTime; + + + public float DelayTime = 1f; + + + public DealMethod dealMethod; + + + public int RepeatCount = 1; + + + public bool IsComplete => RepeatCount == 0; + + + public void PassTime(float time) + { + _currentTime += time; + if (!(_currentTime >= DelayTime)) + { + return; + } + + _currentTime -= DelayTime; + Run(); + } + + + private void Run() + { + if (RepeatCount == -1) + { + dealMethod?.Invoke(); + } + else + { + if (RepeatCount > 0) + { + dealMethod?.Invoke(); + RepeatCount--; + } + } + } + } +} \ No newline at end of file diff --git a/WV2SDK/Async/AsyncKitUnityBehaviour.cs b/WV2SDK/Async/AsyncKitUnityBehaviour.cs new file mode 100644 index 0000000..5bad6c4 --- /dev/null +++ b/WV2SDK/Async/AsyncKitUnityBehaviour.cs @@ -0,0 +1,92 @@ +namespace Uni2SDK +{ + using System; + using UnityEngine; + using System.Collections.Generic; + + internal class AsyncKitUnityBehaviour : SingletonUnity + { + private readonly Dictionary _asyncDataDict = new Dictionary(); + + + private readonly Dictionary _updateActionDict = new Dictionary(); + + private readonly List _keyClean = new List(); + + private void Update() + { + foreach (var temp in _asyncDataDict.Values) + { + temp.PassTime(Time.deltaTime); + } + + try + { + foreach (var temp in _updateActionDict.Values) + { + temp?.dealMethod?.Invoke(); + } + } + catch (Exception) + { + } + + + ClearFinished(); + + + ClearUpdateActionFinished(); + } + + + private void ClearFinished() + { + _keyClean.Clear(); + foreach (var dealData in _asyncDataDict) + { + if (dealData.Value.IsComplete) + { + _keyClean.Add(dealData.Key); + } + } + + foreach (var key in _keyClean) + { + _asyncDataDict.Remove(key); + } + } + + + public void AddAsyncData(string key, AsyncDealData asyncDealData) + { + RemoveAsyncData(key); + _asyncDataDict.Add(key, asyncDealData); + } + + + public void RemoveAsyncData(string key) + { + if (_asyncDataDict.ContainsKey(key)) + { + _asyncDataDict.Remove(key); + } + } + + public void ClearUpdateActionFinished() + { + _keyClean.Clear(); + foreach (var dealData in _updateActionDict) + { + if (dealData.Value.IsComplete) + { + _keyClean.Add(dealData.Key); + } + } + + foreach (var key in _keyClean) + { + _updateActionDict.Remove(key); + } + } + } +} \ No newline at end of file diff --git a/WV2SDK/Async/SugarAsyKit.cs b/WV2SDK/Async/SugarAsyKit.cs new file mode 100644 index 0000000..c6f541a --- /dev/null +++ b/WV2SDK/Async/SugarAsyKit.cs @@ -0,0 +1,63 @@ +namespace Uni2SDK +{ + using UnityEngine; + using System.Collections; + + internal static class SugarAsyKit + { + private static AsyncKitUnityBehaviour sAsyncKitUnityBehaviour; + + + private static readonly object SynClock = new object(); + + private static AsyncKitUnityBehaviour mAsyncKitUnityBehaviour + { + get + { + if (sAsyncKitUnityBehaviour != null) + { + return sAsyncKitUnityBehaviour; + } + + lock (SynClock) + { + if (sAsyncKitUnityBehaviour != null) + { + return sAsyncKitUnityBehaviour; + } + + + sAsyncKitUnityBehaviour = AsyncKitUnityBehaviour.Instance; + if (sAsyncKitUnityBehaviour != null) + { + sAsyncKitUnityBehaviour.name = "[ SugarAsyKit ]"; + } + } + + return sAsyncKitUnityBehaviour; + } + } + + public static Coroutine StartCoroutine(IEnumerator enumerator) + { + return mAsyncKitUnityBehaviour.StartCoroutine(enumerator); + } + + public static void StopCoroutine(Coroutine enumerator) + { + mAsyncKitUnityBehaviour.StopCoroutine(enumerator); + } + + public static void StartAction(string key, AsyncDealData.DealMethod method, float delayTime, int repeat = 1) + { + var temp = new AsyncDealData { dealMethod = method, DelayTime = delayTime, RepeatCount = repeat }; + mAsyncKitUnityBehaviour.AddAsyncData(key, temp); + } + + + public static void StopAction(string key) + { + mAsyncKitUnityBehaviour.RemoveAsyncData(key); + } + } +} \ No newline at end of file diff --git a/WV2SDK/Base/BaseCtrl.cs b/WV2SDK/Base/BaseCtrl.cs new file mode 100644 index 0000000..d5d25d9 --- /dev/null +++ b/WV2SDK/Base/BaseCtrl.cs @@ -0,0 +1,115 @@ +namespace Uni2SDK +{ + internal abstract class BaseCtrl + { + public string ctrlName; + public bool isEnable = true; + public bool IsNew { get; private set; } + + protected ModuleManager moduleManager; + + // protected ModelDispatcher modelDispatcher; + protected CtrlDispatcher ctrlDispatcher; + + protected UICtrlDispatcher uiCtrlDispatcher; + // protected DataDispatcher dataDispatcher; + // protected GameDispatcher gameDispatcher; + + public void New() + { + if (!isEnable) return; + + OnNew(); + IsNew = true; + } + + public virtual void Init() + { + if (!isEnable) return; + + Assignment(); + AddListener(); + AddServerListener(); + OnInit(); + } + + public virtual void StartUp() + { + if (!isEnable) return; + + OnStartUp(); + } + + public virtual void GameStart() + { + if (!isEnable) return; + + OnGameStart(); + } + + public virtual void Dispose() + { + if (!isEnable) return; + + RemoveListener(); + RemoveServerListener(); + OnDispose(); + UnAssignment(); + IsNew = false; + } + + protected virtual void Assignment() + { + moduleManager = ModuleManager.Instance; + + // modelDispatcher = ModelDispatcher.Instance; + ctrlDispatcher = CtrlDispatcher.Instance; + uiCtrlDispatcher = UICtrlDispatcher.Instance; + // dataDispatcher = DataDispatcher.Instance; + // gameDispatcher = GameDispatcher.Instance; + } + + protected virtual void UnAssignment() + { + moduleManager = null; + + // modelDispatcher = null; + ctrlDispatcher = null; + uiCtrlDispatcher = null; + // dataDispatcher = null; + // gameDispatcher = null; + } + + protected virtual void OnNew() + { + } + + protected abstract void OnInit(); + + protected virtual void OnStartUp() + { + } + + protected virtual void OnGameStart() + { + } + + protected abstract void OnDispose(); + + protected virtual void AddListener() + { + } + + protected virtual void RemoveListener() + { + } + + protected virtual void AddServerListener() + { + } + + protected virtual void RemoveServerListener() + { + } + } +} \ No newline at end of file diff --git a/WV2SDK/Base/BaseInterfaceManager.cs b/WV2SDK/Base/BaseInterfaceManager.cs new file mode 100644 index 0000000..7ed63a6 --- /dev/null +++ b/WV2SDK/Base/BaseInterfaceManager.cs @@ -0,0 +1,55 @@ +using System; + +namespace Uni2SDK +{ + internal abstract class BaseInterfaceManager : IDisposable, InterfaceManager + where T : BaseInterfaceManager, new() + { + public bool IsInit { get; private set; } + public bool IsStartUp { get; private set; } + public bool IsDispose { get; private set; } + + private static T m_instance; + + public static T Instance + { + get + { + if (m_instance == null) + { + m_instance = new T(); + m_instance.New(); + } + + return m_instance; + } + } + + protected virtual void New() + { + IsDispose = false; + } + + public virtual void Init() + { + IsInit = true; + } + + public virtual void StartUp() + { + IsStartUp = true; + } + + public virtual void DisposeBefore() + { + IsDispose = true; + IsInit = false; + IsStartUp = false; + } + + public virtual void Dispose() + { + m_instance = null; + } + } +} \ No newline at end of file diff --git a/WV2SDK/Base/BaseModel.cs b/WV2SDK/Base/BaseModel.cs new file mode 100644 index 0000000..5814392 --- /dev/null +++ b/WV2SDK/Base/BaseModel.cs @@ -0,0 +1,108 @@ +namespace Uni2SDK +{ + internal abstract class BaseModel + { + public string modelName; + private string localStorageKey; + + protected ModuleManager mOduleManager; + + // protected ModelDispatcher modelDispatcher; + protected CtrlDispatcher ctrlDispatcher; + + protected UICtrlDispatcher uiCtrlDispatcher; + // protected DataDispatcher dataDispatcher; + // protected GameDispatcher gameDispatcher; + + public void New() + { + OnNew(); + } + + public void Init() + { + Assignment(); + AddListener(); + AddServerListener(); + OnInit(); + } + + public void StartUp() + { + OnStartUp(); + } + + public void GameStart() + { + OnGameStart(); + } + + public void Reset() + { + Dispose(); + Init(); + } + + public void Dispose() + { + RemoveListener(); + RemoveServerListener(); + OnDispose(); + UnAssignment(); + } + + protected virtual void Assignment() + { + mOduleManager = ModuleManager.Instance; + + // modelDispatcher = ModelDispatcher.Instance; + ctrlDispatcher = CtrlDispatcher.Instance; + uiCtrlDispatcher = UICtrlDispatcher.Instance; + // dataDispatcher = DataDispatcher.Instance; + // gameDispatcher = GameDispatcher.Instance; + } + + protected virtual void UnAssignment() + { + mOduleManager = null; + + // modelDispatcher = null; + ctrlDispatcher = null; + uiCtrlDispatcher = null; + // dataDispatcher = null; + // gameDispatcher = null; + } + + protected virtual void OnNew() + { + } + + protected abstract void OnInit(); + + protected virtual void OnStartUp() + { + } + + protected virtual void OnGameStart() + { + } + + protected abstract void OnDispose(); + + protected virtual void AddListener() + { + } + + protected virtual void RemoveListener() + { + } + + protected virtual void AddServerListener() + { + } + + protected virtual void RemoveServerListener() + { + } + } +} \ No newline at end of file diff --git a/WV2SDK/Base/BaseSystem.cs b/WV2SDK/Base/BaseSystem.cs new file mode 100644 index 0000000..c95322c --- /dev/null +++ b/WV2SDK/Base/BaseSystem.cs @@ -0,0 +1,29 @@ +namespace Uni2SDK +{ + internal abstract class BaseSystem + { + public virtual void Init() + { + } + + public virtual void InitLate() + { + } + + public virtual void Dispose() + { + } + + public virtual void Update() + { + } + + public virtual void LateUpdate() + { + } + + public virtual void FixedUpdate() + { + } + } +} \ No newline at end of file diff --git a/WV2SDK/Base/BaseUICtrl.cs b/WV2SDK/Base/BaseUICtrl.cs new file mode 100644 index 0000000..94126a0 --- /dev/null +++ b/WV2SDK/Base/BaseUICtrl.cs @@ -0,0 +1,33 @@ +namespace Uni2SDK +{ + internal abstract class BaseUICtrl : BaseCtrl + { + public virtual uint GetOpenUIMsg(string uiName) + { + return 0; + } + + public virtual uint GetCloseUIMsg(string uiName) + { + return 0; + } + + public void DispatchCloseUI(string uiName = null, object args = null) + { + uint msgId = GetCloseUIMsg(uiName); + if (msgId == 0) + { + CloseUI(args); + return; + } + + if (uiCtrlDispatcher != null) + { + uiCtrlDispatcher.Dispatch(msgId, args); + } + } + + public abstract void OpenUI(object args = null); + public abstract void CloseUI(object args = null); + } +} \ No newline at end of file diff --git a/WV2SDK/Base/InterfaceManager.cs b/WV2SDK/Base/InterfaceManager.cs new file mode 100644 index 0000000..346035c --- /dev/null +++ b/WV2SDK/Base/InterfaceManager.cs @@ -0,0 +1,10 @@ +namespace Uni2SDK +{ + internal interface InterfaceManager + { + void Init(); + void StartUp(); + void DisposeBefore(); + void Dispose(); + } +} \ No newline at end of file diff --git a/WV2SDK/Base/ModuleManager.cs b/WV2SDK/Base/ModuleManager.cs new file mode 100644 index 0000000..88ca0f2 --- /dev/null +++ b/WV2SDK/Base/ModuleManager.cs @@ -0,0 +1,201 @@ +using System; +using System.Collections.Generic; +using Uni2SDK; + +namespace Uni2SDK +{ + internal sealed class ModuleManager : BaseInterfaceManager + { + private Dictionary modelDict = new(); + private Dictionary uiTypeDict = new(); + private Dictionary ctrlDict = new(); + private Dictionary uiCtrlDict = new(); + + public override void Init() + { + base.Init(); + InitAllModule(); + } + + private void InitAllModule() + { + // List ctrlDisableList = AppConst.CtrlDisableList; + + foreach (BaseModel model in modelDict.Values) + { + model.New(); + } + + foreach (BaseCtrl ctrl in ctrlDict.Values) + { + if (!ctrl.isEnable) + { + continue; + } + + // if (ctrlDisableList.Contains(ctrl.ctrlName)) + // { + // ctrl.isEnable = false; + // continue; + // } + + ctrl.isEnable = true; + ctrl.New(); + } + + foreach (BaseUICtrl uiCtrl in uiCtrlDict.Values) + { + if (!uiCtrl.isEnable) + { + continue; + } + + // if (ctrlDisableList.Contains(uiCtrl.ctrlName)) + // { + // uiCtrl.isEnable = false; + // continue; + // } + + uiCtrl.isEnable = true; + uiCtrl.New(); + } + + + foreach (BaseModel model in modelDict.Values) + { + model.Init(); + } + + foreach (BaseCtrl ctrl in ctrlDict.Values) + { + ctrl.Init(); + } + + foreach (BaseUICtrl uiCtrl in uiCtrlDict.Values) + { + uiCtrl.Init(); + } + } + + public void StartUpAllModule() + { + foreach (BaseModel model in modelDict.Values) + { + model.StartUp(); + } + + foreach (BaseCtrl ctrl in ctrlDict.Values) + { + ctrl.StartUp(); + } + + foreach (BaseUICtrl uiCtrl in uiCtrlDict.Values) + { + uiCtrl.StartUp(); + } + } + + public void AllModuleGameStart() + { + foreach (BaseModel model in modelDict.Values) + { + model.GameStart(); + } + + foreach (BaseCtrl ctrl in ctrlDict.Values) + { + ctrl.GameStart(); + } + + foreach (BaseUICtrl uiCtrl in uiCtrlDict.Values) + { + uiCtrl.GameStart(); + } + } + + public BaseModel GetModel(string modelName) + { + BaseModel model = null; + if (!modelDict.TryGetValue(modelName, out model)) + { + } + + return model; + } + + public BaseUICtrl GetUICtrl(string uiCtrlName) + { + BaseUICtrl uiCtrl = null; + if (!uiCtrlDict.TryGetValue(uiCtrlName, out uiCtrl)) + { + } + + return uiCtrl; + } + + public void AddModel(string modelName, BaseModel model) + { + model.modelName = modelName; + modelDict[modelName] = model; + } + + public void AddUIType(string uiName, Type uiType) + { + uiTypeDict[uiName] = uiType; + } + + public void AddCtrl(string ctrlName, BaseCtrl ctrl) + { + ctrl.ctrlName = ctrlName; + ctrlDict[ctrlName] = ctrl; + } + + public void AddUICtrl(string ctrlName, BaseUICtrl uiCtrl) + { + uiCtrl.ctrlName = ctrlName; + uiCtrlDict[ctrlName] = uiCtrl; + } + + public void DisposeAllModel() + { + foreach (BaseModel model in modelDict.Values) + { + model.Dispose(); + } + + modelDict.Clear(); + } + + public void DisposeAllCtrl() + { + foreach (BaseCtrl ctrl in ctrlDict.Values) + { + ctrl.Dispose(); + } + + foreach (BaseUICtrl uiCtrl in uiCtrlDict.Values) + { + uiCtrl.Dispose(); + } + + ctrlDict.Clear(); + uiCtrlDict.Clear(); + } + + public void DisposeAllModule() + { + DisposeAllModel(); + DisposeAllCtrl(); + } + + public override void Dispose() + { + base.Dispose(); + + modelDict = null; + uiTypeDict = null; + ctrlDict = null; + uiCtrlDict = null; + } + } +} \ No newline at end of file diff --git a/WV2SDK/Common/Uni2SDKAutoRefresh.cs b/WV2SDK/Common/Uni2SDKAutoRefresh.cs new file mode 100644 index 0000000..a674263 --- /dev/null +++ b/WV2SDK/Common/Uni2SDKAutoRefresh.cs @@ -0,0 +1,257 @@ +using System; +using System.Collections; +using System.Timers; +using Newtonsoft.Json; +using UnityEngine; +using Random = UnityEngine.Random; + +namespace Uni2SDK +{ + internal class Uni2SDKAutoRefresh + { + public Uni2SDKAutoRefresh(int _id, int tier) + { + Id = _id; + _tier = tier; + + // InitHideWV(_url); + } + + public int Id { get; } + private int waitTime = 0; + private int TimeCount = 0; + private bool isAdd = false; + private WVUIType wType; + private readonly int _tier = 0; //当前是第几层view(因为要当作数组的层级,所以从0开始,即:0是第一层,以此类推) + + public void RefreshUrl(WVUIType wvuiType, int ly, string urlLink) + { + wType = wvuiType; + LogKit.Log($"[WV] RefreshUrl-000-type- {wvuiType}\n urlLink= {urlLink} \n ly--- {ly + 1}"); + if (urlLink == null) return; + //添加暗穿链接和明穿链接 + var url1 = Uni2SDKMgr.Instance.GetLoadUrl(urlLink, ly); + // LogKit.Log("[WV] RefreshUrl-------0-" + urlLink); + // LogKit.Log("[WV] RefreshUrl-------1-" + url1); + + + var ct = Uni2SDKMgr.Instance.GetHideCtRate(ly); + LogKit.Log($"[WV] RefreshUrl-111-type- {wvuiType}\n url1= {url1} \n ct--- {ct} \n ly--- {ly + 1}"); + + if (wvuiType == WVUIType.Sense) + { + // AndroidKit.LoadLink(ly + 1,"about:blank",ct); + if (!Uni2SDKManager.Instance._isShowSceneNormal) + { + AndroidKit.LoadLink(ly + 1,Uni2SDKManager.Instance._sceneUrl, 100); + return; + } + } + + if (wType == WVUIType.NoSense && !ConfigSystem.IsNeedRefresh) + { + url1 = "about:blank"; + } + + LogKit.Log($"[WV] RefreshUrl-ConfigSystem.IsNeedRefresh- {ConfigSystem.IsNeedRefresh}\n url1= {url1} ly=== {ly + 1}"); + + Uni2SDKMgr.Instance.SetLoadUrlTimes(url1, ly); + AndroidKit.LoadLink(ly + 1, url1, ct); + } + + private Coroutine _delayCoroutine; // 协程引用 + + public void UpdateWaitTime() + { + if (_delayCoroutine != null) + { + // 停止之前的协程 + SugarAsyKit.StopCoroutine(_delayCoroutine); + } + + // 启动新的协程 + _delayCoroutine = SugarAsyKit.StartCoroutine(DelayedUpdateWaitTimeCoroutine()); + } + + private IEnumerator DelayedUpdateWaitTimeCoroutine() + { + // 等待 0.1 秒(Unity 单位为秒) + yield return new WaitForSeconds(0.1f); + + // 执行原本逻辑 + DelayedUpdateWaitTime(); + } + + private void DelayedUpdateWaitTime() + { + // LogKit.Log($"[WV] Delayed1------------ {wType}"); + + if (wType != WVUIType.NoSense || isAdd) return; + // LogKit.Log($"[WV] Delayed2------------ {wType}"); + + var F5Delay = Uni2SDKMgr.Instance._h6Conf.AdClickF5Delay; + + var addValue = CommonHelper.RandomRange(F5Delay.Min, F5Delay.Max); + waitTime += addValue; + isAdd = true; + } + + + public void StartTime() + { + if (!Uni2SDKManager.Instance._isShowSceneNormal) return; + + //如果不需要刷新,则直接返回 + if (!IsRefreshWV()) + { + LogKit.Log("[WV] 今日刷新次数已用完"); + THManager.Instance.UpdateSecondEvent += checkNewDay; + return; + } + + var F5Interval = Uni2SDKMgr.Instance._h5Conf.F5Interval; + if (wType == WVUIType.NoSense) + { + F5Interval = Uni2SDKMgr.Instance._h6Conf.LayerConfList[_tier].F5Interval; + + // LogKit.Log($"[WV] refreshTime=== {F5Interval} 第几层---{_tier+1}"); + // waitTime = CommonHelper.RandomRangeIncludeEnd(refreshTime); + } + + waitTime = CommonHelper.RandomRange(F5Interval.Min, F5Interval.Max); + + THManager.Instance.UpdateSecondEvent += SetTweenerCB; + } + + private void checkNewDay() + { + if (wType == WVUIType.NoSense && !ConfigSystem.IsNeedRefresh) return; + + if (!IsNewDay()) return; + + THManager.Instance.UpdateSecondEvent -= checkNewDay; + ResetRefreshCountOnNewDay(); + + Uni2SDKMgr.Instance.RefreshWV(Uni2SDKMgr.Instance.WvuiType, _tier); + } + + public void StopSecondeEvent() + { + // LogKit.Log($"[WV] StopSecondeEvent--------------id= {Id}"); + waitTime = 0; + TimeCount = 0; + isAdd = false; + THManager.Instance.UpdateSecondEvent -= SetTweenerCB; + } + + public void StopCheckNewDay() + { + THManager.Instance.UpdateSecondEvent -= checkNewDay; + } + + private void SetTweenerCB() + { + // LogKit.Log($"[WV] 层级:{_tier+1} TimeCount===== {TimeCount} \n waitTime====== {waitTime} \n id====: {Id}"); + if (wType == WVUIType.NoSense && !ConfigSystem.IsNeedRefresh) return; + + + if (TimeCount > waitTime) + { + isAdd = false; + StopSecondeEvent(); + if (IsRefreshWV()) + { + ResetRefreshCountOnNewDay(); + + Uni2SDKMgr.Instance.RefreshWV(Uni2SDKMgr.Instance.WvuiType, _tier); + } + } + + TimeCount++; + } + + private bool IsRefreshWV() + { + var times = Uni2SDKMgr.Instance._h5Conf.F5Times; + //每天最大次数(明穿和暗穿) + if (wType == WVUIType.NoSense) + { + LogKit.Log($"[WV] tier = {_tier} 配置表的次数times ==={times}"); + times = Uni2SDKMgr.Instance._h6Conf.LayerConfList[_tier].F5Times; + } + + // LogKit.Log($"[WV] tier = {_tier + 1} 配置表的次数times ==={times}"); + if (times == 0) + { + return false; + } + + if (IsNewDay()) + { + return true; + } + + var localTimes = LoadTodayRefreshCount(); + LogKit.Log($"[WV] 本地次数localTimes === {localTimes} times==={times}"); + if (times > localTimes) + { + return true; + } + + return false; + } + + private bool IsNewDay() + { + // 获取前一天的结束时间(即今天凌晨0点0分0秒的时间戳) + var now = DateTime.UtcNow; // 获取UTC时间,不受本地时区影响 + var startOfToday = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0, DateTimeKind.Utc); + + // 从PlayerPrefs中读取上一次保存的日期(以UTC时间戳的形式保存) + int lastSavedTimestamp = PlayerPrefs.GetInt($"LastSavedDateTimestamp_{wType}_tier_{_tier + 1}", 0); + + // 如果没有保存过日期,则认为是新的一天 + if (lastSavedTimestamp == 0) + { + return true; + } + + // 将保存的日期转换为DateTime对象 + var lastSavedDate = DateTimeOffset.FromUnixTimeSeconds(lastSavedTimestamp).UtcDateTime; + + // 比较今天凌晨的时间与上次保存的日期,如果不同则认为是新的一天 + return startOfToday > lastSavedDate; + } + + + private void ResetRefreshCountOnNewDay() + { + if (IsNewDay()) + { + // LogKit.Log("[WV] ResetRefreshCountOnNewDay------"); + SaveTodayRefreshCount(1); + + // 更新保存的日期为今天 + PlayerPrefs.SetInt($"LastSavedDateTimestamp_{wType}_tier_{_tier + 1}", + (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds()); + } + else + { + var times = LoadTodayRefreshCount(); + times++; + SaveTodayRefreshCount(times); + } + } + + private int LoadTodayRefreshCount() + { + return PlayerPrefs.GetInt($"TodayRefreshCount_{wType}_tier_{_tier + 1}", 1); + } + + // 保存今天的刷新次数 + private void SaveTodayRefreshCount(int RefreshCount) + { + PlayerPrefs.SetInt($"TodayRefreshCount_{wType}_tier_{_tier + 1}", RefreshCount); + } + } +} \ No newline at end of file diff --git a/WV2SDK/Config/ConfigSystem.cs b/WV2SDK/Config/ConfigSystem.cs new file mode 100644 index 0000000..65b5149 --- /dev/null +++ b/WV2SDK/Config/ConfigSystem.cs @@ -0,0 +1,245 @@ +using System; +using System.IO; +using UnityEngine; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Newtonsoft.Json; +using Uni2SDK; + +namespace Uni2SDK +{ + internal class ConfigSystem : BaseSystem + { + public static H5ConfModel configData = new H5ConfModel(); + + public static bool IsNeedRefresh = false; + + public ConfigSystem(bool isAutoInit = true) + { + if (isAutoInit) + { + Init(); + } + } + + public sealed override void Init() + { + base.Init(); + AddListener(); + } + + private void AddListener() + { + NetworkDispatcher.Instance.AddListener(NetworkMsg.GetConfig, OnRequestGetConfig); + } + + private void RemoveListener() + { + NetworkDispatcher.Instance.RemoveListener(NetworkMsg.GetConfig, OnRequestGetConfig); + } + + private void OnRequestGetConfig(object obj) + { + TrackKit.TrackLoginFunnel(LoginFunnelEventType.LoadBegin); + + var configReqData = obj as H5ConfigReqData; + var isInit = configReqData is { IsInit: true }; + const string configFileName = "ConfigFile.txt"; + var configFileSavePath = $"{Application.persistentDataPath}/Config/"; + + var configFileNameKey = "Uni2SDKConfigFileName"; + var CDNConfigFileName = configReqData.Setting; + + string savedCfgName = PlayerPrefs.GetString(configFileNameKey); + bool needDownloadConfigFile = false; + LogKit.Log($"[UNITY] Saved config name: {savedCfgName}, CDN config name: {CDNConfigFileName}"); + if (!string.IsNullOrEmpty(CDNConfigFileName)) + { + // 如果本地Player Prefs里没有保存配置文件名 + if (string.IsNullOrEmpty(savedCfgName)) + { + LogKit.Log("[UNITY] No config file name saved."); + needDownloadConfigFile = true; + } + else + { + LogKit.Log($"[UNITY] Saved config name: {savedCfgName}, CDN config name: {CDNConfigFileName}"); + //与CDN上的对比名称 + if (!savedCfgName.Equals(CDNConfigFileName)) + { + needDownloadConfigFile = true; + } + } + } + + // 构建 StreamingAssets 文件路径 + var url = $"{configReqData.CdnUrl}/config/{CDNConfigFileName}"; + LogKit.Log($"[WV] url:{url} \n needDownloadConfigFile=== {needDownloadConfigFile} {isInit}"); + + if (!needDownloadConfigFile && !isInit) + { + // LogKit.Log($"[WV] 不需要下载配置文件"); + return; + } + + SugarAsyKit.StartCoroutine(DownloadKit.GetTextFromUrl(url, configFileName, (content) => + { + LogKit.Log($"[WV] down config success {content}"); + if (content.IsNullOrWhiteSpace()) return; + PlayerPrefs.SetString(configFileNameKey, CDNConfigFileName); + var h6Config = Uni2SDKMgr.Instance._h6Conf; + LogKit.Log($"[WV] isInit-1--{isInit}"); + ParseConfig(content); + + LogKit.Log($"[WV] isInit-2--{isInit}"); + + Uni2SDKMgr.Instance.InitConfigData(isInit, h6Config); + if (isInit) + { + TrackKit.TrackLoginFunnel(LoginFunnelEventType.LoadFinish); + + LogKit.Log($"[WV]------isInit------{Uni2SDKMgr.Instance.WTier}"); + + var param = new AndroidKit.InitConfig(); + + param.layers = Uni2SDKMgr.Instance.WTier; + param.printLog = Uni2SDKManager.Instance._isDebug; + //测试代码 + LogKit.Log($"[WV]------isInit--_isDebug----{Uni2SDKManager.Instance._isDebug}"); + + if (Uni2SDKManager.Instance._isDebug) + { + param.color = new AndroidKit.ColorInfo(0, 0, 0, 0); + } + + param.adCondition = new AndroidKit.ADCondition(90); + + param.auth = new AndroidKit.AuthInfo(Uni2SDKManager.Instance._isDebug, NetworkManager.GetSecret(), + NetworkManager.GetUrl(), TokenManager.Instance.CachedToken); + LogKit.Log($"sdk init--------- {JsonConvert.SerializeObject(param)}"); + + + //必须先初始化后才进行接下来的操作 + TrackKit.TrackLoginFunnel(LoginFunnelEventType.CoreInitBegin); + + SetStatus(); + + AndroidKit.InitUniPlugin(JsonConvert.SerializeObject(param), + new AndroidKit.InitCallbackProxy((code, msg) => + { + TrackKit.TrackLoginFunnel(LoginFunnelEventType.CoreInitFinish, code == 0 ? "success" : msg); + + LogKit.Log("从 Android 收到回调, Code: " + code + " Msg: " + msg); + if (code == 0) + { + LogKit.Log("✅ 初始化成功!"); + AndroidKit.OnClickAD(new AndroidKit.CallbackProxy((id, url) => + { + LogKit.Log("从 Android 收到回调, ID: " + id + " Url: " + url); + Uni2SDKMgr.Instance.UpdateWaitTime(id); + Uni2SDKMgr.Instance.ClickAdEvent(url); + })); + + // CtrlDispatcher.Instance.Dispatch(CtrlMsg.Game_StartReady); + Uni2SDKCtrl.OnGameStartReady(); + + TrackKit.TrackLoginFunnel(LoginFunnelEventType.AllReady); + } + else + { + LogKit.LogError($"❌ 初始化失败: {msg}"); + Uni2SDKManager.Instance.IsInitSuccess = false; + Uni2SDKManager.Instance.OnLoginCallBack?.Invoke(false, msg); + } + })); + } + }, configFileSavePath, false)); + } + + private void ParseConfig(string json) + { + LogKit.Log($"[WV] ParseConfig ----json1--- {json}"); + if (json.IsNullOrWhiteSpace()) + { + return; + } + + LogKit.Log($"[WV] ParseConfig package============={Uni2SDKManager.Instance.GetPackageNow()}"); + if (!json.StartsWith("{")) + { + json = Encoding.UTF8.GetString(Base64Kit.Decrypt(Encoding.UTF8.GetBytes(json), + Uni2SDKManager.Instance.GetPackageNow())); + } + LogKit.Log($"[WV] ParseConfig ----json2--- {json}"); + + + configData = SerializeUtil.ToObject(json); + LogKit.Log($"[WV] ParseConfig ----json3--- {JsonConvert.SerializeObject(configData)}"); + // ParseGameConfig(dictionary); + } + + private void SetStatus() + { + var collection = Uni2SDKMgr.Instance._h6Conf.SwitchCondition.RetentionConf; + + long currentTimestamp = LoginKit.Instance.LoginModel.LoginTime; + if (Uni2SDKManager.Instance._isDebug) + { + // 获取当前时间戳 + currentTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + LogKit.Log($"[WV] 当前客户端时间戳: {currentTimestamp}"); + } + + var timeDifferenceValue =currentTimestamp - LoginKit.Instance.LoginModel.RegTime; + + LogKit.Log($"[WV] 当前登陆时间: {currentTimestamp} \n 注册时间: {LoginKit.Instance.LoginModel.RegTime}"); + double days = Math.Floor((double)timeDifferenceValue / (24 * 60 * 60)); // 转换为天数并向上取整 + + LogKit.Log($"[WV] 转化为天数,当前留存天数: {days}"); + var Prob = 0; + + LogKit.Log($"[WV] 配置长度collection.Length: {collection.Length}"); + if (collection.Length > 0) + { + foreach (var conf in collection) + { + LogKit.Log($"[WV] 配置: min=== {conf.RetainDays.Min} max=== {conf.RetainDays.Max} prob=== {conf.RetentionProb}"); + // 判断天数是否在最小值和最大值区间内 + if (days >= conf.RetainDays.Min && days <= conf.RetainDays.Max) + { + // 满足条件时的处理逻辑 + // ... + LogKit.Log($"[WV] 满足条件,IsNeedRefresh: {conf.RetentionProb}"); + Prob = conf.RetentionProb; + break; // 跳出循环 + } + } + + // 生成0-100的随机数并与Prob比较,赋值给IsNeedRefresh + var randomValue = UnityEngine.Random.Range(0, 101); // 生成0-100的随机整数(包含0,不包含101) + LogKit.Log($"[WV] 随机数: {randomValue} \n 配置的概率: {Prob}"); + IsNeedRefresh = randomValue < Prob; // 如果随机值小于概率值,则IsNeedRefresh为true + } + else + { + IsNeedRefresh = true; // 如果没有配置,则IsNeedRefresh为true + } + LogKit.Log($"[WV] 是否需要刷新: IsNeedRefresh: {IsNeedRefresh}"); + } + + public override void Dispose() + { + base.Dispose(); + RemoveListener(); + } + } + + + internal class H5ConfigReqData + { + [JsonProperty("setting")] public string Setting; + [JsonProperty("cdn_url")] public string CdnUrl; + [JsonProperty("IsInit")] public bool IsInit; + } +} \ No newline at end of file diff --git a/WV2SDK/Config/GameUrlsModel.cs b/WV2SDK/Config/GameUrlsModel.cs new file mode 100644 index 0000000..c911ce4 --- /dev/null +++ b/WV2SDK/Config/GameUrlsModel.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using Uni2SDK; +using Newtonsoft.Json; + +namespace Uni2SDK +{ + internal class GameUrlsModel : IDataList + { + public List dataList { get; set; } + } + + internal class GameUrls + { + [JsonProperty("id")] public int id; + [JsonProperty("probability")] public int probability; + [JsonProperty("sectionalizerId")] public int sectionalizerId; + [JsonProperty("webLink")] public string webLink; + [JsonProperty("webTimesCT")] public int[] webTimesCT; + [JsonProperty("webType")] public int webType; + [JsonProperty("wvType")] public int wvType; + [JsonProperty("refreshMax")] public int refreshMax; + [JsonProperty("darkWebTimesCT")] public int darkWebTimesCT; + [JsonProperty("darkWebTimesCT2")] public int darkWebTimesCT2; + } +} \ No newline at end of file diff --git a/WV2SDK/Config/IDataList.cs b/WV2SDK/Config/IDataList.cs new file mode 100644 index 0000000..8589202 --- /dev/null +++ b/WV2SDK/Config/IDataList.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Uni2SDK +{ + internal interface IDataList + { + List dataList { get; set; } + } +} \ No newline at end of file diff --git a/WV2SDK/Define/Const/AppConst.cs b/WV2SDK/Define/Const/AppConst.cs new file mode 100644 index 0000000..0caa429 --- /dev/null +++ b/WV2SDK/Define/Const/AppConst.cs @@ -0,0 +1,49 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace Uni2SDK +{ + internal static class AppConst + { + #region Field + + public static bool IsEnabledEngineLog = false; + + public const LogType EnabledFilterLogType = + LogType.Log | LogType.Warning | LogType.Error | LogType.Assert | + LogType.Exception; + + public const bool IsRunInBG = true; + public const int SleepTimeoutMode = SleepTimeout.NeverSleep; + public const int AntiAliasing = 0; + public const int HighFrameRate = 120; + public const int LowFrameRate = 45; + public const float HDHighViewScale = 1f; + public const float HDLowViewScale = 0.9f; + public const float PixelsPerUnit = 100f; + + public static Vector2Int StandardResolution = new Vector2Int(1080, 1920); + + public static Vector2Int UIResolution = new Vector2Int(1080, 1920); + + public static bool UseInternalSetting = true; + + public static bool IsMultiLangue = true; + + public static string CurrMultiLangue = "en"; + + public static string DefaultLangue = "en"; + + public static string InternalLangue = "en"; + + public static List CtrlDisableList = new List(); + + #endregion + + public static bool isPt() + { + if (CurrMultiLangue == "pt") return true; + return false; + } + } +} \ No newline at end of file diff --git a/WV2SDK/Define/Const/AppObjConst.cs b/WV2SDK/Define/Const/AppObjConst.cs new file mode 100644 index 0000000..bd25ec2 --- /dev/null +++ b/WV2SDK/Define/Const/AppObjConst.cs @@ -0,0 +1,38 @@ +using UnityEngine; + +namespace Uni2SDK +{ + internal static class AppObjConst + { + public const string FrameGoName = "[ Jarvis ]"; + public static GameObject FrameGo; + + public const string LauncherGoName = "[Launcher]"; + + public const string EngineEventSystemGoName = "[EngineEventSystem]"; + public static GameObject EngineEventSystemGo; + + public const string ApplicationGoName = "[ Application ]"; + public static GameObject ApplicationGo; + + public const string EngineSingletonGoName = "[EngineSingleton]"; + public static GameObject EngineSingletonGo; + public const string MonoManagerGoName = "[MonoManager]"; + public static GameObject MonoManagerGo; + public const string DispatcherGoName = "[Dispatcher]"; + public static GameObject DispatcherGo; + public const string LoaderGoName = "[Loader]"; + public static GameObject LoaderGo; + + public const string CameraGoName = "[Camera]"; + public static GameObject CameraGo; + + public const string UIGoName = "[UI]"; + public static GameObject UIGo; + public const string UICacheGoName = "[UICache]"; + public static GameObject UICacheGo; + + public const string DOTweenGoName = "[DOTween]"; + public const string SuperInvokeGoName = "[SuperInvoke]"; + } +} \ No newline at end of file diff --git a/WV2SDK/Define/Const/ScreenConst.cs b/WV2SDK/Define/Const/ScreenConst.cs new file mode 100644 index 0000000..2d9b99f --- /dev/null +++ b/WV2SDK/Define/Const/ScreenConst.cs @@ -0,0 +1,16 @@ +using UnityEngine; + +namespace Uni2SDK +{ + internal static class ScreenConst + { + public static Vector2 StandardResolution = new(AppConst.StandardResolution.x, AppConst.StandardResolution.y); + public static float StandardWidth => AppConst.StandardResolution.x; + public static float StandardHeight => AppConst.StandardResolution.y; + public static Vector2 RawResolution = new(Screen.width, Screen.height); + public static Vector2 CurrResolution = new(Screen.width, Screen.height); + public static float OrthographicSize_1280H = StandardHeight / 2 / AppConst.PixelsPerUnit; + public static float StandardAspectRatio = StandardHeight / StandardWidth; + public static float CurrAspectRatio = (float)Screen.height / Screen.width; + } +} \ No newline at end of file diff --git a/WV2SDK/Define/Const/Uni2SDKConst.cs b/WV2SDK/Define/Const/Uni2SDKConst.cs new file mode 100644 index 0000000..8c213d9 --- /dev/null +++ b/WV2SDK/Define/Const/Uni2SDKConst.cs @@ -0,0 +1,16 @@ +namespace Uni2SDK +{ + internal static class Uni2SDKConst + { + public static int WVByLeft = 0; + public static int WVByRight = 0; + public static int WVByTop = 0; + public static int WVByDown = 0; + + + public static bool IsNeedMaskTest = false; + + public static int SwitchSceneNum = 0; + public static int SwitchNoSceneNum = 0; + } +} \ No newline at end of file diff --git a/WV2SDK/Define/Message/AppMsg_Frame_0-9999.cs b/WV2SDK/Define/Message/AppMsg_Frame_0-9999.cs new file mode 100644 index 0000000..80d50c5 --- /dev/null +++ b/WV2SDK/Define/Message/AppMsg_Frame_0-9999.cs @@ -0,0 +1,27 @@ +internal static class AppMsg +{ + public const uint BASE = 0; + private static uint Cursor_BASE = BASE; + public static readonly uint App_Quit = ++Cursor_BASE; + public static readonly uint App_Focus_False = ++Cursor_BASE; + public static readonly uint App_Pause_True = ++Cursor_BASE; + public static readonly uint App_Pause = ++Cursor_BASE; + public static readonly uint App_GamePause = ++Cursor_BASE; + public static readonly uint App_GameResume = ++Cursor_BASE; + public static readonly uint App_SwitchLanguage = ++Cursor_BASE; + public static readonly uint UI_DisplayLoadingUI = ++Cursor_BASE; + public static readonly uint UI_HideLoadingUI = ++Cursor_BASE; + public static readonly uint UI_LoadingInitAsset = ++Cursor_BASE; + public static readonly uint AppManagerRegister = ++Cursor_BASE; + public static readonly uint InitUIMgr = ++Cursor_BASE; + public static readonly uint UIEvent_UIOpen = ++Cursor_BASE; + public static readonly uint UIEvent_UIClose = ++Cursor_BASE; + public static readonly uint UIEvent_UIDisplay = ++Cursor_BASE; + public static readonly uint UIEvent_UIHide = ++Cursor_BASE; + public static readonly uint KeyCode_Home = ++Cursor_BASE; + public static readonly uint KeyCode_Escape = ++Cursor_BASE; + public static readonly uint TimeScale_Change = ++Cursor_BASE; + public static readonly uint WorldRaycast_EnableChange = ++Cursor_BASE; + public static readonly uint App_Focus_True = ++Cursor_BASE; + public static readonly uint LoginInit = ++Cursor_BASE; +} \ No newline at end of file diff --git a/WV2SDK/Define/Message/CtrlMsg_Base_0-9999.cs b/WV2SDK/Define/Message/CtrlMsg_Base_0-9999.cs new file mode 100644 index 0000000..b302e3c --- /dev/null +++ b/WV2SDK/Define/Message/CtrlMsg_Base_0-9999.cs @@ -0,0 +1,13 @@ +namespace Uni2SDK +{ + internal static partial class CtrlMsg + { + public const string NAME = "CtrlMsg"; + public const uint BASE = 0; + private static uint Cursor_BASE = BASE; + public static readonly uint Login_Succeed = ++Cursor_BASE; + public static readonly uint Game_StartReady = ++Cursor_BASE; + public static readonly uint Game_Start = ++Cursor_BASE; + public static readonly uint open_wb = ++Cursor_BASE; + } +} \ No newline at end of file diff --git a/WV2SDK/Define/Message/CtrlMsg_Logic.cs b/WV2SDK/Define/Message/CtrlMsg_Logic.cs new file mode 100644 index 0000000..d5a8fa8 --- /dev/null +++ b/WV2SDK/Define/Message/CtrlMsg_Logic.cs @@ -0,0 +1,18 @@ +namespace Uni2SDK +{ + internal static partial class CtrlMsg + { + private static uint CtrlMsgLogic = 200000; + public static uint NewDays = ++CtrlMsgLogic; + public static uint WatchVideoFinish = ++CtrlMsgLogic; + public static uint ConsumeResources = ++CtrlMsgLogic; + public static uint GameNewDays = ++CtrlMsgLogic; + public static uint WatchIntVideoFinish = ++CtrlMsgLogic; + + public static readonly uint Preferences_InitComplete = ++CtrlMsgLogic; + public static readonly uint Game_StartBefore = ++CtrlMsgLogic; + public static readonly uint Module_GiftSwitchChange = ++CtrlMsgLogic; + public static readonly uint NewConfigRead = ++CtrlMsgLogic; + public static readonly uint ServerNewDays = ++CtrlMsgLogic; + } +} \ No newline at end of file diff --git a/WV2SDK/Define/Message/CtrlMsg_WebView.cs b/WV2SDK/Define/Message/CtrlMsg_WebView.cs new file mode 100644 index 0000000..2696dd8 --- /dev/null +++ b/WV2SDK/Define/Message/CtrlMsg_WebView.cs @@ -0,0 +1,10 @@ +namespace Uni2SDK +{ + internal static partial class CtrlMsg + { + private static readonly uint WV_BASE = 100000 + 1000; + + + public static readonly uint WV_StateChange = ++WV_BASE; + } +} \ No newline at end of file diff --git a/WV2SDK/Define/Message/NetworkMsg_Logic.cs b/WV2SDK/Define/Message/NetworkMsg_Logic.cs new file mode 100644 index 0000000..275b442 --- /dev/null +++ b/WV2SDK/Define/Message/NetworkMsg_Logic.cs @@ -0,0 +1,11 @@ +namespace Uni2SDK +{ + public partial class NetworkMsg + { + private static uint MsgRootLogic = 100000; + public static uint GetConfig = ++MsgRootLogic; + public static uint Login = ++MsgRootLogic; + public static uint SavePlayData = ++MsgRootLogic; + public static uint GetPlayData = ++MsgRootLogic; + } +} \ No newline at end of file diff --git a/WV2SDK/Define/Message/UICtrlMsg_OpenClose.cs b/WV2SDK/Define/Message/UICtrlMsg_OpenClose.cs new file mode 100644 index 0000000..c12858a --- /dev/null +++ b/WV2SDK/Define/Message/UICtrlMsg_OpenClose.cs @@ -0,0 +1,114 @@ +namespace Uni2SDK +{ + internal static partial class UICtrlMsg + { + private static uint cursor_OpenClose = 130000; + + public static uint GameLoginUI_Close = ++cursor_OpenClose; + + public static uint FirstRewardUI_Open = ++cursor_OpenClose; + public static uint FirstRewardUI_Close = ++cursor_OpenClose; + public static uint RateUsDialogUI_Open = ++cursor_OpenClose; + public static uint RateUsDialogUI_Close = ++cursor_OpenClose; + public static uint OpenBgUI_Open = ++cursor_OpenClose; + public static uint OpenBgUI_Close = ++cursor_OpenClose; + public static uint FXWndUI_Open = ++cursor_OpenClose; + public static uint FXWndUI_Close = ++cursor_OpenClose; + public static uint RewardAniUI_Open = ++cursor_OpenClose; + public static uint RewardAniUI_Close = ++cursor_OpenClose; + public static uint NetLoadingUI_Open = ++cursor_OpenClose; + public static uint NetLoadingUI_Close = ++cursor_OpenClose; + public static uint SCTipsUI_Open = ++cursor_OpenClose; + public static uint SCTipsUI_Close = ++cursor_OpenClose; + public static uint GameLoginUI_Open = ++cursor_OpenClose; + public static uint RewardboxUI_Open = ++cursor_OpenClose; + public static uint RewardboxUI_Close = ++cursor_OpenClose; + + public static uint RewardUI_Open = ++cursor_OpenClose; + public static uint RewardUI_Close = ++cursor_OpenClose; + + public static uint NewTaskUI_Open = ++cursor_OpenClose; + + public static uint MenuUI_Open = ++cursor_OpenClose; + public static uint MenuUI_Close = ++cursor_OpenClose; + public static uint PersonalUI_Open = ++cursor_OpenClose; + public static uint PersonalUI_Close = ++cursor_OpenClose; + public static uint PlayUI_Close = ++cursor_OpenClose; + public static uint NewTaskUI_Close = ++cursor_OpenClose; + + + public static uint PrivacyUI_Open = ++cursor_OpenClose; + public static uint PrivacyUI_Close = ++cursor_OpenClose; + public static uint PlayUIFX = ++cursor_OpenClose; + + public static uint RainPlayUI_Open = ++cursor_OpenClose; + public static uint RainPlayUI_Close = ++cursor_OpenClose; + public static uint OpenGameUI_Open = ++cursor_OpenClose; + public static uint OpenGameUI_Close = ++cursor_OpenClose; + + public static uint SheepwindowUI_Open = ++cursor_OpenClose; + public static uint SheepwindowUI_Close = ++cursor_OpenClose; + public static uint BuyslotUI_Open = ++cursor_OpenClose; + public static uint BuyslotUI_Close = ++cursor_OpenClose; + public static uint BuygoldUI_Open = ++cursor_OpenClose; + public static uint BuygoldUI_Close = ++cursor_OpenClose; + public static uint LevelSuccessUI_Open = ++cursor_OpenClose; + public static uint LevelSuccessUI_Close = ++cursor_OpenClose; + public static uint ChoosePropUI_Open = ++cursor_OpenClose; + public static uint ChoosePropUI_Close = ++cursor_OpenClose; + public static uint AdcomingUI_Open = ++cursor_OpenClose; + public static uint AdcomingUI_Close = ++cursor_OpenClose; + + public static uint PassunlockUI_Open = ++cursor_OpenClose; + public static uint PassunlockUI_Close = ++cursor_OpenClose; + public static uint GetTaskRewardUI_Open = ++cursor_OpenClose; + public static uint GetTaskRewardUI_Close = ++cursor_OpenClose; + public static uint PayloadingUI_Open = ++cursor_OpenClose; + public static uint PayloadingUI_Close = ++cursor_OpenClose; + public static uint BackgroundUI_Open = ++cursor_OpenClose; + public static uint MainUI_Open = ++cursor_OpenClose; + public static uint MainUI_Close = ++cursor_OpenClose; + public static uint PlayBgUI_Close = ++cursor_OpenClose; + public static uint SignInUI_Open = ++cursor_OpenClose; + public static uint SignInUI_Close = ++cursor_OpenClose; + public static uint PassViewUI_Open = ++cursor_OpenClose; + public static uint PassViewUI_Close = ++cursor_OpenClose; + + public static uint RainPlayFastUI_Open = ++cursor_OpenClose; + public static uint PackrewardUI_Open = ++cursor_OpenClose; + public static uint PackrewardUI_Close = ++cursor_OpenClose; + public static uint MakeupConfirmUI_Open = ++cursor_OpenClose; + public static uint MakeupConfirmUI_Close = ++cursor_OpenClose; + public static uint MakeupRecordUI_Open = ++cursor_OpenClose; + public static uint MakeupRecordUI_Close = ++cursor_OpenClose; + public static uint MakeupStepUI_Open = ++cursor_OpenClose; + public static uint MakeupStepUI_Close = ++cursor_OpenClose; + + public static uint BroadcastUI_Open = ++cursor_OpenClose; + public static uint BroadcastUI_Close = ++cursor_OpenClose; + public static uint RegulationUI_Open = ++cursor_OpenClose; + public static uint RegulationUI_Close = ++cursor_OpenClose; + public static uint EnterGameUI_Open = ++cursor_OpenClose; + public static uint EnterGameUI_Close = ++cursor_OpenClose; + public static uint PauseUI_Open = ++cursor_OpenClose; + public static uint PauseUI_Close = ++cursor_OpenClose; + public static uint TipsViewUI_Open = ++cursor_OpenClose; + public static uint TipsViewUI_Close = ++cursor_OpenClose; + public static uint ResurgenceUI_Open = ++cursor_OpenClose; + public static uint ResurgenceUI_Close = ++cursor_OpenClose; + public static uint SaveingPotUI_Open = ++cursor_OpenClose; + public static uint SaveingPotUI_Close = ++cursor_OpenClose; + public static uint RecordViewUI_Open = ++cursor_OpenClose; + public static uint RecordViewUI_Close = ++cursor_OpenClose; + public static uint OnlineRewardUI_Open = ++cursor_OpenClose; + public static uint OnlineRewardUI_Close = ++cursor_OpenClose; + public static uint WheelUI_Open = ++cursor_OpenClose; + public static uint WheelUI_Close = ++cursor_OpenClose; + public static uint ThreeDaysGiftUI_Open = ++cursor_OpenClose; + public static uint ThreeDaysGiftUI_Close = ++cursor_OpenClose; + public static uint RewardMulUI_Open = ++cursor_OpenClose; + public static uint RewardMulUI_Close = ++cursor_OpenClose; + public static uint H5UI_Open = ++cursor_OpenClose; + public static uint H5UI_Close = ++cursor_OpenClose; + } +} \ No newline at end of file diff --git a/WV2SDK/Dispatcher/AppDispatcher.cs b/WV2SDK/Dispatcher/AppDispatcher.cs new file mode 100644 index 0000000..98b5453 --- /dev/null +++ b/WV2SDK/Dispatcher/AppDispatcher.cs @@ -0,0 +1,6 @@ +namespace Uni2SDK +{ + internal class AppDispatcher : BaseDispatcher + { + } +} \ No newline at end of file diff --git a/WV2SDK/Dispatcher/BaseDispatcher.cs b/WV2SDK/Dispatcher/BaseDispatcher.cs new file mode 100644 index 0000000..5345d8e --- /dev/null +++ b/WV2SDK/Dispatcher/BaseDispatcher.cs @@ -0,0 +1,133 @@ +using System; +using UnityEngine; +using System.Collections.Generic; +using UnityEngine.Pool; + +namespace Uni2SDK +{ + internal abstract class BaseDispatcher : IDisposable where T : class, new() where Param : class + { + private static T m_instance; + + public static T Instance + { + get + { + if (m_instance == null) + { + m_instance = new T(); + } + + return m_instance; + } + } + + private Dictionary>> m_msgPriorityDict = new(); + private Dictionary>> m_msgDict = new(); + private Dictionary>> m_msgFinallyDict = new(); + private Dictionary>> m_msgOnceDict = new(); + + public void AddListener(Msg msgId, Action listener) + { + if (m_msgDict.TryGetValue(msgId, out var value)) + { + value.Add(listener); + } + else + { + var list = ListPool>.Get(); + list.Add(listener); + m_msgDict.Add(msgId, list); + } + } + + public void AddOnceListener(Msg msgId, Action listener) + { + if (m_msgOnceDict.TryGetValue(msgId, out var value)) + { + value.Add(listener); + } + else + { + var list = ListPool>.Get(); + list.Add(listener); + m_msgOnceDict.Add(msgId, list); + } + } + + public void RemoveListener(Msg msgId, Action listener) + { + if (m_msgDict.TryGetValue(msgId, out var list)) + { + if (list.Contains(listener)) + { + list.Remove(listener); + if (list.Count == 0) + { + ListPool>.Release(list); + m_msgDict.Remove(msgId); + } + } + } + } + + public void Dispatch(Msg msgId, Param param = null) + { + InvokeMethods(m_msgPriorityDict, msgId, param); + InvokeMethods(m_msgDict, msgId, param); + InvokeMethods(m_msgFinallyDict, msgId, param); + InvokeMethods(m_msgOnceDict, msgId, param); + + if (m_msgOnceDict.ContainsKey(msgId)) + { + ListPool>.Release(m_msgOnceDict[msgId]); + m_msgOnceDict.Remove(msgId); + } + } + + private void InvokeMethods(Dictionary>> msgDict, Msg msgId, Param param) + { + if (!msgDict.ContainsKey(msgId)) return; + + var rawList = msgDict[msgId]; + int funcCount = rawList.Count; + if (funcCount == 1) + { + Action onEvent = rawList[0]; + onEvent(param); + return; + } + + var invokeFuncs = ListPool>.Get(); + invokeFuncs.AddRange(rawList); + for (var i = 0; i < funcCount; i++) + { + try + { + var onEvent = invokeFuncs[i]; + onEvent(param); + } + catch (Exception e) + { + LogKit.LogError(e); + } + } + + ListPool>.Release(invokeFuncs); + } + + public void Dispose() + { + m_instance = null; + + m_msgPriorityDict.Clear(); + m_msgDict.Clear(); + m_msgFinallyDict.Clear(); + m_msgOnceDict.Clear(); + m_msgPriorityDict = null; + m_msgDict = null; + m_msgFinallyDict = null; + m_msgOnceDict = null; + } + } +} \ No newline at end of file diff --git a/WV2SDK/Dispatcher/CtrlDispatcher.cs b/WV2SDK/Dispatcher/CtrlDispatcher.cs new file mode 100644 index 0000000..68f3f6c --- /dev/null +++ b/WV2SDK/Dispatcher/CtrlDispatcher.cs @@ -0,0 +1,6 @@ +namespace Uni2SDK +{ + internal class CtrlDispatcher : BaseDispatcher + { + } +} \ No newline at end of file diff --git a/WV2SDK/Dispatcher/NetworkDispatcher.cs b/WV2SDK/Dispatcher/NetworkDispatcher.cs new file mode 100644 index 0000000..565c033 --- /dev/null +++ b/WV2SDK/Dispatcher/NetworkDispatcher.cs @@ -0,0 +1,6 @@ +namespace Uni2SDK +{ + internal class NetworkDispatcher : BaseDispatcher + { + } +} \ No newline at end of file diff --git a/WV2SDK/Dispatcher/UICtrlDispatcher.cs b/WV2SDK/Dispatcher/UICtrlDispatcher.cs new file mode 100644 index 0000000..7b7603f --- /dev/null +++ b/WV2SDK/Dispatcher/UICtrlDispatcher.cs @@ -0,0 +1,6 @@ +namespace Uni2SDK +{ + internal class UICtrlDispatcher : BaseDispatcher + { + } +} \ No newline at end of file diff --git a/WV2SDK/Helper/CommonHelper.cs b/WV2SDK/Helper/CommonHelper.cs new file mode 100644 index 0000000..32a35f4 --- /dev/null +++ b/WV2SDK/Helper/CommonHelper.cs @@ -0,0 +1,171 @@ +using System; +using System.Text; +using UnityEngine; +using System.Collections.Generic; +using Application = UnityEngine.Application; +using Random = UnityEngine.Random; + +namespace Uni2SDK +{ + internal static class CommonHelper + { + public static Dictionary activeTimes = new Dictionary(); + public static Dictionary activeTimes_saveingpot = new Dictionary(); + + public static int GetIndexByChanceList(int[] chanceList) + { + float total = 0; + for (int i = 0; i < chanceList.Length; i++) + { + total += chanceList[i]; + } + + float result = Random.Range(0, total); + float tmpTotal = 0; + for (int i = 0; i < chanceList.Length; i++) + { + float chance = chanceList[i]; + tmpTotal += chance; + if (result < tmpTotal) + { + return i; + } + } + + + return -1; + } + + public static bool GetBoolByChance(float chance) + { + var value = UnityEngine.Random.Range(0, 1f); + if (value <= chance) + return true; + return false; + } + + public static void SetActive(this Component component, bool isActive) + { + component.gameObject.SetActive(isActive); + } + + public static string GetAppSavePath() + { + return Application.persistentDataPath; + } + + + private static float clickTime; + + public static bool IsClickNoQuick() + { + if (Time.time < clickTime) + { + clickTime = Time.time + 0.1f; + return false; + } + + clickTime = Time.time + 0.3f; + return true; + } + + public static void RandomSortList(List list) + { + System.Random r = new System.Random(); + for (int i = 0; i < list.Count; i++) + { + int index = r.Next(list.Count); + (list[i], list[index]) = (list[index], list[i]); + } + } + + public static int RandomInt(this IList array) + { + return Random.Range(array[0], array[1]); + } + + public static int RandomRange(int[] range) + { + if (range == null) + { + return 0; + } + + if (range.Length == 2) + { + return RandomRange(range[0], range[1]); + } + else + { + return range[0]; + } + } + + public static int RandomRange(int begin, int end) + { + return Random.Range(begin, end); + } + + public static T RandomWeight(Dictionary weightDic) + { + int totalWeight = 0; + foreach (var weight in weightDic) + { + totalWeight += weight.Value; + } + + int randomWeight = Random.Range(0, totalWeight); + + int currWeight = 0; + foreach (var weight in weightDic) + { + currWeight += weight.Value; + if (randomWeight < currWeight) + { + return weight.Key; + } + } + + return default; + } + + public static int RandomWeight(List weightArray) + { + float totalWeight = 0; + for (var i = 0; i < weightArray.Count; i++) totalWeight += weightArray[i]; + + var randomWeight = Random.Range(0, totalWeight); + if (randomWeight >= totalWeight) return weightArray.Count - 1; + + float currWeight = 0; + for (var i = 0; i < weightArray.Count; i++) + { + currWeight += weightArray[i]; + if (randomWeight < currWeight) return i; + } + + return -1; + } + + public static int RandomRangeIncludeEnd(int[] range) + { + if (range == null) return 0; + if (range.Length == 2) + return RandomRange(range[0], range[1] + 1); + return range[0]; + } + + public static bool IsToday(long timestamp) + { + // 将时间戳转换为DateTime对象 + DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).ToLocalTime().DateTime; + + // 获取今天的日期(不包含时间部分) + DateTime today = DateTime.Today; + + //LogKit.Log($"dateTime: {dateTime.Date} \n today: {today} \n 是否是今天: {dateTime.Date == today}"); + // 比较日期部分是否相等 + return dateTime.Date == today; + } + } +} \ No newline at end of file diff --git a/WV2SDK/Helper/DownloadKit.cs b/WV2SDK/Helper/DownloadKit.cs new file mode 100644 index 0000000..f74417c --- /dev/null +++ b/WV2SDK/Helper/DownloadKit.cs @@ -0,0 +1,164 @@ +using System.IO; +using UnityEngine; +using UnityEngine.Events; +using System.Collections; +using UnityEngine.Networking; + +namespace Uni2SDK +{ + internal class DownloadKit + { + private static void SaveTextFile(string content, string filePath, string fileName) + { + if (!Directory.Exists(filePath)) + { + Directory.CreateDirectory(filePath); + } + + File.WriteAllText($"{filePath}{fileName}.txt", content); + } + + public static void SaveFile(string content, string filePath, string fileName) + { + SaveTextFile(content, filePath, fileName); + } + + private static void SaveTextFile(byte[] content, string filePath, string fileName) + { + if (!Directory.Exists(filePath)) + { + Directory.CreateDirectory(filePath); + } + + File.WriteAllBytes($"{filePath}{fileName}.txt", content); + } + + public static IEnumerator GetTextFromUrl(string url, string fileName, UnityAction action = null, + string savePath = null, bool isSave = true) + { + LogKit.Log($"[DownLoad] GetTextFromUrl===1===={url}"); + var unityWebRequest = UnityWebRequest.Get(url); + yield return unityWebRequest.SendWebRequest(); + + LogKit.Log($"[DownLoad] GetTextFromUrl===2===={unityWebRequest.result}"); + + if (unityWebRequest.result is UnityWebRequest.Result.ConnectionError + or UnityWebRequest.Result.ProtocolError) + { + yield return null; + LogKit.Log($"[DownLoad] GetTextFromUrl===3===={default}"); + + action?.Invoke(default); + yield break; + } + + LogKit.Log($"[DownLoad] GetTextFromUrl===4===="); + var content = unityWebRequest.downloadHandler.text; + // if (isSave) + // { + // savePath ??= SugarFileKit.GetFilePath(); + // SaveTextFile(content, savePath, fileName); + // } + LogKit.Log($"[DownLoad] GetTextFromUrl===5===={content}"); + yield return null; + action?.Invoke(content); + } + + public static IEnumerator GetTextFromUrl1(string url, string fileName, UnityAction action = null, + string savePath = null, bool isSave = true) + { + var www = new WWW(url); + + while (!www.isDone) + { + } + + if (isSave) + { + savePath ??= SugarFileKit.GetFilePath(); + SaveTextFile(www.bytes, savePath, fileName); + } + + yield return null; + action?.Invoke(System.Text.Encoding.UTF8.GetString(www.bytes)); + } + + public static void GetTextFromUrl2(string url, string fileName, UnityAction action = null, + string savePath = null, bool isSave = true) + { + var www = new WWW(url); + + while (!www.isDone) + { + } + + if (isSave) + { + savePath ??= SugarFileKit.GetFilePath(); + SaveTextFile(www.bytes, savePath, fileName); + } + + // yield return null; + action?.Invoke(System.Text.Encoding.UTF8.GetString(www.bytes)); + } + + public static IEnumerator GetFileFromUrl(string url, string fileName, UnityAction action) + { + var unityWebRequest = UnityWebRequest.Get(url); + yield return unityWebRequest.SendWebRequest(); + if (unityWebRequest.result is + UnityWebRequest.Result.ConnectionError or UnityWebRequest.Result.ProtocolError) + { + action?.Invoke(false); + yield break; + } + + var results = unityWebRequest.downloadHandler.data; + var savePath = SugarFileKit.GetFilePath(); + + if (!Directory.Exists(savePath)) + { + Directory.CreateDirectory(savePath); + } + + var filePath = $"{savePath}{fileName}"; + var fileInfo = new FileInfo(filePath); + var fs = fileInfo.Create(); + fs.Write(results, 0, results.Length); + fs.Flush(); + fs.Close(); + fs.Dispose(); + yield return YieldConst.WaitForEndOfFrame; + action?.Invoke(true); + } + + public static string DownloadResourceSync(string url, string savePath, string fileName, bool isSave = true) + { + using (var unityWebRequest = UnityWebRequest.Get(url)) + { + unityWebRequest.SendWebRequest(); + + while (!unityWebRequest.isDone) + { + // 等待下载完成 + } + + if (unityWebRequest.result == UnityWebRequest.Result.ConnectionError || + unityWebRequest.result == UnityWebRequest.Result.ProtocolError) + { + LogKit.LogError($"Error downloading resource: {unityWebRequest.error}"); + return ""; + } + + var content = unityWebRequest.downloadHandler.text; + if (isSave) + { + savePath ??= SugarFileKit.GetFilePath(); + SaveTextFile(content, savePath, fileName); + } + + return content; + } + } + } +} \ No newline at end of file diff --git a/WV2SDK/Helper/GameHelper.cs b/WV2SDK/Helper/GameHelper.cs new file mode 100644 index 0000000..843e4f2 --- /dev/null +++ b/WV2SDK/Helper/GameHelper.cs @@ -0,0 +1,135 @@ +using System; +using UnityEngine; +using System.Text; +using System.Collections.Generic; +using Random = UnityEngine.Random; +using System.Text.RegularExpressions; + + +namespace Uni2SDK +{ + internal static class GameHelper + { + public static int gameType = 0; + private static LoginModel loginModel; + private static Dictionary numDic = new Dictionary(); + + + public static string GetRandomNum(int count) + { + var resultStr = new StringBuilder(); + for (int i = 0; i < count; i++) + { + resultStr.Append(Random.Range(0, 10)); + } + + return resultStr.ToString(); + } + + public static Vector3 FguiPotToUnityTrfLocalPot(Vector3 pot) + { + var v = Vector3.zero; + v.x = pot.x; + v.y = -pot.y; + v.z = pot.z; + return v; + } + + public static string GetNumStr(float num, int floatLength = -1) + { + var numString = num.ToString(floatLength < 0 ? "" : $"f{floatLength}"); + if (num > 1000) + { + return numString; + } + + if (!numDic.ContainsKey(num)) + numDic.Add(num, numString); + return numDic[num]; + } + + public static LoginModel GetLoginModel() + { + if (loginModel != null) + { + return loginModel; + } + + return loginModel = LoginKit.Instance.LoginModel; + } + + private static int Interstitial_num = 0; + + + public static string LimitName(string name, int length, string suffix = "...") + { + if (!string.IsNullOrEmpty(name) && name.Length > length) + { + name = name.Substring(0, length) + suffix; + } + + return name; + } + + + // public static CommonModel GetCommonModel() + // { + // return ConfigSystem.GetConfig(); + // } + // + + private static string GetNetworkType() + { + string types = "Not Connected"; + switch (Application.internetReachability) + { + case NetworkReachability.ReachableViaCarrierDataNetwork: + types = "Mobile Data"; + break; + case NetworkReachability.ReachableViaLocalAreaNetwork: + types = "Wi-Fi"; + break; + } + + return types; + } + + + private static GameObject RainPlayUI; + + public static void ShowSheepPlayUI(bool isShow) + { + if (RainPlayUI == null) + { + RainPlayUI = GameObject.Find("(RainPlayUI)com_game"); + } + + if (RainPlayUI != null) + { + RainPlayUI.transform.localPosition = isShow ? new Vector3(0, 0, 0) : new Vector3(-2000, 0, 0); + } + } + + public static bool IsTemporaryEnd; + + public static bool IsGiftST() + { + return true; + } + + public static Dictionary adCallbackInfo = new Dictionary(); + + /// + /// 检查是否有网络 + /// + /// true:有网, false:没网 + // public static bool IsConnect() + // { + // // return NetworkKit.GetNetworkType() != NetworkType.NotConnected; + // } + public static void TrackChannel(int id) + { + // NetworkKit.BuriedPoint(BuriedPointEvent.H5_event, BuriedPointEvent.h5_display, 1); + } + } +} \ No newline at end of file diff --git a/WV2SDK/Helper/SugarConstant.cs b/WV2SDK/Helper/SugarConstant.cs new file mode 100644 index 0000000..f2818c9 --- /dev/null +++ b/WV2SDK/Helper/SugarConstant.cs @@ -0,0 +1,18 @@ +using UnityEngine; + +namespace Uni2SDK +{ + internal static class SugarConstant + { + public const string croas = "Assets/SugarAssets/"; + public const string setbun = ".assetbundle"; + public static readonly string tbund = $"{Application.dataPath}/../AssetBundle/{undles}"; + public static readonly string fgklpk = "|"; + public const string undles = "AssetBundles"; + public const string nifest = ".manifest"; + public static readonly string lesest = $"{undles}{nifest}"; + public const string zyzootx = "SugarFile.txt"; + public const string nifldg = "[Sugar]"; + public const string admsie = "4s2f6ac15sa6ds45"; + } +} \ No newline at end of file diff --git a/WV2SDK/Helper/SugarFileKit.cs b/WV2SDK/Helper/SugarFileKit.cs new file mode 100644 index 0000000..09ebde9 --- /dev/null +++ b/WV2SDK/Helper/SugarFileKit.cs @@ -0,0 +1,32 @@ +using System.IO; +using System.Linq; +using UnityEngine.Events; +using System.Text.RegularExpressions; +using Application = UnityEngine.Application; + + +#if UNITY_EDITOR +#endif + +namespace Uni2SDK +{ + internal class SugarFileKit + { + private static bool isLog = true; + + private static string AssetBundleRootUrl = Application.streamingAssetsPath + "/SugarAssets/AssetBundles/"; + private static string mFileUrl = Application.streamingAssetsPath + "/SugarAssets/SugarFile.txt"; + public static string ConfigFileUrl = Application.streamingAssetsPath + "/Config/ConfigFile.txt"; + + public static string GetSavePath() + { + return Application.persistentDataPath; + } + + + public static string GetFilePath() + { + return $"{GetSavePath()}/SugarAssets/"; + } + } +} \ No newline at end of file diff --git a/WV2SDK/Manager/BaseUnityManager.cs b/WV2SDK/Manager/BaseUnityManager.cs new file mode 100644 index 0000000..bd07d4b --- /dev/null +++ b/WV2SDK/Manager/BaseUnityManager.cs @@ -0,0 +1,38 @@ +namespace Uni2SDK +{ + internal abstract class BaseUnityManager : SingletonUnity, InterfaceManager + where T : BaseUnityManager + { + public bool IsInit { get; private set; } + public bool IsStartUp { get; private set; } + public bool IsDispose { get; private set; } + + protected override string ParentRootName + { + get { return AppObjConst.MonoManagerGoName; } + } + + protected override void New() + { + base.New(); + IsDispose = false; + } + + public virtual void Init() + { + IsInit = true; + } + + public virtual void StartUp() + { + IsStartUp = true; + } + + public virtual void DisposeBefore() + { + IsDispose = true; + IsInit = false; + IsStartUp = false; + } + } +} \ No newline at end of file diff --git a/WV2SDK/Manager/THManager.cs b/WV2SDK/Manager/THManager.cs new file mode 100644 index 0000000..8c0544c --- /dev/null +++ b/WV2SDK/Manager/THManager.cs @@ -0,0 +1,31 @@ +namespace Uni2SDK +{ + using System; + using UnityEngine; + + internal class THManager : BaseUnityManager + { + public event Action UpdateSecondEvent; + + private float _secondTime; + private LoginModel loginModel; + private bool isGameStart; + + public override void Init() + { + isGameStart = true; + } + + public void Update() + { + if (!isGameStart) return; + + _secondTime += Time.deltaTime; + if (_secondTime >= 1) + { + _secondTime = 0; + UpdateSecondEvent?.Invoke(); + } + } + } +} \ No newline at end of file diff --git a/WV2SDK/Model/CommonModel.cs b/WV2SDK/Model/CommonModel.cs new file mode 100644 index 0000000..6bb62d3 --- /dev/null +++ b/WV2SDK/Model/CommonModel.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public interface IWeighted + { + int Weight { get; } + } + + internal class CommonModel + { + [JsonProperty("Dailyrefreshtimes")] public int Dailyrefreshtimes; + + [JsonProperty("darkWVDailyrefreshtimes")] + public int darkWVDailyrefreshtimes; + + [JsonProperty("darkWVDailyrefreshtimes2")] + public int[] darkWVDailyrefreshtimes2; + + [JsonProperty("darkWVRefreshtime")] public int[] darkWVRefreshtime; + [JsonProperty("darkWVRefreshtime2")] public string darkWVRefreshtime2; + [JsonProperty("H5Refreshtime")] public int H5Refreshtime; + [JsonProperty("WVClickAddTime")] public int[] WVClickAddTime; + [JsonProperty("WVOffset")] public int[] WVOffset; + [JsonProperty("WVOffset2")] public int[] WVOffset2; + [JsonProperty("DisplayProbability")] public int DisplayProbability; + } + + public class H5ConfModel + { + [JsonProperty("bid")] public string Bid { get; set; } + + [JsonProperty("h5Conf")] public H5Conf H5Conf { get; set; } + + [JsonProperty("h6Conf")] public H6Conf H6Conf { get; set; } + } + + public class H5Conf + { + //刷新间隔(秒) + [JsonProperty("f5Interval")] public F5Interval F5Interval { get; set; } + + //刷新次数 + [JsonProperty("f5Times")] public int F5Times { get; set; } + + [JsonProperty("links")] public H5ConfLink[] Links { get; set; } + } + + public class F5Interval + { + [JsonProperty("min")] public int Min { get; set; } + + [JsonProperty("max")] public int Max { get; set; } + } + + public class H5ConfLink : IWeighted + { + [JsonProperty("id")] public int Id { get; set; } + + //链接 webLink + [JsonProperty("url")] public string Url { get; set; } + + //刷新次数阈值 refreshMax + [JsonProperty("maxF5Times")] public int MaxF5Times { get; set; } + + //wv 显示权重probability + [JsonProperty("weight")] public int Weight { get; set; } + } + + public class H6Conf + { + [JsonProperty("layers")] public int Layers { get; set; } + + //暗wv刷新间隔(秒)暗WV点击广告后延长刷新时间(秒) + [JsonProperty("ADClickF5Delay")] public F5Interval AdClickF5Delay { get; set; } + + [JsonProperty("switchCondition")] public SwitchCondition SwitchCondition { get; set; } + + [JsonProperty("layerConfList")] public LayerConfList[] LayerConfList { get; set; } + } + + public class SwitchCondition + { + [JsonProperty("retentionConf")] public RetentionConf[] RetentionConf { get; set; } + } + + public class RetentionConf + { + [JsonProperty("days")] public RetainDays RetainDays { get; set; } + + [JsonProperty("prob")] public int RetentionProb { get; set; } + } + + public class RetainDays + { + [JsonProperty("min")] public int Min { get; set; } + + [JsonProperty("max")] public int Max { get; set; } + } + + public class LayerConfList + { + [JsonProperty("layerId")] public int LayerId { get; set; } + + //暗wv刷新间隔(秒) + [JsonProperty("f5Interval")] public F5Interval F5Interval { get; set; } + + //暗wv刷新次数 + [JsonProperty("f5Times")] public int F5Times { get; set; } + + //暗WV位置偏移 + [JsonProperty("offset")] public int Offset { get; set; } + + [JsonProperty("links")] public LayerConfListLink[] Links { get; set; } + } + + public class LayerConfListLink : IWeighted + { + [JsonProperty("id")] public int Id { get; set; } + + //wv链接 webLink + [JsonProperty("url")] public string Url { get; set; } + + //wv刷新次数阈值 refreshMax + [JsonProperty("maxF5Times")] public int MaxF5Times { get; set; } + + //wv A状态CT概率 darkWebTimesCT + [JsonProperty("ctProb")] public int CtProb { get; set; } + + //wv AB状态CT概率 darkWebTimesCT2 + [JsonProperty("ctProb2")] public int CtProb2 { get; set; } + + //wv 显示权重 probability + [JsonProperty("weight")] public int Weight { get; set; } + } + + public static class RandomHelper + { + private static readonly Random _random = new(); + + public static T RandomByWeight(IList items, T fallback) where T : class, IWeighted + { + var totalWeight = items.Sum(item => item.Weight); + if (totalWeight <= 0) + { + return fallback; + } + + var roll = _random.Next(0, totalWeight); + var cumulative = 0; + + foreach (var item in items) + { + cumulative += item.Weight; + if (roll < cumulative) + { + return item; + } + } + + return items.Last(); + } + } + + + public static class ListExtensions + { + public static T Random(this IEnumerable items, T fallback = default) where T : class, IWeighted + { + if (items == null) + { + return fallback; + } + + var list = items as IList ?? items.ToList(); + + if (list.Count == 0) + { + return fallback; + } + + return RandomHelper.RandomByWeight(list, fallback); + } + } + + public static class ArrayExtensions + { + public static T Random(this T[] items, T fallback = default) where T : class, IWeighted + { + if (items == null || items.Length == 0) + { + return fallback; + } + + return RandomHelper.RandomByWeight(items, fallback); + } + } + +} \ No newline at end of file diff --git a/WV2SDK/Model/LoginModel.cs b/WV2SDK/Model/LoginModel.cs new file mode 100644 index 0000000..4998a3b --- /dev/null +++ b/WV2SDK/Model/LoginModel.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + // public class LoginModel + // { + // [JsonProperty("cdn_url")] public string CdnURL; + // [JsonProperty("country")] public string Country; + // [JsonProperty("debug_log")] public bool DebugLog = true; + // [JsonProperty("enwp")] public int Enwp; + // [JsonProperty("expires_at")] public long ExpiresAt; + // [JsonProperty("invite_code")] public string InviteCode; + // [JsonProperty("is_magic")] public bool IsMagic; + // [JsonProperty("last_login_time")] public long LastLoginTime; + // [JsonProperty("login_time")] public long LoginTime; + // [JsonProperty("new_player")] public bool NewPlayer; + // [JsonProperty("play_data")] public string PlayData; + // [JsonProperty("play_data_ver")] public long PlayDataVer; + // [JsonProperty("reg_time")] public long RegTime; + // [JsonProperty("setting")] public string Setting; + // [JsonProperty("token")] public string Token; + // [JsonProperty("uid")] public long Uid; + // } +} \ No newline at end of file diff --git a/WV2SDK/Net/LoginSystem.cs b/WV2SDK/Net/LoginSystem.cs new file mode 100644 index 0000000..ab1ee5c --- /dev/null +++ b/WV2SDK/Net/LoginSystem.cs @@ -0,0 +1,83 @@ + +namespace Uni2SDK +{ + using Newtonsoft.Json; + using UnityEngine; + + internal class LoginSystem : BaseSystem + { + //is debug test (LoginCountLimit 应该为 5, 测试改为2) + private const int LoginCountLimit = 5; + private int _loginCount = 0; + private const string HeartbeatForegroundTime = "Uni2SDK-HeartbeatForegroundTime"; + public string attribution = "organic"; + + + public LoginSystem(bool isAutoInit = true) + { + if (isAutoInit) + { + Init(); + } + } + + public sealed override void Init() + { + base.Init(); + InitData(); + AddListener(); + //CreatAnimalCard.instance.SetCameraVisible(false); + } + + private void InitData() + { + } + + private void AddListener() + { + NetworkDispatcher.Instance.AddListener(NetworkMsg.Login, RequestLogin); + } + + private void RemoveListener() + { + NetworkDispatcher.Instance.RemoveListener(NetworkMsg.Login, RequestLogin); + } + + private Coroutine _heartbeatRequestCoroutine; + + public static string LoginBackMsg; + + private void RequestLogin(object a = null) + { + TrackKit.TrackLoginFunnel(LoginFunnelEventType.LoginSend); + LoginKit.Instance.LoginRequest(attribution, NetworkManager.HaveSimCard, (isSuccess, loginData) => + { + LogKit.Log($"[WV]---isSuccess--{isSuccess} \n login data:{JsonConvert.SerializeObject(loginData)}"); + LogKit.Log($"[WV]--LoginBackMsg:{LoginBackMsg}"); + + TrackKit.TrackLoginFunnel(LoginFunnelEventType.LoginRecv, isSuccess ? "success" : "fail"); + if (isSuccess) + { + // DateTimeManager.Instance.SetServerCurrTimestamp(loginData.LoginTime); + + LogKit.Log($"[WV]--登陆成功,用户UID: {loginData.Uid}"); + + if (!loginData.Setting.IsNullOrWhiteSpace()) + { + var info = new H5ConfigReqData + { + Setting = loginData.Setting, + CdnUrl = loginData.CdnURL, + IsInit = true + }; + + NetworkDispatcher.Instance.Dispatch(NetworkMsg.GetConfig, info); + } + + Uni2SDKManager.Instance.IsInitSuccess = isSuccess; + Uni2SDKManager.Instance.OnLoginCallBack?.Invoke(isSuccess, LoginBackMsg); + } + }); + } + } +} \ No newline at end of file diff --git a/WV2SDK/Net/NetworkManager.cs b/WV2SDK/Net/NetworkManager.cs new file mode 100644 index 0000000..35fb211 --- /dev/null +++ b/WV2SDK/Net/NetworkManager.cs @@ -0,0 +1,64 @@ +using System; +using UnityEngine; + +namespace Uni2SDK +{ + internal class NetworkManager : BaseUnityManager + { + private LoginSystem _loginSystem; + private ConfigSystem _configSystem; + private Uni2SDKCtrl _uni2SDKCtrl; + + private static string _sugarUrl; + private static string _secret; + private static string _host; + + public const string DebugUrl = "sdkapi.jsoncompare.online"; + + public const bool HaveSimCard = false; + + public override void Init() + { + // LogKit.Log($"[WV] url=== {_sugarUrl}"); + InitSystem(); + } + + public static string GetUrl() + { + return _sugarUrl; + } + + public static string GetHost() + { + return _host; + } + + public static void SetUrl(string url) + { + if (url.IsNullOrWhiteSpace()) + { + url = DebugUrl; + } + _sugarUrl = $"https://{url}/api/"; + Uri uri = new Uri(_sugarUrl); + _host = uri.Host; + } + + public static string GetSecret() + { + return _secret; + } + + public static void SetSecret(string secret) + { + _secret = secret; + } + + private void InitSystem() + { + _uni2SDKCtrl = new Uni2SDKCtrl(); + _configSystem = new ConfigSystem(); + _loginSystem = new LoginSystem(); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/README.md b/WV2SDK/SGModule/Common/README.md new file mode 100644 index 0000000..40683f2 --- /dev/null +++ b/WV2SDK/SGModule/Common/README.md @@ -0,0 +1,138 @@ +# 🧱 Common 公共模块 + +------ + +## 📖 概述 + +Common 模块是项目中最基础、最核心的模块,包含通用工具类、配置文件、扩展方法及基础系统组件。**所有其他模块都应依赖此模块**,务必在拉取其他模块前先行安装。 + +------ + +## 📁 功能总览 + +- ✅ 项目配置管理 +- ✅ 单例模式基类(支持非Mono与Mono行为) +- ✅ 常用工具类(加解密、日志、时间、设备信息) +- ✅ 扩展方法(数组、字符串、枚举等) +- ✅ 编辑器工具(自动生成配置文件) +- ✅ GM工具相关支持 + +------ + +## ⚙️ 核心系统详解 + +### 🧩 配置文件系统(GameConfig, NetworkConfig) + +📌 通过菜单栏 `SwhiteGames > Create GameConfig` 可在 `Resources/` 目录下自动创建 `GameConfig` 文件,包含以下配置字段: + +| 字段名 | 含义说明 | +| ------------- | ----------------------------------------- | +| `PackageName` | 游戏包名 | +| `IsRelease` | 是否为正式发布包(关联宏 `GAME_RELEASE`) | +| `EnabledLog` | 是否启用日志打印 | + +📦 获取配置示例: + +```csharp +var enabledLog = ConfigManager.GameConfig?.enabledLog; +var packageName = ConfigManager.GameConfig?.packageName; +``` + +------ + + +📌 通过菜单栏 `SwhiteGames > Create NetworkConfig` 可在 `Resources/` 目录下自动创建 `NetworkConfig` 文件,包含以下配置字段: + +| 字段名 | 含义说明 | +| ------------- |----------| +| `showNetworkLog` | 是否启用日志打印 | +| `debugHost` | 测试环境Host | +| `releaseHost` | 正式环境Host | +| `connectionMode` | 连接模式 | + +📦 获取配置示例: + +```csharp +var connectionMode = ConfigManager.NetworkConfig?.connectionMode; +var showNetworkLog = ConfigManager.NetworkConfig?.showNetworkLog; +``` + +------ +### 🔁 单例系统 + +- **SingletonMonoBehaviour**:MonoBehaviour 单例,自动创建 GameObject,跨场景不销毁 + +```csharp +// MonoBehaviour +public class AudioManager : SingletonMonoBehaviour { ... } +``` + +------ + +### 🛠️ 工具类一览(Helper) + +| 类名 | 功能说明 | +| ----------------- | ------------------------------------------- | +| `Log` | ✅日志打印(开发调试利器) | +| `Cryptor` | 🔐 加密解密支持(对称加密) | +| `TimeHelper` | 🕒 时间戳转换与格式化处理 | +| `DeviceHelper` | 📱 获取设备唯一标识 | +| `RandomHelper` | 🎲 权重随机、随机打乱等 | +| `SerializeHelper` | 🔄 JSON 序列化 / 反序列化(可使用As()替换) | +| `MD5Helper` | 🔑 快速生成MD5签名 | +| `Base64Helper` | 🧬 Base64编解码 | + +------ + +### 📌 日志打印统一用法 + +统一使用 `Log` 工具类进行日志输出,支持彩色分级,正式环境中可自动关闭日志输出。 + +```csharp +using Uni2SDK; + +Log.Info("标签", "信息内容"); // ✅绿色输出 +Log.Warning("标签", "警告内容"); // ⚠️橙色输出 +Log.Error("标签", "错误内容"); // ❌红色输出 +``` + +------ + +### ✨ 扩展方法一览 + +- **EnumExtensions**:获取枚举描述 `GameState.Ready.GetDescription()` +- **StringExtensions**:空值检查 `str.IsNullOrWhiteSpace()` +- **ObjectExtensions**:类型安全转换 `"123".As()` +- **ListExtensions**:列表随机元素 `items.Random()` +- **ArrayExtensions**:数组相关操作 + +------ + +## 🧠 最佳实践 + +| 模块 | 建议做法 | +| ---------- | ------------------------------------------------------------ | +| 管理器类 | Mono 类继承 `SingletonMonoBehaviour` | +| 日志打印 | 全局使用 `Log` 统一管理,按模块分类 | +| 类型转换 | 使用 `.As()` 替代传统强转,异常更少 | +| 加密数据 | 所有敏感数据使用 `Cryptor` 加密后存储 | +| 时间处理 | 使用 `TimeHelper` 保证时区一致性 | +| 随机操作 | 使用 `RandomHelper` 替代 `UnityEngine.Random` | +| 数据键管理 | 通过 `KeyRegistry` 注册和使用,避免硬编码 | + +------ + +## ⚠️ 注意事项 + +- ❗ `SingletonMonoBehaviour` 不要手动放入场景,会自动创建 +- 🔐 加密密钥需妥善保管,避免泄露 +- 🌏 时间处理请注意本地时区与 UTC 的转换 +- 🎲 请勿使用 `UnityEngine.Random`,统一使用 `RandomHelper` + +------ + +## 💡 扩展建议 + +- 🧩 新增扩展方法时,请分类放入 `Extensions/` 并补充完整 XML 注释 +- 🧰 新增工具类保持静态类设计,考虑线程安全 +- 📖 键系统支持从配置文件中加载,并支持按模块分组管理 \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Plugins/iOS/KeychainPlugin.mm b/WV2SDK/SGModule/Common/SGModule/Plugins/iOS/KeychainPlugin.mm new file mode 100644 index 0000000..41f2e21 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Plugins/iOS/KeychainPlugin.mm @@ -0,0 +1,66 @@ +#import +#import +#import + +extern "C" { + +// 保存数据到 Keychain +bool SaveToKeychain(const char* key, const char* value) { + NSString* keyString = [NSString stringWithUTF8String:key]; + NSString* valueString = [NSString stringWithUTF8String:value]; + + NSData* valueData = [valueString dataUsingEncoding:NSUTF8StringEncoding]; + + NSDictionary* query = @{ + (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, + (__bridge id)kSecAttrAccount : keyString, + }; + + SecItemDelete((__bridge CFDictionaryRef)query); + + NSDictionary* attributes = @{ + (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, + (__bridge id)kSecAttrAccount : keyString, + (__bridge id)kSecValueData : valueData, + }; + + OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, NULL); + return status == errSecSuccess; +} + +// 从 Keychain 中获取数据 +const char* GetFromKeychain(const char* key) { + NSString* keyString = [NSString stringWithUTF8String:key]; + + NSDictionary* query = @{ + (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, + (__bridge id)kSecAttrAccount : keyString, + (__bridge id)kSecReturnData : @YES, + (__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitOne, + }; + + CFTypeRef result = NULL; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); + + if (status == errSecSuccess) { + NSData* valueData = (__bridge_transfer NSData*)result; + NSString* valueString = [[NSString alloc] initWithData:valueData encoding:NSUTF8StringEncoding]; + return strdup([valueString UTF8String]); + } + + return NULL; +} + +// 删除 Keychain 中的数据 +bool DeleteFromKeychain(const char* key) { + NSString* keyString = [NSString stringWithUTF8String:key]; + + NSDictionary* query = @{ + (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, + (__bridge id)kSecAttrAccount : keyString, + }; + + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)query); + return status == errSecSuccess; +} +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Base/SingletonMonoBehaviour.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Base/SingletonMonoBehaviour.cs new file mode 100644 index 0000000..db16365 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Base/SingletonMonoBehaviour.cs @@ -0,0 +1,69 @@ +using Uni2SDK; +using UnityEngine; + +namespace Uni2SDK +{ + public class SingletonMonoBehaviour : MonoBehaviour where T : MonoBehaviour + { + private static T _instance; + + /// + /// 初始化完成标记,有需要的地方可以使用 + /// + protected static bool IsInitComplete; + + // 存储所有单例的父对象 + private static GameObject _singletonParent; + + public static T Instance + { + get + { + if (_instance == null) + { + // 尝试找到已存在的实例 + _instance = FindObjectOfType(); + + // 如果没有找到,则创建一个新的实例 + if (_instance == null) + { + // 确保所有单例对象放到同一个父对象下 + if (_singletonParent == null) + { + _singletonParent = GameObject.Find("Singletons") ?? new GameObject("Singletons"); + DontDestroyOnLoad(_singletonParent); // 不在场景切换时销毁 + } + + var singletonObject = new GameObject(typeof(T).Name); + singletonObject.transform.SetParent(_singletonParent.transform); // 设置父对象 + _instance = singletonObject.AddComponent(); + } + } + + return _instance; + } + } + + // 确保在场景中只存在一个实例 + protected virtual void Awake() + { + if (_instance == null) + { + _instance = this as T; + } + else if (_instance != this) + { + Log.Common.Warning($"An instance of {typeof(T)} already exists! Destroying this instance."); + Destroy(gameObject); // 如果有其他实例,销毁当前对象 + } + } + + protected virtual void OnDestroy() + { + if (_instance == this) + { + _instance = null; // 清除引用 + } + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ArrayExtensions.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ArrayExtensions.cs new file mode 100644 index 0000000..7944904 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ArrayExtensions.cs @@ -0,0 +1,18 @@ +using Uni2SDK; +using SGModule.Common.Interface; + +namespace Uni2SDK +{ + // public static class ArrayExtensions + // { + // public static T Random(this T[] items, T fallback = default) where T : class, IWeighted + // { + // if (items == null || items.Length == 0) + // { + // return fallback; + // } + // + // return RandomHelper.RandomByWeight(items, fallback); + // } + // } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/EnumExtensions.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/EnumExtensions.cs new file mode 100644 index 0000000..0a49a1b --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/EnumExtensions.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel; + +namespace Uni2SDK +{ + public static class EnumExtensions + { + public static string GetDescription(this Enum value) + { + var field = value.GetType().GetField(value.ToString()); + var attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)); + return attribute?.Description ?? value.ToString(); // 如果没有描述,就使用枚举名称 + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ListExtensions.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ListExtensions.cs new file mode 100644 index 0000000..d5da809 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ListExtensions.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Uni2SDK +{ + // public static class ListExtensions + // { + // public static T Random(this IEnumerable items, T fallback = default) where T : class, IWeighted + // { + // if (items == null) + // { + // return fallback; + // } + // + // var list = items as IList ?? items.ToList(); + // + // if (list.Count == 0) + // { + // return fallback; + // } + // + // return RandomHelper.RandomByWeight(list, fallback); + // } + // } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ObjectExtensions.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ObjectExtensions.cs new file mode 100644 index 0000000..0c61beb --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/ObjectExtensions.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Globalization; +using System.Text; +using Newtonsoft.Json; + +namespace Uni2SDK { + /// + /// 提供通用对象类型转换的扩展方法,支持数值类型、字符串、枚举、集合、时间等多种类型间的智能转换。 + /// + public static class ObjectExtensions { + /// + /// 将对象强制转换为目标类型 ,转换失败时返回默认值。 + /// + /// 目标类型 + /// 待转换的对象 + /// 转换失败时返回的默认值 + /// 可选格式字符串(如用于时间或数值格式化) + /// 格式化提供者,默认为当前区域设置 + /// 转换后的目标类型值,或 + /// + /// 字符串到基本类型 + /// + /// "123".As<int>(); // 输出 123 + /// "45.67".As<float>(); // 输出 45.67f + /// "true".As<bool>(); // 输出 true + /// "2023-01-01".As<DateTime>(); // 输出 2023-01-01 + /// "".As<int>(); // 输出 0 + /// ((string)null).As<int>(); // 输出 0 + /// "abc".As<int>(); // 输出 0(无法转换) + /// "1.23E+5".As<float>(); // 输出 123000f + /// ..... + /// + /// + public static T As(this object value, T defaultValue = default, string format = null, IFormatProvider formatProvider = null) { + return (T) As(value, typeof(T), defaultValue, format, formatProvider); + } + + /// + /// 将对象转换为指定的目标类型。 + /// 支持基础类型转换、字符串与 JSON 互转、枚举解析、集合映射、Base64 处理等。 + /// + /// 要转换的对象 + /// 目标类型 + /// 转换失败时的返回值 + /// 可选的格式字符串(用于时间、数字格式化) + /// 格式提供者(区域信息),默认为当前区域 + /// 转换结果或默认值 + public static object As(this object value, Type targetType, object defaultValue = null, string format = null, IFormatProvider formatProvider = null) { + if (value == null || value == DBNull.Value) { + return defaultValue; + } + + formatProvider ??= CultureInfo.CurrentCulture; + + try { + // 1. 类型兼容直接返回 + if (targetType.IsInstanceOfType(value)) { + return value; + } + + // 2. 数值类型之间转换(int, float, decimal 等) + if (value.IsNumericType() && targetType.IsNumericType()) { + return Convert.ChangeType(value, targetType, formatProvider); + } + + // 3. 字符串 ⇄ 字节数组 + if (targetType == typeof(byte[]) && value is string str) { + return Encoding.UTF8.GetBytes(str); + } + + if (targetType == typeof(string) && value is byte[] bytes) { + return Encoding.UTF8.GetString(bytes); + } + + // 4. 转为字符串 + if (targetType == typeof(string)) { + if (value is string s) { + return s; + } + + if (value.IsNumericType()) { + return string.Format(formatProvider, format ?? "{0}", value); + } + + if (value is DateTime dt) { + return string.IsNullOrEmpty(format) ? dt.ToString(formatProvider) : dt.ToString(format, formatProvider); + } + + try { + return JsonConvert.SerializeObject(value); + } + catch { + return defaultValue; + } + } + + // 5. 从字符串解析为目标类型 + if (value is string strValue) { + if (string.IsNullOrWhiteSpace(strValue)) { + return defaultValue; + } + + // 字符串 → 枚举 + if (targetType.IsEnum) { + try { + return Enum.Parse(targetType, strValue, true); + } + catch { + return defaultValue; + } + } + + // 字符串 → 数值 + if (targetType.IsNumericType()) { + return Convert.ChangeType(strValue, targetType, formatProvider); + } + + // 字符串 → 时间 + if (targetType == typeof(DateTime)) { + return string.IsNullOrEmpty(format) + ? DateTime.Parse(strValue, formatProvider) + : DateTime.ParseExact(strValue, format, formatProvider); + } + + // 字符串 → 自定义类(JSON) + if (targetType.IsClass && targetType != typeof(string)) { + try { + return JsonConvert.DeserializeObject(strValue, targetType); + } + catch { + return defaultValue; + } + } + } + + // 6. 集合类型转换(如 List -> List) + if (targetType.IsGenericListOrArray() && value is IEnumerable enumerable) { + var elementType = targetType.GetElementType() ?? targetType.GetGenericArguments()[0]; + var list = (IList) Activator.CreateInstance(typeof(List<>).MakeGenericType(elementType)); + + foreach (var item in enumerable) { + var converted = typeof(ObjectExtensions) + .GetMethod("As", new[] { typeof(object), typeof(Type), typeof(object), typeof(string), typeof(IFormatProvider) }) + ?.Invoke(null, new[] { item, elementType, null, format, formatProvider }); + + list.Add(converted); + } + + return targetType.IsArray ? list.ToArray(elementType) : list; + } + + // 7. 尝试通过 TypeConverter 转换(主要处理结构体、基础类型) + if (targetType.IsValueType || targetType == typeof(string)) { + var strVal = value.ToString(); + if (!string.IsNullOrWhiteSpace(strVal)) { + var converter = TypeDescriptor.GetConverter(targetType); + if (converter.CanConvertFrom(typeof(string))) { + return converter.ConvertFrom(null, formatProvider as CultureInfo, strVal); + } + } + } + + // 8. Fallback:通过 JSON 转换 + return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(value), targetType); + } + catch { + return defaultValue; + } + } + + #region 🔧 辅助方法 + + private static bool IsNumericType(this Type type) { + return Type.GetTypeCode(type) switch { + TypeCode.Byte or TypeCode.SByte or TypeCode.UInt16 or TypeCode.UInt32 or + TypeCode.UInt64 or TypeCode.Int16 or TypeCode.Int32 or TypeCode.Int64 or + TypeCode.Decimal or TypeCode.Double or TypeCode.Single => true, + _ => false + }; + } + + private static bool IsNumericType(this object value) { + return value?.GetType().IsNumericType() ?? false; + } + + private static bool IsGenericListOrArray(this Type type) { + return type != null && (type.IsArray || + (type.IsGenericType && (type.GetGenericTypeDefinition() == typeof(List<>) + || type.GetGenericTypeDefinition() == typeof(IList<>)))); + } + + private static Array ToArray(this IList list, Type elementType) { + var array = Array.CreateInstance(elementType, list.Count); + list.CopyTo(array, 0); + return array; + } + + #endregion + } +} diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/StringExtensions.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/StringExtensions.cs new file mode 100644 index 0000000..adc1e3b --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Extensions/StringExtensions.cs @@ -0,0 +1,10 @@ +namespace Uni2SDK +{ + public static class StringExtensions + { + public static bool IsNullOrWhiteSpace(this string str) + { + return string.IsNullOrWhiteSpace(str); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/GM/GMTool.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/GM/GMTool.cs new file mode 100644 index 0000000..4ea09f3 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/GM/GMTool.cs @@ -0,0 +1,401 @@ +using System; +using System.Collections.Generic; +using SGModule.Common; +using Uni2SDK; +using Uni2SDK; +using UnityEngine; + +public class GMTool : SingletonMonoBehaviour +{ + private readonly int buttonHeight = 50; + private readonly int fontSize = 35; // 字体大小 + + private readonly Dictionary inputFields = new(); + + private readonly List items = new(); + private readonly int spacing = 10; // 控件之间的间距 + private GUIStyle buttonStyle; + private int currentX; // 当前 X 坐标 + private int currentY; // 当前 Y 坐标 + private GUIStyle inputFieldStyle; + private GUIStyle labelStyle; + + private bool toggleDisplay; // 控制显示与隐藏 + private int windowWidth; // 屏幕宽度 + + + protected override void Awake() + { + base.Awake(); + if (!true) + { + IsInitComplete = true; + } + } + + private void OnGUI() + { + if (!IsInitComplete) + { + return; + } + + // 初始化样式 + if (buttonStyle == null || labelStyle == null || inputFieldStyle == null) + { + InitializeStyles(); + } + + // 初始化布局 + StartLayout(); + + // 显示开关按钮 + AddButton(toggleDisplay ? "关闭 GM 工具" : "打开 GM 工具", () => { toggleDisplay = !toggleDisplay; }); + + if (!toggleDisplay) + { + return; + } + + + // 添加控件示例 + AddLabel("GM 工具"); + // AddButton("初始化网络模块", () => + // { + // var gameConfig = ConfigManager.GetInstance.GetGameConfig(); + // NetworkKit.Instance.InitData(gameConfig.packageName, gameConfig.isRelease); + // }); + // AddButton("登录", () => + // { + // NetworkKit.Instance.LoginRequest("Test", false, (arg0, model) => + // { + // Debug.LogError($"登录结果 {arg0}"); + // }); + // }); + + + // AddButton($"加载配置模块初始化", () => + // { + // ConfigLoader.Instance.Init(NetworkKit.Instance.GetLoginModel().setting, + // NetworkKit.Instance.GetLoginModel().cdn_url, new List() + // { + // new CommonModel("Common"), + // new PrizeWheelDataModel("PrizeWheelData"), + // }, + // state => + // { + // Debug.LogError($"配置加载状态{state}"); + // }, + // (errorName, message) => + // { + // Debug.LogError($"配置解析错误 {errorName} 错误信息:{message}"); + // } + // ); + // }); + // AddButton($"读取Common配置", () => + // { + // var model = ConfigLoader.Instance.GetConfig(); + // Debug.LogError(model); + // }); + // AddButton($"读取PrizeWheelDataModel配置", () => + // { + // var model = ConfigLoader.Instance.GetConfig(); + // Debug.LogError(model.DataList.Count); + // }); + // AddButton($"测试解析为自定义配置", () => + // { + // Debug.LogError(ConfigLoader.Instance.ParesPersonalizedConfig(new PrizeWheelDataModel("PrizeWheelData"), "prize")); + // }); + // AddButton($"读取自定义配置", () => + // { + // var personalizedConfig = ConfigLoader.Instance.GetPersonalizedConfig("prize"); + // Debug.LogError(personalizedConfig.DataList.Count); + // }); + + + UpdateItems(); + + + // AddButton("退出游戏", Application.Quit); + } + + private void InitializeStyles() + { + buttonStyle = new GUIStyle(GUI.skin.button) + { + fontSize = fontSize, + alignment = TextAnchor.MiddleCenter, + normal = { textColor = Color.green } + }; + + labelStyle = new GUIStyle(GUI.skin.label) + { + fontSize = fontSize, + normal = { textColor = Color.red } + }; + + inputFieldStyle = new GUIStyle(GUI.skin.textField) + { + fontSize = fontSize, + alignment = TextAnchor.MiddleLeft + }; + } + + private void StartLayout() + { + currentX = spacing; + currentY = spacing; + windowWidth = Screen.width; + } + + private void AddButton(string text, Action onClick) + { + // 计算按钮宽度,基于标题内容自适应 + var buttonWidth = Mathf.Max(150, Mathf.CeilToInt(buttonStyle.CalcSize(new GUIContent(text)).x) + 20); + + // 换行检查 + if (currentX + buttonWidth + spacing > windowWidth) + { + currentX = spacing; + currentY += buttonHeight + spacing; + } + + // 绘制按钮 + if (GUI.Button(new Rect(currentX, currentY, buttonWidth, buttonHeight), text, buttonStyle)) + { + onClick?.Invoke(); + } + + // 更新下一个控件的位置 + currentX += buttonWidth + spacing; + } + + private void AddLabel(string text) + { + // // 计算标签宽度和高度 + // Vector2 size = labelStyle.CalcSize(new GUIContent(text)); + // int labelWidth = Mathf.CeilToInt(size.x); + // int labelHeight = Mathf.CeilToInt(size.y); + // + // // 换行检查 + // if (currentX + labelWidth + spacing > windowWidth) + // { + // currentX = spacing; + // currentY += buttonHeight + spacing; + // } + // + // // 绘制标签 + // GUI.Label(new Rect(currentX, currentY, labelWidth, labelHeight), text, labelStyle); + // + // // 更新下一个控件的位置 + // currentX += labelWidth + spacing; + + // 启用自动换行 可用 + labelStyle.wordWrap = true; + + var size = labelStyle.CalcSize(new GUIContent(text)); + var labelWidth = Mathf.CeilToInt(size.x); + var labelHeight = Mathf.CeilToInt(size.y); + + // 计算标签宽度和高度 + var maxWidth = windowWidth - spacing * 2; // 标签最大宽度 + // float labelWidth = maxWidth; // 长文本直接占满一行 + var needNewRow = labelWidth / maxWidth > 0.6f; + if (needNewRow) + { + labelWidth = maxWidth; + labelHeight = (int)labelStyle.CalcHeight(new GUIContent(text), labelWidth); + } + + // 换行逻辑:如果当前行剩余宽度不足,提前换行 + if (currentX + labelWidth + spacing > windowWidth) + { + currentX = spacing; // 回到左侧 + currentY += buttonHeight + spacing; // 换到下一行 + } + + // 绘制标签 + GUI.Label(new Rect(currentX, currentY, labelWidth, labelHeight), text, labelStyle); + + // 更新位置:占满一整行,因此重置到新行 + if (needNewRow) + { + currentX = spacing; + currentY += labelHeight + spacing; + } + else + { + currentX += labelWidth + spacing; + } + } + + private void AddInputField(string key, string placeholder, string buttonText, Action onSubmit) + { + var inputFieldWidth = + Mathf.Max(200, Mathf.CeilToInt(inputFieldStyle.CalcSize(new GUIContent(placeholder)).x) + 20); + var buttonWidth = Mathf.Max(100, Mathf.CeilToInt(buttonStyle.CalcSize(new GUIContent(buttonText)).x) + 20); + + if (currentX + inputFieldWidth + buttonWidth + spacing * 2 > windowWidth) + { + currentX = spacing; + currentY += buttonHeight + spacing; + } + + if (!inputFields.TryGetValue(key, out var inputField)) + { + inputFields.Add(key, ""); + } + + + inputField = GUI.TextField(new Rect(currentX, currentY, inputFieldWidth, buttonHeight), inputField, + inputFieldStyle); + currentX += inputFieldWidth + spacing; + + if (GUI.Button(new Rect(currentX, currentY, buttonWidth, buttonHeight), buttonText, buttonStyle)) + { + onSubmit?.Invoke(inputField); + } + + inputFields[key] = inputField; + + currentX += buttonWidth + spacing; + } + + private void AddSeparator(string text = "") + { + // 换行以确保分割线占据整行 + currentX = spacing; + currentY += buttonHeight + spacing; + + // // 分割线高度和宽度 + // int separatorHeight = Mathf.CeilToInt(fontSize * 1.5f); // 动态设置高度 + // int separatorWidth = windowWidth - spacing * 2; + // + // // 计算文字尺寸 + // Vector2 textSize = labelStyle.CalcSize(new GUIContent(text)); + // int textWidth = Mathf.CeilToInt(textSize.x); + // + // // 绘制分割线 + // Rect lineRect = new Rect(currentX, currentY + separatorHeight / 2, separatorWidth, 1); + // GUI.Box(lineRect, GUIContent.none); + // + // + // // 绘制文字 + // if (!string.IsNullOrEmpty(text)) + // { + // GUI.Label(new Rect((windowWidth - textWidth) / 2, currentY, textWidth, separatorHeight), text, labelStyle); + // } + + // 分割线宽度和高度 + var separatorWidth = windowWidth - spacing * 2; + var separatorHeight = Mathf.CeilToInt(fontSize * 1.5f); // 分割线高度(文字高度) + var lineHeight = Mathf.CeilToInt(fontSize * 0.1f); // 线条高度 + + if (string.IsNullOrEmpty(text)) + { + // 如果没有文字,绘制整行分割线 + DrawLine(new Rect(currentX, currentY + separatorHeight / 2 - lineHeight / 2, separatorWidth, lineHeight)); + } + else + { + // 计算文字尺寸 + var textSize = labelStyle.CalcSize(new GUIContent(text)); + var textWidth = Mathf.CeilToInt(textSize.x); + + // 计算分割线两侧长度 + var lineWidth = (separatorWidth - textWidth - spacing * 2) / 2; + + // 绘制左侧线条 + DrawLine(new Rect(currentX, currentY + separatorHeight / 2 - lineHeight / 2, lineWidth, lineHeight)); + + // 绘制文字 + GUI.Label(new Rect(currentX + lineWidth + spacing, currentY, textWidth, separatorHeight), text, labelStyle); + + // 绘制右侧线条 + DrawLine(new Rect(currentX + lineWidth + textWidth + spacing * 2, + currentY + separatorHeight / 2 - lineHeight / 2, lineWidth, + lineHeight)); + } + + // 更新位置 + currentY += separatorHeight + spacing; + } + + private void DrawLine(Rect rect) + { + // 设置线条颜色 + var originalColor = GUI.color; + GUI.color = Color.white; // 可以改成其他颜色 + + // 绘制线条 + GUI.DrawTexture(rect, Texture2D.whiteTexture); + + // 恢复原始颜色 + GUI.color = originalColor; + } + + public void AddItem(GMToolItem item) + { + items.Add(item); + } + + private void UpdateItems() + { + foreach (var item in items) + { + switch (item.Type) + { + case GUIType.Label: + AddLabel(item.TextFunc.Invoke()); + break; + case GUIType.Button: + AddButton(item.TextFunc.Invoke(), () => { item.OnClick?.Invoke(null); }); + break; + case GUIType.InputField: + AddInputField(item.Key, item.Placeholder, item.TextFunc.Invoke(), + s => { item.OnClick?.Invoke(s); }); + break; + case GUIType.Separator: + AddSeparator(item.TextFunc?.Invoke()); + break; + default: + Log.Common.Error($"Unsupported GUIType: {item.Type}"); + break; + } + } + } +} + +public enum GUIType +{ + Label, + Button, + InputField, + Separator // 分割线类型 +} + +public class GMToolItem +{ + public string Key; + public Action OnClick; + public string Placeholder; + public Func TextFunc; + public GUIType Type; + + /// + /// + /// 控件类型 + /// 显示的文本,传入委托可以动态变化 + /// 点击委托,只有Button与InputField有效,Button可忽略字符串参数,InputField输入的内容会传入 + /// InputField 需要用到的key,记得保持唯一性,如果重复有可能会导致重复的输入框同步一样的内容 + /// 提示占位文本 + public GMToolItem(GUIType type, Func textFunc, Action onClick = null, string key = "", + string placeholder = "") + { + Type = type; + TextFunc = textFunc; + OnClick = onClick; + Key = key; + Placeholder = placeholder; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Base64Helper.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Base64Helper.cs new file mode 100644 index 0000000..e65340f --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Base64Helper.cs @@ -0,0 +1,32 @@ +using System; +using System.Text; + +namespace Uni2SDK +{ + public static class Base64Helper + { + public static string Encode(string source) + { + return Base64Encode(Encoding.UTF8, source); + } + + public static string Decode(string result) + { + return Base64Decode(Encoding.UTF8, result); + } + + private static string Base64Encode(Encoding encoding, string source) + { + var bytes = encoding.GetBytes(source); + var encode = Convert.ToBase64String(bytes); + return encode; + } + + private static string Base64Decode(Encoding encoding, string result) + { + var bytes = Convert.FromBase64String(result); + var decode = encoding.GetString(bytes); + return decode; + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/CommonUtils.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/CommonUtils.cs new file mode 100644 index 0000000..440667e --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/CommonUtils.cs @@ -0,0 +1,26 @@ +using Newtonsoft.Json.Linq; + +namespace Uni2SDK +{ + // 混合通用方法工具类(放置一些通用的静态函数) + public static class CommonUtils + { + /// + /// 深度比较两个对象是否相等,支持复杂结构(如 List、Dictionary、嵌套对象) + /// + public static bool DeepEquals(T a, T b) + { + if (a == null && b == null) + { + return true; + } + + if (a == null || b == null) + { + return false; + } + + return JToken.DeepEquals(JToken.FromObject(a), JToken.FromObject(b)); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Cryptor.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Cryptor.cs new file mode 100644 index 0000000..6b2961d --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Cryptor.cs @@ -0,0 +1,43 @@ +using System.Text; + +namespace Uni2SDK +{ + public class Cryptor + { + public static string Encrypt(string data, string key) + { + var keyMD5 = MD5Helper.MD5String1(key); + var str = Base64Helper.Encode(data + keyMD5); + + var bytes = Encoding.UTF8.GetBytes(str); + for (int i = 0, j = bytes.Length - 1; i < j; i += 1, j -= 1) + { + if (i % 2 == 0) + { + (bytes[i], bytes[j]) = (bytes[j], bytes[i]); + } + } + + var loginData = Encoding.UTF8.GetString(bytes); + return loginData; + } + + public static string Decrypt(string data, string key) + { + var bytes = Encoding.UTF8.GetBytes(data); + for (int i = 0, j = bytes.Length - 1; i < j; i += 1, j -= 1) + { + if (i % 2 == 0) + { + (bytes[i], bytes[j]) = (bytes[j], bytes[i]); + } + } + + var str = Encoding.UTF8.GetString(bytes); + var str1 = Base64Helper.Decode(str); + var keyMD5 = MD5Helper.MD5String1(key); + var result = str1.Replace(keyMD5, string.Empty); + return result; + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/DeviceHelper.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/DeviceHelper.cs new file mode 100644 index 0000000..70d326d --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/DeviceHelper.cs @@ -0,0 +1,26 @@ +using UnityEngine; + +namespace Uni2SDK +{ + public static class DeviceHelper + { + private const string Idfv = "IDFV"; + + public static string GetDeviceID(string deviceName = "TestUser001") + { +#if UNITY_IOS && !UNITY_EDITOR + deviceName = Keychain.Get(Idfv); + if (string.IsNullOrEmpty(deviceName)) + { + deviceName = SystemInfo.deviceUniqueIdentifier; + Keychain.Save(Idfv, deviceName); + } + + return deviceName; +#elif UNITY_EDITOR + return deviceName; +#endif + return SystemInfo.deviceUniqueIdentifier; + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Log.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Log.cs new file mode 100644 index 0000000..30fe752 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/Log.cs @@ -0,0 +1,114 @@ +using System; +using SGModule.Common; +using UnityEngine; + +namespace Uni2SDK +{ + public static class Log + { + // 预定义模块实例 + public static readonly ModuleLogger Common = new("Common"); + public static readonly ModuleLogger Net = new("Net", Uni2SDKManager.Instance._isLog); + public static readonly ModuleLogger MarkdownKit = new("MarkdownKit"); + public static readonly ModuleLogger ApplePay = new("ApplePay"); + public static readonly ModuleLogger ConfigLoader = new("ConfigLoader"); + public static readonly ModuleLogger NetKit = new("NetKit"); + public static readonly ModuleLogger DataStorage = new("DataStorage"); + + private static bool IsEnabled => Uni2SDKManager.Instance._isLog; + + public static void Info(string label, string msg) + { + if (!IsEnabled) + { + return; + } + + Debug.Log($"[{label}] {msg}"); + } + + public static void Warning(string label, string msg) + { + if (!IsEnabled) + { + return; + } + + Debug.LogWarning($"[{label}] {msg}"); + } + + public static void Error(string label, string msg) + { + if (!IsEnabled) + { + return; + } + + Debug.LogError($"[{label}] {msg}"); + } + + public static void Exception(string label, Exception ex) + { + if (!IsEnabled) + { + return; + } + + Debug.LogError($"[{label}] Exception: {ex.Message}\n{ex.StackTrace}"); + } + } + + public class ModuleLogger + { + private readonly bool _isEnabled; + private readonly string _label; + + public ModuleLogger(string label, bool isEnabled = true) + { + _label = label; + _isEnabled = isEnabled; + } + + private bool IsEnabled => Uni2SDKManager.Instance._isLog && _isEnabled; + + public void Info(string msg) + { + if (!IsEnabled) + { + return; + } + + Debug.Log($"[{_label}] {msg}"); + } + + public void Warning(string msg) + { + if (!IsEnabled) + { + return; + } + + Debug.LogWarning($"[{_label}] {msg}"); + } + + public void Error(string msg) + { + if (!IsEnabled) + { + return; + } + + Debug.LogError($"[{_label}] {msg}"); + } + + public void Exception(Exception ex) + { + if (!IsEnabled) + { + return; + } + + Debug.LogError($"[{_label}] Exception: {ex.Message}\n{ex.StackTrace}"); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/MD5Helper.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/MD5Helper.cs new file mode 100644 index 0000000..59af9d7 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/MD5Helper.cs @@ -0,0 +1,72 @@ +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace Uni2SDK +{ + public class MD5Helper + { + public static string GetFileMD5(string file) + { + try + { + var fs = new FileStream(file, FileMode.Open); + MD5 md5 = new MD5CryptoServiceProvider(); + var retVal = md5.ComputeHash(fs); + fs.Close(); + var sb = new StringBuilder(); + foreach (var str in retVal) + { + sb.Append(str.ToString("X2")); + } + + return sb.ToString(); + } + catch (Exception ex) + { + throw new Exception("GetFileMD5 fail error: " + ex.Message); + } + } + + /// + /// 获取字符串的MD5值 + /// + public static string GetStringMD5(string str) + { + if (string.IsNullOrEmpty(str)) + { + return null; + } + + MD5 md5 = new MD5CryptoServiceProvider(); + var bytResult = md5.ComputeHash(Encoding.UTF8.GetBytes(str)); + var strResult = BitConverter.ToString(bytResult); + strResult = strResult.Replace("-", string.Empty); + return strResult; + } + + public static string MD5String1(string text) + { + var buffer = Encoding.Default.GetBytes(text); + var check = new MD5CryptoServiceProvider(); + var somme = check.ComputeHash(buffer); + var result = new StringBuilder(); + foreach (var a in somme) + { + var value = a.ToString("X"); + if (a < 16) + { + result.Append(0); + result.Append(value); + } + else + { + result.Append(value); + } + } + + return result.ToString().ToLower(); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/ModuleVersion.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/ModuleVersion.cs new file mode 100644 index 0000000..8c5c374 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/ModuleVersion.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEngine; + +namespace Uni2SDK +{ + public static class ModuleVersion + { + public static void Show() + { + var path = Path.Combine(Application.dataPath, "../gupm.toml"); + + if (!File.Exists(path)) + { + Log.Warning("Submodules", $"找不到配置文件: {path}"); + return; + } + + var insideSubmodules = false; + var submodules = new Dictionary(); + var lines = File.ReadAllLines(path); + + foreach (var rawLine in lines) + { + var line = rawLine.Trim(); + + // 进入 [Submodules] 区块 + if (!insideSubmodules) + { + if (line.Equals("[Submodules]", StringComparison.OrdinalIgnoreCase)) + { + insideSubmodules = true; + } + + continue; + } + + // 如果遇到下一个区块就退出(可选) + if (line.StartsWith("[") && line.EndsWith("]")) + { + break; + } + + // 忽略空行和注释 + if (string.IsNullOrWhiteSpace(line) || line.StartsWith("#")) + { + continue; + } + + // 使用 = 来切分 + var parts = line.Split(new[] { '=' }, 2); + if (parts.Length != 2) + { + continue; + } + + var key = parts[0].Trim(); + var value = parts[1].Trim().Trim('"'); + + submodules[key] = value; + } + + foreach (var kv in submodules) + { + Log.Info("Submodules", $"{kv.Key} : {kv.Value}"); + } + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/RandomHelper.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/RandomHelper.cs new file mode 100644 index 0000000..0900623 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/RandomHelper.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using SGModule.Common.Interface; + +// +// namespace Uni2SDK { +// public static class RandomHelper { +// private static readonly Random _random = new(); +// +// public static T RandomByWeight(IList items, T fallback) where T : class, IWeighted { +// var totalWeight = items.Sum(item => item.Weight); +// if (totalWeight <= 0) { +// return fallback; +// } +// +// var roll = _random.Next(0, totalWeight); +// var cumulative = 0; +// +// foreach (var item in items) { +// cumulative += item.Weight; +// if (roll < cumulative) { +// return item; +// } +// } +// +// return items.Last(); +// } +// } +// } \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/SerializeHelper.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/SerializeHelper.cs new file mode 100644 index 0000000..ea68d50 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/SerializeHelper.cs @@ -0,0 +1,52 @@ +using System; +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public static class SerializeHelper + { + private static readonly JsonSerializerSettings DefaultUseJsonSettings = new() + { + Formatting = Formatting.None, + DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, + DateFormatString = "yyyy/MM/dd hh:mm:ss" + }; + + private static readonly JsonSerializerSettings JsonIndentedSettings = new() + { + Formatting = Formatting.Indented, + DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, + DateFormatString = "yyyy/MM/dd hh:mm:ss" + }; + + static SerializeHelper() + { + JsonConvert.DefaultSettings = () => DefaultUseJsonSettings; + } + + public static string ToJson(object obj) + { + return JsonConvert.SerializeObject(obj, DefaultUseJsonSettings); + } + + public static string ToJsonIndented(object obj) + { + return JsonConvert.SerializeObject(obj, JsonIndentedSettings); + } + + public static string ToJson(object obj, Type type) + { + return JsonConvert.SerializeObject(obj, type, DefaultUseJsonSettings); + } + + public static string ToJson(object obj) + { + return ToJson(obj, typeof(T)); + } + + public static T ToObject(string json) + { + return JsonConvert.DeserializeObject(json); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/TimeHelper.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/TimeHelper.cs new file mode 100644 index 0000000..1e8e807 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Helper/TimeHelper.cs @@ -0,0 +1,62 @@ +using System; + +namespace Uni2SDK +{ + public static class TimeHelper + { + /// + /// 将 Unix 时间戳转换为本地时间 + /// + /// 时间戳(秒) + /// 可读的本地时间字符串 + public static string ConvertToLocalTime(long timestamp) + { + // Unix 时间戳起始时间 + var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + // 转换为本地时间 + var localTime = epoch.AddSeconds(timestamp).ToLocalTime(); + + return localTime.ToString("yyyy-MM-dd HH:mm:ss"); + } + + /// + /// 将 Unix 时间戳转换为 UTC 时间 + /// + /// 时间戳(秒) + /// 可读的 UTC 时间字符串 + public static string ConvertToUTCTime(long timestamp) + { + // Unix 时间戳起始时间 + var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + // 转换为 UTC 时间 + var utcTime = epoch.AddSeconds(timestamp); + + return utcTime.ToString("yyyy-MM-dd HH:mm:ss"); + } + + public static string FormatTime(int totalSeconds) + { + if (totalSeconds < 60) + { + return $"{totalSeconds}s"; // 小于60秒,直接显示秒 + } + + if (totalSeconds < 3600) + { + var minutes = totalSeconds / 60; + var seconds = totalSeconds % 60; + return $"{minutes}m {seconds}s"; // 小于1小时,显示分秒 + } + else + { + var hours = totalSeconds / 3600; + var remainingSeconds = totalSeconds % 3600; + var minutes = remainingSeconds / 60; + var seconds = remainingSeconds % 60; + return $"{hours}h {minutes}m {seconds}s"; // 超过1小时,显示时分秒 + } + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Interface/IWeighted.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Interface/IWeighted.cs new file mode 100644 index 0000000..cca4538 --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Interface/IWeighted.cs @@ -0,0 +1,7 @@ +namespace SGModule.Common.Interface +{ + public interface IWeighted + { + int Weight { get; } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Common/SGModule/Scripts/Keychain/Keychain.cs b/WV2SDK/SGModule/Common/SGModule/Scripts/Keychain/Keychain.cs new file mode 100644 index 0000000..df20b9f --- /dev/null +++ b/WV2SDK/SGModule/Common/SGModule/Scripts/Keychain/Keychain.cs @@ -0,0 +1,49 @@ +using System; +using System.Runtime.InteropServices; +using Uni2SDK; + +public static class Keychain +{ + public static bool Save(string key, string value) + { +#if UNITY_IOS + return SaveToKeychain(key, value); +#endif + Log.Common.Warning("Keychain is only supported on iOS."); + return false; + } + + public static string Get(string key) + { +#if UNITY_IOS + var resultPtr = GetFromKeychain(key); + if (resultPtr != IntPtr.Zero) { + var result = Marshal.PtrToStringAuto(resultPtr); + return result; + } + + return null; +#endif + Log.Common.Warning("Keychain is only supported on iOS."); + return null; + } + + public static bool Delete(string key) + { +#if UNITY_IOS + return DeleteFromKeychain(key); +#endif + Log.Common.Warning("Keychain is only supported on iOS."); + return false; + } +#if UNITY_IOS + [DllImport("__Internal")] + private static extern bool SaveToKeychain(string key, string value); + + [DllImport("__Internal")] + private static extern IntPtr GetFromKeychain(string key); + + [DllImport("__Internal")] + private static extern bool DeleteFromKeychain(string key); +#endif +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/README.md b/WV2SDK/SGModule/Net/README.md new file mode 100644 index 0000000..d15ee02 --- /dev/null +++ b/WV2SDK/SGModule/Net/README.md @@ -0,0 +1,67 @@ +# 🌐 Net 网络模块 + +适用于 Unity 的网络模块,包含网络检测、接口请求、Token 鉴权、服务器时间同步等功能。模块职责清晰、易扩展,使用前需引入通用模块。 + +------ + +## 📦 模块概览 + +| 模块 | 功能描述 | +| ---------------- | --------------------------------------------------- | +| `NetChecker` | 📶 检测网络是否可用,支持 Ping / HTTP 检查 | +| `NetCore` | 📡 网络请求基类,支持加密和 Token 自动处理(需继承) | +| `TokenManager` | 🔐 Token 缓存 / 自动刷新 / 登录回退处理 | +| `ServerClock` | 🕒 同步服务器时间,避免设备本地误差 | +| `WebSocket 模块` | 依赖 nativewebsocket 插件 | + +------ + +## ✅ 使用示例 + +### 1. 网络检测 + +```c# +StartCoroutine(NetChecker.Instance.WaitUntilNetworkConnected(10, 1f, success => { + if (success) Debug.Log("✅ 网络可用"); +})); +``` + +------ + +### 2. 实现你的请求类(必须继承 NetCore) + +```c# +public class NetKit : NetCore { + // 详情参考此类 +} +``` + +------ + +### 3. 发起接口请求(在子类中) + +```c# +NetKit.Instance.Post("/event/incrN", trackData, + response => { + callback?.Invoke(response.IsSuccess, response.Data); + }); +``` + +------ + +### 4. Token 获取(自动缓存) + +```c# +yield return TokenManager.Instance.GetToken(token => { + Debug.Log("当前 Token:" + token); +}); +``` + +------ + +### 5. 服务器时间同步 + +```c# +ServerClock.Init(serverUnixTime); +var now = ServerClock.GetCurrentServerTime(); +``` \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/Scripts/Core/NetChecker.cs b/WV2SDK/SGModule/Net/SGModule/Scripts/Core/NetChecker.cs new file mode 100644 index 0000000..12e4ca0 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/Scripts/Core/NetChecker.cs @@ -0,0 +1,333 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Uni2SDK; +using Uni2SDK; +using UnityEngine; +using UnityEngine.Networking; + +namespace Uni2SDK +{ + public enum ConnectionStatus + { + Uninitialized, // 未初始化 + Connected, // 已连接 + Disconnected // 未连接 + } + + // 网络检测类 + public class NetChecker : SingletonMonoBehaviour + { + private const float WebRequestInterval = 5f; + private const float PingInterval = 2; + + // 可配置多个检测 URL + [SerializeField] private List checkUrls = new() + { + "https://www.baidu.com", // 国内 URL + "https://www.google.com" // 国外 URL + }; + + // 是否启用 Ping 检测 + [SerializeField] private bool usePingCheck; + + // 配置可用的 Ping 地址列表 + private readonly List _pingAddresses = new() + { + "8.8.8.8", // Google DNS(适合全球) + "223.5.5.5", // 阿里云 + "1.1.1.1" // Cloudflare DNS(全球可用) + }; + + + private Coroutine _checkInternetCoroutine; + private float _checkInterval = WebRequestInterval; + private bool _isChecking; + private bool _lastConnected; + private string _preferredUrl; // 当前优先检测的 URL + + /// + /// null = 未检测;true = 联网;false = 未联网 + /// + private bool? IsConnected { get; set; } + + private void OnEnable() + { + StartCheckingInternet(); + } + + private void OnDisable() + { + StopCheckingInternet(); + } + + /// + /// 等待网络连通,自动处理初始化和总超时时间 + /// + /// 最多等待的总时间(秒) + /// 每次重试间隔 + /// 检测结果回调 + public IEnumerator WaitUntilNetworkConnected(float timeout, float checkInterval, Action callback) + { + var elapsed = 0f; + + // 阶段 1: 等待初始化完成 + while (!IsConnected.HasValue && elapsed < timeout) + { + yield return new WaitForSeconds(checkInterval); + elapsed += checkInterval; + } + + if (!IsConnected.HasValue) + { + Log.Net.Warning("网络检测初始化超时!"); + callback(false); + yield break; + } + + // 阶段 2: 等待网络恢复 + while (IsConnected == false && elapsed < timeout) + { + Log.Net.Warning($"网络异常,等待中... 已耗时: {elapsed:F1}s"); + yield return new WaitForSeconds(checkInterval); + elapsed += checkInterval; + } + + var success = IsConnected == true; + if (!success) + { + Log.Net.Warning("网络连接等待超时!"); + } + + callback(success); + } + + public ConnectionStatus GetConnectionStatus() + { + return IsConnected switch + { + null => ConnectionStatus.Uninitialized, + true => ConnectionStatus.Connected, + false => ConnectionStatus.Disconnected + }; + } + + public void Init() + { + StartCheckingInternet(); + } + + private void StartCheckingInternet() + { + _checkInterval = usePingCheck ? PingInterval : WebRequestInterval; + _checkInternetCoroutine ??= StartCoroutine(CheckInternetRoutine()); + } + + private void StopCheckingInternet() + { + if (_checkInternetCoroutine != null) + { + StopCoroutine(_checkInternetCoroutine); + _checkInternetCoroutine = null; + } + } + + private IEnumerator CheckInternetRoutine() + { + while (true) + { + if (_isChecking) + { + yield break; // 避免并发冲突 + } + + _isChecking = true; + + if (QuickNetDeviceCheck()) + { + if (usePingCheck) + { + yield return CheckWithPing(); + } + else + { + yield return CheckWithUnityWebRequest(); + } + } + else + { + IsConnected = false; + } + + if (IsConnected.HasValue && _lastConnected != IsConnected.Value) + { + Log.Net.Info($"网络状态变化: {IsConnected}"); + _lastConnected = IsConnected.Value; + } + + _isChecking = false; + yield return new WaitForSecondsRealtime(_checkInterval); + } + } + + /// + /// 使用 Ping 检测网络连通性 + /// + private IEnumerator CheckWithPing() + { + var pings = _pingAddresses.Select(ip => new Ping(ip)).ToList(); + + var startTime = Time.realtimeSinceStartup; + var success = false; + + // 等待所有 Ping 返回结果或超时 + while (Time.realtimeSinceStartup - startTime < _checkInterval) + { + foreach (var ping in pings) + { + if (ping.isDone && ping.time >= 0) + { + success = true; + break; + } + } + + if (success) + { + break; + } + + yield return new WaitForSecondsRealtime(0.1f); + } + + // 如果有任意一个 Ping 成功,网络即为可用 + IsConnected = success; + } + + /// + /// 使用 UnityWebRequest 检测网络连通性 + /// + private IEnumerator CheckWithUnityWebRequest() + { + if (!string.IsNullOrEmpty(_preferredUrl)) + { + var request = UnityWebRequest.Get(_preferredUrl); + request.timeout = (int)_checkInterval; + yield return request.SendWebRequest(); + + if (request.result == UnityWebRequest.Result.Success) + { + IsConnected = true; + request.Dispose(); + yield break; + } + + Log.Net.Warning($"CheckNet 首选URL请求失败: {_preferredUrl}, 错误: {request.error}"); + + _preferredUrl = null; // 失败则清除 + request.Dispose(); + } + + // fallback:尝试所有 URL + var ops = new List(); + var requests = new List(); + + foreach (var url in checkUrls) + { + var req = UnityWebRequest.Get(url); + req.timeout = (int)_checkInterval; + ops.Add(req.SendWebRequest()); + requests.Add(req); + } + + yield return StartCoroutine(WaitForAnyRequest(ops)); + + foreach (var req in requests) + { + req.Dispose(); + } + } + + + // 等待任意一个请求完成并返回 + private IEnumerator WaitForAnyRequest(List ops) + { + while (ops.Any(op => !op.isDone)) + { + if (ops.Any(op => op.isDone && op.webRequest.result == UnityWebRequest.Result.Success)) + { + break; + } + + yield return null; + } + + var successOp = ops.FirstOrDefault(op => op.webRequest.result == UnityWebRequest.Result.Success); + + if (successOp == null) + { + foreach (var op in ops.Where(op => op.isDone)) + { + Log.Net.Warning($"请求失败: {op.webRequest.url}, 错误: {op.webRequest.error}"); + } + } + + IsConnected = successOp != null; + _preferredUrl = successOp?.webRequest.url; + } + + // 添加或删除检查 URL + public void AddCheckUrl(string url) + { + if (!checkUrls.Contains(url)) + { + checkUrls.Add(url); + } + } + + public void RemoveCheckUrl(string url) + { + if (checkUrls.Contains(url)) + { + checkUrls.Remove(url); + } + } + + public void AddPingTarget(string ip) + { + if (!_pingAddresses.Contains(ip)) + { + _pingAddresses.Add(ip); + } + } + + public void RemovePingTarget(string ip) + { + if (_pingAddresses.Contains(ip)) + { + _pingAddresses.Remove(ip); + } + } + + // 切换是否使用 Ping 检测 + public void SetUsePingCheck(bool enablePing) + { + usePingCheck = enablePing; +#if UNITY_WEBGL +usePingCheck = false; +#endif + _checkInterval = usePingCheck ? PingInterval : WebRequestInterval; + } + + private bool QuickNetDeviceCheck() + { + if (Application.isEditor) + { + return true; + } + + return Application.internetReachability != NetworkReachability.NotReachable; + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/Scripts/Core/NetCore.cs b/WV2SDK/SGModule/Net/SGModule/Scripts/Core/NetCore.cs new file mode 100644 index 0000000..3c4adf1 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/Scripts/Core/NetCore.cs @@ -0,0 +1,306 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using Newtonsoft.Json; +using Uni2SDK; +using Uni2SDK; +using Uni2SDK; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.Networking; + +namespace Uni2SDK +{ + // 网络请求核心类 + public abstract class NetCore : SingletonMonoBehaviour where TC : MonoBehaviour + { + private const int Timeout = 15; + private bool _isInit; + private int _requestCounter; + private string _requestHost; + + private new void Awake() + { + InternalInit(); + } + + protected abstract string Encrypt(string text, string key); + protected abstract string Decrypt(string text, string key); + protected abstract TokenManager.RefreshTokenDelegate RefreshTokenHandler(); + protected abstract TokenManager.ReauthenticateDelegate ReauthenticateHandler(); + + private void InternalInit() + { + NetChecker.Instance.Init(); + TokenManager.Instance.InitHandlers(RefreshTokenHandler(), ReauthenticateHandler()); + + _isInit = true; + _requestHost = NetworkManager.GetHost(); + + Log.Net.Info($"[sdk] Host is: {NetworkManager.GetHost()}"); + + } + + + private string GetApiUrl() + { + return NetworkManager.GetUrl(); + } + + private string GetWsUrl() + { + return $"wss://{_requestHost}/ws/"; + } + + /// + /// Post请求(异步) + /// + /// 请求路径 + /// 请求参数 + /// 请求回调 + /// 是否带Token + /// 额外的请求头 + protected IEnumerator PostAsync(string path, object requestData = null, + UnityAction> onCompleted = null, bool withToken = true, + Dictionary headers = null) + { + var done = false; + + Post(path, requestData, response => + { + onCompleted?.Invoke(response); + done = true; + }, withToken, true, headers); + + yield return new WaitUntil(() => done); + } + + /// + /// Post请求(泛型) + /// + /// 请求路径 + /// 请求参数 + /// 请求回调 + /// 是否带Token + /// 是否使用协程 + /// 额外的请求头 + /// 返回数据中Data的类型 + protected void Post(string path, object requestData = null, UnityAction> onCompleted = null, + bool withToken = true, bool useCoroutine = true, Dictionary headers = null) + { + if (useCoroutine) + { + StartCoroutine(PostInternal(path, requestData, onCompleted, withToken, headers)); + } + else + { + SendWebRequest(path, requestData, withToken, headers); + } + } + + + /// + /// 发出请求 所有的请求最终都会从这里发出 + /// + /// 请求路径 + /// 请求参数 + /// 请求回调 + /// 是否带Token + /// 额外的请求头 + /// 返回数据中Data的类型 + /// + private IEnumerator PostInternal(string path, object requestData, UnityAction> onCompleted, + bool withToken = true, Dictionary headers = null) + { + var response = new ResponseData(); + Log.Net.Info($"[PostInternal]===1====={_isInit}"); + if (!_isInit) + { + Log.Net.Info("NetworkKit模块未完成初始化 请检查!!! "); + response.Code = -1; + response.Msg = "NetworkKit module has not been initialized yet"; + onCompleted?.Invoke(response); + yield break; + } + + // 1. 网络检查 + var isNetworkOk = false; + yield return NetChecker.Instance.WaitUntilNetworkConnected(15, 1f, result => isNetworkOk = result); + + if (!isNetworkOk) + { + response.Code = -1; + response.Msg = "Network status abnormal."; + onCompleted?.Invoke(response); + yield break; + } + + + // 2. Token 处理(根据 withToken 参数) + if (withToken) + { + string token = null; + yield return TokenManager.Instance.GetToken(result => token = result); + + if (string.IsNullOrEmpty(token)) + { + response.Code = -1; + response.Msg = "Token acquisition failed."; + onCompleted?.Invoke(response); + yield break; + } + + // 合并原有 header + headers ??= new Dictionary(); + + headers["x-token"] = token; + } + + Log.Net.Info($"[PostInternal]===4====="); + + yield return SendRequest(path, requestData, onCompleted, headers); + } + + private IEnumerator SendRequest( + string path, + object requestData, + UnityAction> onCompleted = null, + Dictionary headers = null) + { + var requestId = GetNextRequestId(); + + var requestJson = SerializeHelper.ToJsonIndented(requestData ?? new object()); + + var unityWebRequest = CreatePostRequest(path, requestJson, headers); + + Log.Net.Info($"[Req:{requestId}] | Path: {path} | Body: {requestJson}"); + + yield return unityWebRequest.SendWebRequest(); //发送请求 + + var response = new ResponseData(); + + if (unityWebRequest.result is not UnityWebRequest.Result.Success) + { + Log.Net.Info($"[Resp:{requestId}] | Path: {path} | Error: {unityWebRequest.error}"); + response.Code = -1; + response.Msg = unityWebRequest.error; + } + else + { + var receiveContent = unityWebRequest.downloadHandler.text; + + if (!receiveContent.IsNullOrWhiteSpace()) + { + receiveContent = Decrypt(UnquoteString(receiveContent), _requestHost); + } + + + var raw = SerializeHelper.ToObject>(receiveContent); + + if (raw?.Code == 0) + { + Log.Net.Info($"[Resp:{requestId}] | Path: {path} | Result: {receiveContent}"); + + // 处理字符串类型的情况 + if (typeof(T) == typeof(string)) + { + response.Data = (T)(object)(raw.Data?.ToString() ?? ""); + } + else + { + response.Data = SerializeHelper.ToObject(JsonConvert.SerializeObject(raw.Data)); + } + } + else + { + Log.Net.Warning($"[Resp:{requestId}] | Path: {path} | Result: {receiveContent}"); + + response.Code = raw?.Code ?? -2; + response.Msg = raw?.Msg ?? "未知错误"; + } + } + + onCompleted?.Invoke(response); + + unityWebRequest.Dispose(); + } + + private UnityWebRequest CreatePostRequest(string path, string requestJson, + Dictionary headers = null) + { + Log.Info($"[CreatePostRequest 0] ",$" Path: {path} \n Body: {requestJson} \n _requestHost: {_requestHost}"); + + path = Encrypt(path, _requestHost); + requestJson = Encrypt(requestJson, _requestHost); + + var fullUrl = GetApiUrl() + path; + Log.Info($"[CreatePostRequest 1] ",$"GetApiUrl()=={GetApiUrl()}\n Path: {path} \n Body: {requestJson} \n _requestHost: {_requestHost} \n fullUrl: {fullUrl}"); + + var request = new UnityWebRequest(fullUrl, UnityWebRequest.kHttpVerbPOST) + { + uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(requestJson)), + downloadHandler = new DownloadHandlerBuffer(), + timeout = Timeout + }; + + SetRequestHeaders(request, headers); + + return request; + } + + private void SetRequestHeaders(UnityWebRequest request, Dictionary headers) + { + request.SetRequestHeader("Content-Type", "application/json;charset=utf-8"); + if (headers == null) + { + return; + } + + foreach (var kvp in headers.Where(kvp => kvp.Value != null)) + { + request.SetRequestHeader(kvp.Key, kvp.Value); + } + } + + private int GetNextRequestId() + { + return Interlocked.Increment(ref _requestCounter); + } + + // 去除双引号(如果存在) + private static string UnquoteString(string input) + { + if (!string.IsNullOrEmpty(input) && input.Length >= 2 && + input[0] == '"' && input[input.Length - 1] == '"') + { + return input.Substring(1, input.Length - 2); + } + + return input; + } + + + private void SendWebRequest(string url, object requestData = null, bool withToken = false, + Dictionary header = null) + { + if (withToken) + { + // 合并原有 header + header ??= new Dictionary(); + header["x-token"] = TokenManager.Instance.CachedToken; + } + + var requestId = GetNextRequestId(); + + var requestJson = SerializeHelper.ToJsonIndented(requestData ?? new object()); + + var unityWebRequest = CreatePostRequest(url, requestJson, header); + + Log.Net.Info($"[Req:{requestId}] | Path: {url} | Body: {requestJson}"); + + unityWebRequest.SendWebRequest(); //发送请求 + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/Scripts/Core/ServerClock.cs b/WV2SDK/SGModule/Net/SGModule/Scripts/Core/ServerClock.cs new file mode 100644 index 0000000..8e33c2c --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/Scripts/Core/ServerClock.cs @@ -0,0 +1,25 @@ +using System; + +namespace Uni2SDK +{ + // 服务器时钟管理类 + public static class ServerClock + { + private static long _timeDifference; // 本地与服务器的时间偏差 + + public static void Init(long serverTime) + { + _timeDifference = serverTime - Now(); + } + + public static long GetCurrentServerTime() + { + return Now() + _timeDifference; + } + + private static long Now() + { + return DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/Scripts/Core/TokenManager.cs b/WV2SDK/SGModule/Net/SGModule/Scripts/Core/TokenManager.cs new file mode 100644 index 0000000..f4e3cc5 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/Scripts/Core/TokenManager.cs @@ -0,0 +1,252 @@ +using System.Collections; +using System.Collections.Generic; +using Uni2SDK; +using Uni2SDK; +using Uni2SDK; +using UnityEngine; +using UnityEngine.Events; + +namespace Uni2SDK +{ + // Token管理类 + public class TokenManager : SingletonMonoBehaviour + { + public delegate IEnumerator ReauthenticateDelegate(UnityAction onCompleted); + + public delegate IEnumerator RefreshTokenDelegate(UnityAction onCompleted); + + private const string JarvisTokenKey = "JarvisToken"; + private const string JarvisTokenExpiresAtKey = "JarvisTokenExpiresAt"; + private const float MinRefreshInterval = 10f; // 刷新间隔秒数限制 + private const int MaxTokenRecordCount = 10; // 最多记录最近token数 + + private readonly List _tokenRecord = new(); + + private long _cachedExpiresAt; + private string _cachedToken; + + private bool _isReauthenticating; + private bool _isRefreshing; + private float _lastRefreshTime; + private ReauthenticateDelegate _reauthenticateHandler; + + private RefreshTokenDelegate _refreshTokenHandler; + + public string CachedToken + { + get + { + if (string.IsNullOrEmpty(_cachedToken)) + { + _cachedToken = PlayerPrefs.GetString(JarvisTokenKey, null); + } + + return _cachedToken; + } + set + { + _cachedToken = value; + if (!string.IsNullOrEmpty(value)) + { + PlayerPrefs.SetString(JarvisTokenKey, value); + } + else + { + PlayerPrefs.DeleteKey(JarvisTokenKey); + } + } + } + + private long CachedExpiresAt + { + get + { + if (_cachedExpiresAt == 0) + { + var expiresStr = PlayerPrefs.GetString(JarvisTokenExpiresAtKey, "0"); + if (!long.TryParse(expiresStr, out _cachedExpiresAt)) + { + _cachedExpiresAt = 0; + } + } + + return _cachedExpiresAt; + } + set + { + _cachedExpiresAt = value; + PlayerPrefs.SetString(JarvisTokenExpiresAtKey, value.ToString()); + } + } + + + private long RemainingTokenSeconds => CachedExpiresAt - ServerClock.GetCurrentServerTime(); + + public void InitHandlers(RefreshTokenDelegate refreshTokenHandler, ReauthenticateDelegate reauthenticateHandler) + { + _refreshTokenHandler = refreshTokenHandler; + _reauthenticateHandler = reauthenticateHandler; + } + + /// + /// 获取有效Token,自动处理刷新和重新登录 + /// + public IEnumerator GetToken(UnityAction callback) + { + // 若正在重新登录,则等待其完成,避免刷新或登录并发 + yield return WaitForReauthenticationComplete(); + if (_isReauthenticating) + { + callback?.Invoke(null); + yield break; + } + + + if (IsTokenValid()) + { + callback?.Invoke(CachedToken); // 优先返回现有有效 Token + + // 如果快过期,则后台触发刷新,不等待 + if (IsTokenExpiringSoon() && ShouldStartRefresh()) + { + _lastRefreshTime = Time.realtimeSinceStartup; + StartCoroutine(RefreshTokenRoutine()); // 不阻塞当前流程 + } + } + else + { + // token 已过期,必须重新登录 + yield return ReauthenticateRoutine(success => { callback?.Invoke(success ? CachedToken : null); }); + } + } + + private IEnumerator WaitForReauthenticationComplete() + { + var waitCount = 0; + while (_isReauthenticating && waitCount < 6) + { + yield return new WaitForSeconds(0.5f); + waitCount++; + } + } + + + private IEnumerator RefreshTokenRoutine() + { + if (_isRefreshing || _refreshTokenHandler == null) + { + if (_refreshTokenHandler == null) + { + Log.Net.Error("未设置 RefreshTokenHandler 委托,请先调用 InitHandlers 进行注入!"); + } + + yield break; + } + + _isRefreshing = true; + var retryCount = 0; + var refreshSuccess = false; + + while (!refreshSuccess && retryCount < 3) + { + retryCount++; + Log.Net.Info($"Token快过期了, 尝试刷新Token, 次数: {retryCount}"); + yield return _refreshTokenHandler((token, expiresAt) => + { + refreshSuccess = !token.IsNullOrWhiteSpace(); + if (token.IsNullOrWhiteSpace()) + { + UpdateTokenCache(token, expiresAt); + } + }); + // yield return NetCore.Instance.PostAsync("tokenRefresh", onCompleted: response => { + // refreshSuccess = response.IsSuccess; + // if (refreshSuccess) { + // UpdateTokenCache(response.Data.Token, response.Data.ExpiresAt); + // NetLog.Warning("Token刷新成功"); + // } + // }); + + if (!refreshSuccess) + { + yield return new WaitForSeconds(1f); + } + } + + if (!refreshSuccess) + { + Log.Net.Error("Token刷新失败"); + } + + _isRefreshing = false; + } + + private IEnumerator ReauthenticateRoutine(UnityAction onCompleted) + { + if (_isReauthenticating || _reauthenticateHandler == null) + { + if (_reauthenticateHandler == null) + { + Log.Net.Error("未设置 ReauthenticateHandler 委托,请先调用 InitHandlers 进行注入!"); + } + + onCompleted?.Invoke(false); + yield break; + } + + _isReauthenticating = true; + Log.Net.Error("Token过期,开始重新登录流程"); + yield return _reauthenticateHandler((token, expiresAt) => + { + var success = !token.IsNullOrWhiteSpace(); + if (token.IsNullOrWhiteSpace()) + { + UpdateTokenCache(token, expiresAt); + } + + onCompleted?.Invoke(success); + }); + // yield return Login.Instance.ReauthenticateOnExpiration(success => { + // onCompleted?.Invoke(success); + // }); + _isReauthenticating = false; + } + + private bool IsTokenValid() + { + return !string.IsNullOrEmpty(CachedToken) && RemainingTokenSeconds > 0; + } + + // 小于1小时(3600秒)有效期,认为快过期需要刷新 + private bool IsTokenExpiringSoon() + { + return RemainingTokenSeconds < 3600; + } + + public void UpdateTokenCache(string token, long expiresAt) + { + CachedToken = token; + CachedExpiresAt = expiresAt; + + + _tokenRecord.Add(token); + if (_tokenRecord.Count > MaxTokenRecordCount) + { + _tokenRecord.RemoveAt(0); + } + } + + private bool ShouldStartRefresh() + { + return !_isRefreshing && Time.realtimeSinceStartup - _lastRefreshTime > MinRefreshInterval; + } + + /// + /// 获取Token记录(测试功能用) + /// + public List GetTokenRecord() + { + return _tokenRecord; + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/Scripts/Models/ResponseData.cs b/WV2SDK/SGModule/Net/SGModule/Scripts/Models/ResponseData.cs new file mode 100644 index 0000000..a33591b --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/Scripts/Models/ResponseData.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class ResponseData + { + [JsonProperty("code")] public int Code; + [JsonProperty("data")] public T Data; + [JsonProperty("msg")] public string Msg; + + public bool IsSuccess => Code == 0; + + public void Deconstruct(out bool isSuccess, out T data) + { + isSuccess = IsSuccess; + data = Data; + } + } + + // public class RequestTokenData { + // [JsonProperty("expires_at")] public long ExpiresAt; + // [JsonProperty("token")] public string Token; + // } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/ResponseData.cs b/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/ResponseData.cs new file mode 100644 index 0000000..817127e --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/ResponseData.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +public class ResponseData +{ + [JsonProperty("cmd")] public int Cmd { get; set; } + + [JsonProperty("body")] public Body Body { get; set; } +} + +public class Body +{ + [JsonProperty("code")] public int Code { get; set; } + + [JsonProperty("data")] public JToken Data { get; set; } // 使用 JToken 来处理不同的 data 结构 + + [JsonProperty("msg")] public string Msg { get; set; } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketData.cs b/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketData.cs new file mode 100644 index 0000000..7370802 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketData.cs @@ -0,0 +1,5 @@ +internal class WebSocketData +{ + public int cmd; + public string token; +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketEvent.cs b/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketEvent.cs new file mode 100644 index 0000000..0d2f714 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketEvent.cs @@ -0,0 +1,8 @@ +namespace Uni2SDK +{ + public enum WebSocketEvent + { + BindToken = 4097, + SendHeartbeat = 4098 + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketService.cs b/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketService.cs new file mode 100644 index 0000000..3b85d92 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketService.cs @@ -0,0 +1,262 @@ +using System; +using System.Text; +using System.Threading.Tasks; +using NativeWebSocket; +using NativeWebSocket.Net; +using Newtonsoft.Json; +using Uni2SDK; +using Uni2SDK; +using UnityEngine; + +namespace Uni2SDK +{ + public class WebSocketService : SingletonMonoBehaviour + { + private const float OffLineDecisionTime = 5f; + private bool _bindToken; + + private float _offlineDuration; + private string _url; + private WebSocket _webSocket; + + private void Update() + { +#if !UNITY_WEBGL || UNITY_EDITOR + if (_webSocket != null) + { + _webSocket.DispatchMessageQueue(); + } +#endif + if (IsInitComplete) + { + // 网络状态检测 + if (NetChecker.Instance.GetConnectionStatus() == ConnectionStatus.Connected) + { + _offlineDuration = 0; + if (_webSocket == null || _webSocket.State == WebSocketState.Closed) + { + Log.Net.Warning("网络恢复 重连"); + TryReconnect(); + } + } + else + { + _offlineDuration += Time.deltaTime; + if (_offlineDuration > OffLineDecisionTime && _webSocket != null && + _webSocket.State == WebSocketState.Open) + { + Log.Net.Warning("断网 主动结束连接"); + _ = Disconnect(); + } + } + } + } + + private async void OnApplicationQuit() + { + await Disconnect(); + } + + private void InitGmTool() + { + } + + /// + /// 初始化 + /// + /// + public async void Init(string url) + { + InitGmTool(); + + NetChecker.Instance.SetUsePingCheck(true); + + Log.Net.Info($"Initializing WebSocket service. Url: {url}"); + _url = url; + + OnOpenAction += OnOpen; + OnMessageAction += OnMessage; + OnErrorAction += OnError; + OnCloseAction += OnClose; + + await Connect(); + } + + private void Send(object data) + { + if (_webSocket == null) + { + Log.Net.Warning("webSocket is null"); + return; + } + + if (_webSocket.State != WebSocketState.Open) + { + Log.Net.Warning("webSocket.State != Open"); + return; + } + + var jsonString = JsonConvert.SerializeObject(data); + var byteArray = Encoding.UTF8.GetBytes(jsonString); + _webSocket.Send(byteArray); + } + + /// + /// 断开连接 + /// + public async Task Disconnect() + { + if (_webSocket != null) + { + var webSocket = _webSocket; + _webSocket = null; + await webSocket.Close(); + } + } + + #region 连接管理 + + // 事件回调 + public event Action OnOpenAction; + public event Action OnMessageAction; + public event Action OnCloseAction; + public event Action OnErrorAction; + + /// + /// 初始化并尝试连接 + /// + private async Task Connect() + { + if (_webSocket != null && + (_webSocket.State == WebSocketState.Open || _webSocket.State == WebSocketState.Connecting)) + { + Log.Net.Warning("WebSocket is already connected or connecting."); + return; + } + + _webSocket = new WebSocket(_url); + + // 绑定事件 + _webSocket.OnOpen += () => + { + Log.Net.Info("WebSocket connected."); + OnOpenAction?.Invoke(); + }; + + _webSocket.OnMessage += bytes => + { + var message = Encoding.UTF8.GetString(bytes); + Log.Net.Info($"Message received: {message}"); + OnMessageAction?.Invoke(message); + }; + + _webSocket.OnClose += code => + { + Log.Net.Info($"WebSocket disconnected with code: {code}"); + OnCloseAction?.Invoke(code); + }; + + _webSocket.OnError += error => + { + Log.Net.Error($"WebSocket error: {error}"); + OnErrorAction?.Invoke(error); + }; + + // 开始连接 + try + { + await _webSocket.Connect(); + } + catch (Exception ex) + { + Log.Net.Error($"WebSocket connection failed: {ex.Message}"); + TryReconnect(); + } + } + + + private void OnOpen() + { + IsInitComplete = true; + // 重连成功后绑定 Token + if (_bindToken) + { + BindToken(TokenManager.Instance.CachedToken); + } + } + + private void OnClose(WebSocketCloseCode closeCode) + { + } + + private void OnMessage(string message) + { + var responseData = WebSocketTools.DeserializeResponse(message); + WebSocketTools.ProcessResponseData(responseData); + } + + private void OnError(string errorMsg) + { + } + + /// + /// 尝试重连 + /// + private async void TryReconnect() + { + var maxRetries = 5; // 最大重连次数 + var attempt = 0; + while (attempt < maxRetries) + { + attempt++; + Log.Net.Info($"Attempting to reconnect... (Attempt {attempt}/{maxRetries})"); + try + { + await Connect(); + + //以下或许不会执行 这个 + Log.Net.Info("Reconnected successfully."); + return; // 重连成功 + } + catch (Exception ex) + { + Log.Net.Error($"Reconnection attempt {attempt} failed: {ex.Message}"); + await Task.Delay(2000); // 等待一段时间再尝试 + } + } + + Log.Net.Error("Max reconnection attempts reached. Connection failed."); + } + + #endregion + + #region 请求 + + /// + /// 绑定Token + /// + public void BindToken(string token) + { + Send(new WebSocketData + { + cmd = (int)WebSocketEvent.BindToken, + token = token + }); + + _bindToken = true; + } + + /// + /// 发送心跳 + /// + public void SendHeartbeat() + { + Send(new WebSocketData + { + cmd = (int)WebSocketEvent.SendHeartbeat + }); + } + + #endregion + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketTools.cs b/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketTools.cs new file mode 100644 index 0000000..436a902 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/Scripts/WebSocket/WebSocketTools.cs @@ -0,0 +1,88 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Uni2SDK; + +public class WebSocketTools +{ + // 反序列化函数,返回 ResponseData 对象 + public static ResponseData DeserializeResponse(string jsonMessage) + { + try + { + return JsonConvert.DeserializeObject(jsonMessage); + } + catch (JsonException ex) + { + Log.Net.Error($"Failed to deserialize response: {ex.Message}"); + return null; + } + } + + // 处理数据函数 + public static void ProcessResponseData(ResponseData responseData) + { + // 处理请求成功的情况 + if (responseData.Body.Code == 0) + { + Log.Net.Info("Request succeeded"); + HandleData(responseData.Body.Data); // 不传入类型时,先默认不解析 + } + else + { + Log.Net.Error($"Request failed: {responseData.Body.Msg}"); + } + } + + // 泛型版本的 HandleData,允许外部传入一个类型 + public static void HandleData(JToken data) + { + // 检查 data 是否为空对象 + if (data.Type == JTokenType.Object && !data.HasValues) + { + Log.Net.Info("Data is empty"); + // 可根据需要进一步处理空数据的情况 + } + else + { + // 如果 data 包含有效数据,打印或进一步处理 + Log.Net.Info("Received data: " + data); + ProcessValidData(data); + } + } + + // 泛型版本的 HandleData,传入类型进行解析 + public static void HandleData(JToken data) + { + if (data != null) + { + try + { + var parsedData = data.ToObject(); // 将 data 解析为指定类型 + Log.Net.Info("Parsed data: " + JsonConvert.SerializeObject(parsedData)); + ProcessValidData(parsedData); // 进一步处理解析后的数据 + } + catch (JsonException ex) + { + Log.Net.Error($"Failed to parse data to type {typeof(T)}: {ex.Message}"); + } + } + else + { + Log.Net.Warning("Data is null, cannot parse."); + } + } + + // 处理解析后的 data 类型 + public static void ProcessValidData(T parsedData) + { + if (parsedData != null) + { + // 在这里可以对解析后的 data 进行具体处理 + Log.Net.Info("Successfully processed data: " + parsedData); + } + else + { + Log.Net.Warning("Parsed data is null, cannot process."); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/Samples~/WebSocketExample/Connection.cs b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/Samples~/WebSocketExample/Connection.cs new file mode 100644 index 0000000..6a6f201 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/Samples~/WebSocketExample/Connection.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using NativeWebSocket; +using NativeWebSocket.Net; + +public class Connection : MonoBehaviour +{ + WebSocket websocket; + + // Start is called before the first frame update + async void Start() + { + // websocket = new WebSocket("ws://echo.websocket.org"); + websocket = new WebSocket("ws://localhost:3000"); + + websocket.OnOpen += () => { Debug.Log("Connection open!"); }; + + websocket.OnError += (e) => { Debug.Log("Error! " + e); }; + + websocket.OnClose += (e) => { Debug.Log("Connection closed!"); }; + + websocket.OnMessage += (bytes) => + { + // Reading a plain text message + var message = System.Text.Encoding.UTF8.GetString(bytes); + Debug.Log("Received OnMessage! (" + bytes.Length + " bytes) " + message); + }; + + // Keep sending messages at every 0.3s + InvokeRepeating("SendWebSocketMessage", 0.0f, 0.3f); + + await websocket.Connect(); + } + + void Update() + { +#if !UNITY_WEBGL || UNITY_EDITOR + websocket.DispatchMessageQueue(); +#endif + } + + async void SendWebSocketMessage() + { + if (websocket.State == WebSocketState.Open) + { + // Sending bytes + await websocket.Send(new byte[] { 10, 20, 30 }); + + // Sending plain text + await websocket.SendText("plain text message"); + } + } + + private async void OnApplicationQuit() + { + await websocket.Close(); + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/Samples~/WebSocketExample/WebSocketExampleScene.unity b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/Samples~/WebSocketExample/WebSocketExampleScene.unity new file mode 100644 index 0000000..65d5dfa --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/Samples~/WebSocketExample/WebSocketExampleScene.unity @@ -0,0 +1,326 @@ +%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: 705507994} + m_IndirectSpecularColor: {r: 0.44657868, g: 0.49641263, b: 0.57481706, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + 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: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + 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_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !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 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705507995} + - component: {fileID: 705507994} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 9 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.802082 + 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: 1 + 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 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + 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 &963194225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 963194228} + - component: {fileID: 963194227} + - component: {fileID: 963194226} + - component: {fileID: 963194230} + - component: {fileID: 963194229} + 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 &963194226 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 +--- !u!20 &963194227 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + 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 &963194228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &963194229 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0f451fab1e6d94aea8fb73803e281bb3, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &963194230 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/WebSocket.cs b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/WebSocket.cs new file mode 100644 index 0000000..376e929 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/WebSocket.cs @@ -0,0 +1,882 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.WebSockets; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using AOT; +using System.Runtime.InteropServices; +using UnityEngine; +using System.Collections; + +public class MainThreadUtil : MonoBehaviour +{ + public static MainThreadUtil Instance { get; private set; } + public static SynchronizationContext synchronizationContext { get; private set; } + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + public static void Setup() + { + Instance = new GameObject("MainThreadUtil") + .AddComponent(); + synchronizationContext = SynchronizationContext.Current; + } + + public static void Run(IEnumerator waitForUpdate) + { + synchronizationContext.Post(_ => Instance.StartCoroutine( + waitForUpdate), null); + } + + void Awake() + { + gameObject.hideFlags = HideFlags.HideAndDontSave; + DontDestroyOnLoad(gameObject); + } +} + +public class WaitForUpdate : CustomYieldInstruction +{ + public override bool keepWaiting + { + get { return false; } + } + + public MainThreadAwaiter GetAwaiter() + { + var awaiter = new MainThreadAwaiter(); + MainThreadUtil.Run(CoroutineWrapper(this, awaiter)); + return awaiter; + } + + public class MainThreadAwaiter : INotifyCompletion + { + Action continuation; + + public bool IsCompleted { get; set; } + + public void GetResult() + { + } + + public void Complete() + { + IsCompleted = true; + continuation?.Invoke(); + } + + void INotifyCompletion.OnCompleted(Action continuation) + { + this.continuation = continuation; + } + } + + public static IEnumerator CoroutineWrapper(IEnumerator theWorker, MainThreadAwaiter awaiter) + { + yield return theWorker; + awaiter.Complete(); + } +} + +namespace NativeWebSocket.Net +{ + public delegate void WebSocketOpenEventHandler(); + + public delegate void WebSocketMessageEventHandler(byte[] data); + + public delegate void WebSocketErrorEventHandler(string errorMsg); + + public delegate void WebSocketCloseEventHandler(WebSocketCloseCode closeCode); + + public enum WebSocketCloseCode + { + /* Do NOT use NotSet - it's only purpose is to indicate that the close code cannot be parsed. */ + NotSet = 0, + Normal = 1000, + Away = 1001, + ProtocolError = 1002, + UnsupportedData = 1003, + Undefined = 1004, + NoStatus = 1005, + Abnormal = 1006, + InvalidData = 1007, + PolicyViolation = 1008, + TooBig = 1009, + MandatoryExtension = 1010, + ServerError = 1011, + TlsHandshakeFailure = 1015 + } + + public enum WebSocketState + { + Connecting, + Open, + Closing, + Closed + } + + public interface IWebSocket + { + event WebSocketOpenEventHandler OnOpen; + event WebSocketMessageEventHandler OnMessage; + event WebSocketErrorEventHandler OnError; + event WebSocketCloseEventHandler OnClose; + + WebSocketState State { get; } + } + + public static class WebSocketHelpers + { + public static WebSocketCloseCode ParseCloseCodeEnum(int closeCode) + { + if (WebSocketCloseCode.IsDefined(typeof(WebSocketCloseCode), closeCode)) + { + return (WebSocketCloseCode)closeCode; + } + else + { + return WebSocketCloseCode.Undefined; + } + } + + public static WebSocketException GetErrorMessageFromCode(int errorCode, Exception inner) + { + switch (errorCode) + { + case -1: + return new WebSocketUnexpectedException("WebSocket instance not found.", inner); + case -2: + return new WebSocketInvalidStateException("WebSocket is already connected or in connecting state.", + inner); + case -3: + return new WebSocketInvalidStateException("WebSocket is not connected.", inner); + case -4: + return new WebSocketInvalidStateException("WebSocket is already closing.", inner); + case -5: + return new WebSocketInvalidStateException("WebSocket is already closed.", inner); + case -6: + return new WebSocketInvalidStateException("WebSocket is not in open state.", inner); + case -7: + return new WebSocketInvalidArgumentException( + "Cannot close WebSocket. An invalid code was specified or reason is too long.", inner); + default: + return new WebSocketUnexpectedException("Unknown error.", inner); + } + } + } + + public class WebSocketException : Exception + { + public WebSocketException() + { + } + + public WebSocketException(string message) : base(message) + { + } + + public WebSocketException(string message, Exception inner) : base(message, inner) + { + } + } + + public class WebSocketUnexpectedException : WebSocketException + { + public WebSocketUnexpectedException() + { + } + + public WebSocketUnexpectedException(string message) : base(message) + { + } + + public WebSocketUnexpectedException(string message, Exception inner) : base(message, inner) + { + } + } + + public class WebSocketInvalidArgumentException : WebSocketException + { + public WebSocketInvalidArgumentException() + { + } + + public WebSocketInvalidArgumentException(string message) : base(message) + { + } + + public WebSocketInvalidArgumentException(string message, Exception inner) : base(message, inner) + { + } + } + + public class WebSocketInvalidStateException : WebSocketException + { + public WebSocketInvalidStateException() + { + } + + public WebSocketInvalidStateException(string message) : base(message) + { + } + + public WebSocketInvalidStateException(string message, Exception inner) : base(message, inner) + { + } + } + + public class WaitForBackgroundThread + { + public ConfiguredTaskAwaitable.ConfiguredTaskAwaiter GetAwaiter() + { + return Task.Run(() => { }).ConfigureAwait(false).GetAwaiter(); + } + } + +#if UNITY_WEBGL && !UNITY_EDITOR + /// + /// WebSocket class bound to JSLIB. + /// + public class WebSocket : IWebSocket { + + /* WebSocket JSLIB functions */ + [DllImport ("__Internal")] + public static extern int WebSocketConnect (int instanceId); + + [DllImport ("__Internal")] + public static extern int WebSocketClose (int instanceId, int code, string reason); + + [DllImport ("__Internal")] + public static extern int WebSocketSend (int instanceId, byte[] dataPtr, int dataLength); + + [DllImport ("__Internal")] + public static extern int WebSocketSendText (int instanceId, string message); + + [DllImport ("__Internal")] + public static extern int WebSocketGetState (int instanceId); + + protected int instanceId; + + public event WebSocketOpenEventHandler OnOpen; + public event WebSocketMessageEventHandler OnMessage; + public event WebSocketErrorEventHandler OnError; + public event WebSocketCloseEventHandler OnClose; + + public WebSocket (string url, Dictionary headers = null) { + if (!WebSocketFactory.isInitialized) { + WebSocketFactory.Initialize (); + } + + int instanceId = WebSocketFactory.WebSocketAllocate (url); + WebSocketFactory.instances.Add (instanceId, this); + + this.instanceId = instanceId; + } + + public WebSocket (string url, string subprotocol, Dictionary headers = null) { + if (!WebSocketFactory.isInitialized) { + WebSocketFactory.Initialize (); + } + + int instanceId = WebSocketFactory.WebSocketAllocate (url); + WebSocketFactory.instances.Add (instanceId, this); + + WebSocketFactory.WebSocketAddSubProtocol(instanceId, subprotocol); + + this.instanceId = instanceId; + } + + public WebSocket (string url, List subprotocols, Dictionary headers = null) { + if (!WebSocketFactory.isInitialized) { + WebSocketFactory.Initialize (); + } + + int instanceId = WebSocketFactory.WebSocketAllocate (url); + WebSocketFactory.instances.Add (instanceId, this); + + foreach (string subprotocol in subprotocols) { + WebSocketFactory.WebSocketAddSubProtocol(instanceId, subprotocol); + } + + this.instanceId = instanceId; + } + + ~WebSocket () { + WebSocketFactory.HandleInstanceDestroy (this.instanceId); + } + + public int GetInstanceId () { + return this.instanceId; + } + + public Task Connect () { + int ret = WebSocketConnect (this.instanceId); + + if (ret < 0) + throw WebSocketHelpers.GetErrorMessageFromCode (ret, null); + + return Task.CompletedTask; + } + + public void CancelConnection () { + if (State == WebSocketState.Open) + Close (WebSocketCloseCode.Abnormal); + } + + public Task Close (WebSocketCloseCode code = WebSocketCloseCode.Normal, string reason = null) { + int ret = WebSocketClose (this.instanceId, (int) code, reason); + + if (ret < 0) + throw WebSocketHelpers.GetErrorMessageFromCode (ret, null); + + return Task.CompletedTask; + } + + public Task Send (byte[] data) { + int ret = WebSocketSend (this.instanceId, data, data.Length); + + if (ret < 0) + throw WebSocketHelpers.GetErrorMessageFromCode (ret, null); + + return Task.CompletedTask; + } + + public Task SendText (string message) { + int ret = WebSocketSendText (this.instanceId, message); + + if (ret < 0) + throw WebSocketHelpers.GetErrorMessageFromCode (ret, null); + + return Task.CompletedTask; + } + + public WebSocketState State { + get { + int state = WebSocketGetState (this.instanceId); + + if (state < 0) + throw WebSocketHelpers.GetErrorMessageFromCode (state, null); + + switch (state) { + case 0: + return WebSocketState.Connecting; + + case 1: + return WebSocketState.Open; + + case 2: + return WebSocketState.Closing; + + case 3: + return WebSocketState.Closed; + + default: + return WebSocketState.Closed; + } + } + } + + public void DelegateOnOpenEvent () { + this.OnOpen?.Invoke (); + } + + public void DelegateOnMessageEvent (byte[] data) { + this.OnMessage?.Invoke (data); + } + + public void DelegateOnErrorEvent (string errorMsg) { + this.OnError?.Invoke (errorMsg); + } + + public void DelegateOnCloseEvent (int closeCode) { + this.OnClose?.Invoke (WebSocketHelpers.ParseCloseCodeEnum (closeCode)); + } + + } + +#else + + public class WebSocket : IWebSocket + { + public event WebSocketOpenEventHandler OnOpen; + public event WebSocketMessageEventHandler OnMessage; + public event WebSocketErrorEventHandler OnError; + public event WebSocketCloseEventHandler OnClose; + + private Uri uri; + private Dictionary headers; + private List subprotocols; + private ClientWebSocket m_Socket = new ClientWebSocket(); + + private CancellationTokenSource m_TokenSource; + private CancellationToken m_CancellationToken; + + private readonly object OutgoingMessageLock = new object(); + private readonly object IncomingMessageLock = new object(); + + private bool isSending = false; + private List> sendBytesQueue = new List>(); + private List> sendTextQueue = new List>(); + + public WebSocket(string url, Dictionary headers = null) + { + uri = new Uri(url); + + if (headers == null) + { + this.headers = new Dictionary(); + } + else + { + this.headers = headers; + } + + subprotocols = new List(); + + string protocol = uri.Scheme; + if (!protocol.Equals("ws") && !protocol.Equals("wss")) + throw new ArgumentException("Unsupported protocol: " + protocol); + } + + public WebSocket(string url, string subprotocol, Dictionary headers = null) + { + uri = new Uri(url); + + if (headers == null) + { + this.headers = new Dictionary(); + } + else + { + this.headers = headers; + } + + subprotocols = new List { subprotocol }; + + string protocol = uri.Scheme; + if (!protocol.Equals("ws") && !protocol.Equals("wss")) + throw new ArgumentException("Unsupported protocol: " + protocol); + } + + public WebSocket(string url, List subprotocols, Dictionary headers = null) + { + uri = new Uri(url); + + if (headers == null) + { + this.headers = new Dictionary(); + } + else + { + this.headers = headers; + } + + this.subprotocols = subprotocols; + + string protocol = uri.Scheme; + if (!protocol.Equals("ws") && !protocol.Equals("wss")) + throw new ArgumentException("Unsupported protocol: " + protocol); + } + + public void CancelConnection() + { + m_TokenSource?.Cancel(); + } + + public async Task Connect() + { + try + { + m_TokenSource = new CancellationTokenSource(); + m_CancellationToken = m_TokenSource.Token; + + m_Socket = new ClientWebSocket(); + + foreach (var header in headers) + { + m_Socket.Options.SetRequestHeader(header.Key, header.Value); + } + + foreach (string subprotocol in subprotocols) + { + m_Socket.Options.AddSubProtocol(subprotocol); + } + + await m_Socket.ConnectAsync(uri, m_CancellationToken); + OnOpen?.Invoke(); + + await Receive(); + } + catch (Exception ex) + { + OnError?.Invoke(ex.Message); + OnClose?.Invoke(WebSocketCloseCode.Abnormal); + } + finally + { + if (m_Socket != null) + { + m_TokenSource.Cancel(); + m_Socket.Dispose(); + } + } + } + + public WebSocketState State + { + get + { + switch (m_Socket.State) + { + case System.Net.WebSockets.WebSocketState.Connecting: + return WebSocketState.Connecting; + + case System.Net.WebSockets.WebSocketState.Open: + return WebSocketState.Open; + + case System.Net.WebSockets.WebSocketState.CloseSent: + case System.Net.WebSockets.WebSocketState.CloseReceived: + return WebSocketState.Closing; + + case System.Net.WebSockets.WebSocketState.Closed: + return WebSocketState.Closed; + + default: + return WebSocketState.Closed; + } + } + } + + public Task Send(byte[] bytes) + { + // return m_Socket.SendAsync(buffer, WebSocketMessageType.Binary, true, CancellationToken.None); + return SendMessage(sendBytesQueue, WebSocketMessageType.Binary, new ArraySegment(bytes)); + } + + public Task SendText(string message) + { + var encoded = Encoding.UTF8.GetBytes(message); + + // m_Socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); + return SendMessage(sendTextQueue, WebSocketMessageType.Text, + new ArraySegment(encoded, 0, encoded.Length)); + } + + private async Task SendMessage(List> queue, WebSocketMessageType messageType, + ArraySegment buffer) + { + // Return control to the calling method immediately. + // await Task.Yield (); + + // Make sure we have data. + if (buffer.Count == 0) + { + return; + } + + // The state of the connection is contained in the context Items dictionary. + bool sending; + + lock (OutgoingMessageLock) + { + sending = isSending; + + // If not, we are now. + if (!isSending) + { + isSending = true; + } + } + + if (!sending) + { + // Lock with a timeout, just in case. + if (!Monitor.TryEnter(m_Socket, 1000)) + { + // If we couldn't obtain exclusive access to the socket in one second, something is wrong. + await m_Socket.CloseAsync(WebSocketCloseStatus.InternalServerError, string.Empty, + m_CancellationToken); + return; + } + + try + { + // Send the message synchronously. + var t = m_Socket.SendAsync(buffer, messageType, true, m_CancellationToken); + t.Wait(m_CancellationToken); + } + finally + { + Monitor.Exit(m_Socket); + } + + // Note that we've finished sending. + lock (OutgoingMessageLock) + { + isSending = false; + } + + // Handle any queued messages. + await HandleQueue(queue, messageType); + } + else + { + // Add the message to the queue. + lock (OutgoingMessageLock) + { + queue.Add(buffer); + } + } + } + + private async Task HandleQueue(List> queue, WebSocketMessageType messageType) + { + var buffer = new ArraySegment(); + lock (OutgoingMessageLock) + { + // Check for an item in the queue. + if (queue.Count > 0) + { + // Pull it off the top. + buffer = queue[0]; + queue.RemoveAt(0); + } + } + + // Send that message. + if (buffer.Count > 0) + { + await SendMessage(queue, messageType, buffer); + } + } + + private List m_MessageList = new List(); + + // simple dispatcher for queued messages. + public void DispatchMessageQueue() + { + if (m_MessageList.Count == 0) + { + return; + } + + List messageListCopy; + + lock (IncomingMessageLock) + { + messageListCopy = new List(m_MessageList); + m_MessageList.Clear(); + } + + var len = messageListCopy.Count; + for (int i = 0; i < len; i++) + { + OnMessage?.Invoke(messageListCopy[i]); + } + } + + public async Task Receive() + { + WebSocketCloseCode closeCode = WebSocketCloseCode.Abnormal; + await new WaitForBackgroundThread(); + + ArraySegment buffer = new ArraySegment(new byte[8192]); + try + { + while (m_Socket.State == System.Net.WebSockets.WebSocketState.Open) + { + WebSocketReceiveResult result = null; + + using (var ms = new MemoryStream()) + { + do + { + result = await m_Socket.ReceiveAsync(buffer, m_CancellationToken); + ms.Write(buffer.Array, buffer.Offset, result.Count); + } while (!result.EndOfMessage); + + ms.Seek(0, SeekOrigin.Begin); + + if (result.MessageType == WebSocketMessageType.Text) + { + lock (IncomingMessageLock) + { + m_MessageList.Add(ms.ToArray()); + } + + //using (var reader = new StreamReader(ms, Encoding.UTF8)) + //{ + // string message = reader.ReadToEnd(); + // OnMessage?.Invoke(this, new MessageEventArgs(message)); + //} + } + else if (result.MessageType == WebSocketMessageType.Binary) + { + lock (IncomingMessageLock) + { + m_MessageList.Add(ms.ToArray()); + } + } + else if (result.MessageType == WebSocketMessageType.Close) + { + await Close(); + closeCode = WebSocketHelpers.ParseCloseCodeEnum((int)result.CloseStatus); + break; + } + } + } + } + catch (Exception) + { + m_TokenSource.Cancel(); + } + finally + { + await new WaitForUpdate(); + OnClose?.Invoke(closeCode); + } + } + + public async Task Close() + { + if (State == WebSocketState.Open) + { + await m_Socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, m_CancellationToken); + } + } + } +#endif + + /// + /// Factory + /// + /// + /// Class providing static access methods to work with JSLIB WebSocket or WebSocketSharp interface + /// + public static class WebSocketFactory + { +#if UNITY_WEBGL && !UNITY_EDITOR + /* Map of websocket instances */ + public static Dictionary instances = new Dictionary (); + + /* Delegates */ + public delegate void OnOpenCallback (int instanceId); + public delegate void OnMessageCallback (int instanceId, System.IntPtr msgPtr, int msgSize); + public delegate void OnErrorCallback (int instanceId, System.IntPtr errorPtr); + public delegate void OnCloseCallback (int instanceId, int closeCode); + + /* WebSocket JSLIB callback setters and other functions */ + [DllImport ("__Internal")] + public static extern int WebSocketAllocate (string url); + + [DllImport ("__Internal")] + public static extern int WebSocketAddSubProtocol (int instanceId, string subprotocol); + + [DllImport ("__Internal")] + public static extern void WebSocketFree (int instanceId); + + [DllImport ("__Internal")] + public static extern void WebSocketSetOnOpen (OnOpenCallback callback); + + [DllImport ("__Internal")] + public static extern void WebSocketSetOnMessage (OnMessageCallback callback); + + [DllImport ("__Internal")] + public static extern void WebSocketSetOnError (OnErrorCallback callback); + + [DllImport ("__Internal")] + public static extern void WebSocketSetOnClose (OnCloseCallback callback); + + /* If callbacks was initialized and set */ + public static bool isInitialized = false; + + /* + * Initialize WebSocket callbacks to JSLIB + */ + public static void Initialize () { + + WebSocketSetOnOpen (DelegateOnOpenEvent); + WebSocketSetOnMessage (DelegateOnMessageEvent); + WebSocketSetOnError (DelegateOnErrorEvent); + WebSocketSetOnClose (DelegateOnCloseEvent); + + isInitialized = true; + + } + + /// + /// Called when instance is destroyed (by destructor) + /// Method removes instance from map and free it in JSLIB implementation + /// + /// Instance identifier. + public static void HandleInstanceDestroy (int instanceId) { + + instances.Remove (instanceId); + WebSocketFree (instanceId); + + } + + [MonoPInvokeCallback (typeof (OnOpenCallback))] + public static void DelegateOnOpenEvent (int instanceId) { + + WebSocket instanceRef; + + if (instances.TryGetValue (instanceId, out instanceRef)) { + instanceRef.DelegateOnOpenEvent (); + } + + } + + [MonoPInvokeCallback (typeof (OnMessageCallback))] + public static void DelegateOnMessageEvent (int instanceId, System.IntPtr msgPtr, int msgSize) { + + WebSocket instanceRef; + + if (instances.TryGetValue (instanceId, out instanceRef)) { + byte[] msg = new byte[msgSize]; + Marshal.Copy (msgPtr, msg, 0, msgSize); + + instanceRef.DelegateOnMessageEvent (msg); + } + + } + + [MonoPInvokeCallback (typeof (OnErrorCallback))] + public static void DelegateOnErrorEvent (int instanceId, System.IntPtr errorPtr) { + + WebSocket instanceRef; + + if (instances.TryGetValue (instanceId, out instanceRef)) { + + string errorMsg = Marshal.PtrToStringAuto (errorPtr); + instanceRef.DelegateOnErrorEvent (errorMsg); + + } + + } + + [MonoPInvokeCallback (typeof (OnCloseCallback))] + public static void DelegateOnCloseEvent (int instanceId, int closeCode) { + + WebSocket instanceRef; + + if (instances.TryGetValue (instanceId, out instanceRef)) { + instanceRef.DelegateOnCloseEvent (closeCode); + } + + } +#endif + + /// + /// Create WebSocket client instance + /// + /// The WebSocket instance. + /// WebSocket valid URL. + public static WebSocket CreateInstance(string url) + { + return new WebSocket(url); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/WebSocket.jslib b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/WebSocket.jslib new file mode 100644 index 0000000..7fa96ae --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/WebSocket.jslib @@ -0,0 +1,333 @@ + +var LibraryWebSocket = { + $webSocketState: { + /* + * Map of instances + * + * Instance structure: + * { + * url: string, + * ws: WebSocket + * } + */ + instances: {}, + + /* Last instance ID */ + lastId: 0, + + /* Event listeners */ + onOpen: null, + onMesssage: null, + onError: null, + onClose: null, + + /* Debug mode */ + debug: false + }, + + /** + * Set onOpen callback + * + * @param callback Reference to C# static function + */ + WebSocketSetOnOpen: function(callback) { + + webSocketState.onOpen = callback; + + }, + + /** + * Set onMessage callback + * + * @param callback Reference to C# static function + */ + WebSocketSetOnMessage: function(callback) { + + webSocketState.onMessage = callback; + + }, + + /** + * Set onError callback + * + * @param callback Reference to C# static function + */ + WebSocketSetOnError: function(callback) { + + webSocketState.onError = callback; + + }, + + /** + * Set onClose callback + * + * @param callback Reference to C# static function + */ + WebSocketSetOnClose: function(callback) { + + webSocketState.onClose = callback; + + }, + + /** + * Allocate new WebSocket instance struct + * + * @param url Server URL + */ + WebSocketAllocate: function(url) { + + var urlStr = UTF8ToString(url); + var id = webSocketState.lastId++; + + webSocketState.instances[id] = { + subprotocols: [], + url: urlStr, + ws: null + }; + + return id; + + }, + + /** + * Add subprotocol to instance + * + * @param instanceId Instance ID + * @param subprotocol Subprotocol name to add to instance + */ + WebSocketAddSubProtocol: function(instanceId, subprotocol) { + + var subprotocolStr = UTF8ToString(subprotocol); + webSocketState.instances[instanceId].subprotocols.push(subprotocolStr); + + }, + + /** + * Remove reference to WebSocket instance + * + * If socket is not closed function will close it but onClose event will not be emitted because + * this function should be invoked by C# WebSocket destructor. + * + * @param instanceId Instance ID + */ + WebSocketFree: function(instanceId) { + + var instance = webSocketState.instances[instanceId]; + + if (!instance) return 0; + + // Close if not closed + if (instance.ws && instance.ws.readyState < 2) + instance.ws.close(); + + // Remove reference + delete webSocketState.instances[instanceId]; + + return 0; + + }, + + /** + * Connect WebSocket to the server + * + * @param instanceId Instance ID + */ + WebSocketConnect: function(instanceId) { + + var instance = webSocketState.instances[instanceId]; + if (!instance) return -1; + + if (instance.ws !== null) + return -2; + + instance.ws = new WebSocket(instance.url, instance.subprotocols); + + instance.ws.binaryType = 'arraybuffer'; + + instance.ws.onopen = function() { + + if (webSocketState.debug) + console.log("[JSLIB WebSocket] Connected."); + + if (webSocketState.onOpen) + Module.dynCall_vi(webSocketState.onOpen, instanceId); + + }; + + instance.ws.onmessage = function(ev) { + + if (webSocketState.debug) + console.log("[JSLIB WebSocket] Received message:", ev.data); + + if (webSocketState.onMessage === null) + return; + + if (ev.data instanceof ArrayBuffer) { + + var dataBuffer = new Uint8Array(ev.data); + + var buffer = _malloc(dataBuffer.length); + HEAPU8.set(dataBuffer, buffer); + + try { + Module.dynCall_viii(webSocketState.onMessage, instanceId, buffer, dataBuffer.length); + } finally { + _free(buffer); + } + + } else { + var dataBuffer = (new TextEncoder()).encode(ev.data); + + var buffer = _malloc(dataBuffer.length); + HEAPU8.set(dataBuffer, buffer); + + try { + Module.dynCall_viii(webSocketState.onMessage, instanceId, buffer, dataBuffer.length); + } finally { + _free(buffer); + } + + } + + }; + + instance.ws.onerror = function(ev) { + + if (webSocketState.debug) + console.log("[JSLIB WebSocket] Error occured."); + + if (webSocketState.onError) { + + var msg = "WebSocket error."; + var length = lengthBytesUTF8(msg) + 1; + var buffer = _malloc(length); + stringToUTF8(msg, buffer, length); + + try { + Module.dynCall_vii(webSocketState.onError, instanceId, buffer); + } finally { + _free(buffer); + } + + } + + }; + + instance.ws.onclose = function(ev) { + + if (webSocketState.debug) + console.log("[JSLIB WebSocket] Closed."); + + if (webSocketState.onClose) + Module.dynCall_vii(webSocketState.onClose, instanceId, ev.code); + + delete instance.ws; + + }; + + return 0; + + }, + + /** + * Close WebSocket connection + * + * @param instanceId Instance ID + * @param code Close status code + * @param reasonPtr Pointer to reason string + */ + WebSocketClose: function(instanceId, code, reasonPtr) { + + var instance = webSocketState.instances[instanceId]; + if (!instance) return -1; + + if (!instance.ws) + return -3; + + if (instance.ws.readyState === 2) + return -4; + + if (instance.ws.readyState === 3) + return -5; + + var reason = ( reasonPtr ? UTF8ToString(reasonPtr) : undefined ); + + try { + instance.ws.close(code, reason); + } catch(err) { + return -7; + } + + return 0; + + }, + + /** + * Send message over WebSocket + * + * @param instanceId Instance ID + * @param bufferPtr Pointer to the message buffer + * @param length Length of the message in the buffer + */ + WebSocketSend: function(instanceId, bufferPtr, length) { + + var instance = webSocketState.instances[instanceId]; + if (!instance) return -1; + + if (!instance.ws) + return -3; + + if (instance.ws.readyState !== 1) + return -6; + + instance.ws.send(HEAPU8.buffer.slice(bufferPtr, bufferPtr + length)); + + return 0; + + }, + + /** + * Send text message over WebSocket + * + * @param instanceId Instance ID + * @param bufferPtr Pointer to the message buffer + * @param length Length of the message in the buffer + */ + WebSocketSendText: function(instanceId, message) { + + var instance = webSocketState.instances[instanceId]; + if (!instance) return -1; + + if (!instance.ws) + return -3; + + if (instance.ws.readyState !== 1) + return -6; + + instance.ws.send(UTF8ToString(message)); + + return 0; + + }, + + /** + * Return WebSocket readyState + * + * @param instanceId Instance ID + */ + WebSocketGetState: function(instanceId) { + + var instance = webSocketState.instances[instanceId]; + if (!instance) return -1; + + if (instance.ws) + return instance.ws.readyState; + else + return 3; + + } + +}; + +autoAddDeps(LibraryWebSocket, '$webSocketState'); +mergeInto(LibraryManager.library, LibraryWebSocket); diff --git a/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/endel.nativewebsocket.asmdef b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/endel.nativewebsocket.asmdef new file mode 100644 index 0000000..9d477f8 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/WebSocket/endel.nativewebsocket.asmdef @@ -0,0 +1,3 @@ +{ + "name": "endel.nativewebsocket" +} diff --git a/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/package.json b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/package.json new file mode 100644 index 0000000..9aac1f6 --- /dev/null +++ b/WV2SDK/SGModule/Net/SGModule/com.endel.nativewebsocket/package.json @@ -0,0 +1,32 @@ +{ + "name": "com.endel.nativewebsocket", + "version": "1.1.4", + "description": "WebSocket client for Unity - with no external dependencies (WebGL, Native, Android, iOS, UWP).", + "license": "Apache 2.0", + "repository": { + "type": "git", + "url": "https://github.com/endel/NativeWebSocket.git" + }, + "author": { + "name": "Endel Dreyer", + "email": "endel.dreyer@gmail.com", + "url": "https://github.com/endel/NativeWebSocket" + }, + "keywords": [ + "websocket", + "websockets", + "native websocket", + "native websockets" + ], + "displayName": "Native WebSockets", + "unity": "2019.1", + "dependencies": {}, + "samples": [ + { + "displayName": "Example", + "description": "WebSocket Example", + "path": "Samples~/WebSocketExample" + } + ], + "_fingerprint": "c5101c07762251edc82caad9e8a39d51b1229c31" +} diff --git a/WV2SDK/SGModule/NetKit/README.md b/WV2SDK/SGModule/NetKit/README.md new file mode 100644 index 0000000..36db2aa --- /dev/null +++ b/WV2SDK/SGModule/NetKit/README.md @@ -0,0 +1,62 @@ +# 🧰 NetKit 模块说明 + +`NetKit` 是一个网络接口相关工具模块,涵盖心跳、登录、网络核心、数据打点及数据结构等功能。 + +------ + +## 🚀 快速开始 + +1. **初始化网络组件** + + ```csharp + NetKit.Instance.Init(); + ``` + +2. **执行登录请求** + + ```csharp + LoginKit.Instance.LoginRequest(channel, haveSimCard, (success, loginModel) => { + if (success) { + // 登录成功逻辑 + } else { + // 登录失败逻辑 + } + }); + ``` + +3. **发送事件打点** + + ```csharp + TrackKit.SendEvent(ADEventTrack.Event, ADEventTrack.Property.fail_click); + ``` + +4. **开启心跳** + + ```csharp + HeartbeatKit.Instance.StartHeartbeat(); + ``` + +------ + +## 📦 模块介绍 + +| 模块名 | 功能描述 | +| -------------- | ------------------------------------- | +| `Model` | 📄 请求与响应数据模型定义 | +| `Core/NetKit` | ⚙️ 网络请求核心,管理请求与 Token | +| `Track` | 📊 事件与属性注册及数据打点 | +| `ErrorLogKit` | 🛠️ 异常日志收集及去重上报 | +| `HeartbeatKit` | ❤️ 心跳管理,确保连接持续活跃 | +| `LoginKit` | 🔐 登录请求、认证及状态管理 | +| `NetGmTool` | 🛠️ 本地调试辅助,支持 Token 和状态测试 | + +------ + +## 📖 说明 + +- **NetKit** 负责所有网络通信,自动处理数据加解密和 Token 刷新。 +- **TrackKit** 提供强大的事件打点功能,支持静态及动态事件注册。 +- **ErrorLogKit** 实现错误日志的收集、去重与上传,方便问题排查。 +- **HeartbeatKit** 管理心跳发送,支持应用前后台切换时的状态保存与恢复。 +- **LoginKit** 负责用户登录流程与自动重新认证逻辑。 +- **NetGmTool** 为游戏调试提供实用工具,方便状态和 Token 测试。 \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Model/H5Model.cs b/WV2SDK/SGModule/NetKit/SGModule/Model/H5Model.cs new file mode 100644 index 0000000..daafc2b --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Model/H5Model.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class H5RefreshTimes + { + [JsonProperty("link")] public string Link; + [JsonProperty("times")] public int Times; + } + + public class H5SendClass + { + [JsonProperty("link")] public string Link; + [JsonProperty("type")] public string Type; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Model/LoginModel.cs b/WV2SDK/SGModule/NetKit/SGModule/Model/LoginModel.cs new file mode 100644 index 0000000..48a93a3 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Model/LoginModel.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class LoginModel + { + [JsonProperty("cdn_url")] public string CdnURL; + [JsonProperty("country")] public string Country; + [JsonProperty("debug_log")] public bool DebugLog = true; + [JsonProperty("enwp")] public int Enwp; + [JsonProperty("expires_at")] public long ExpiresAt; + [JsonProperty("invite_code")] public string InviteCode; + [JsonProperty("is_magic")] public bool IsMagic; + [JsonProperty("last_login_time")] public long LastLoginTime; + [JsonProperty("login_time")] public long LoginTime; + [JsonProperty("new_player")] public bool NewPlayer; + [JsonProperty("play_data")] public string PlayData; + [JsonProperty("play_data_ver")] public long PlayDataVer; + [JsonProperty("reg_time")] public long RegTime; + [JsonProperty("setting")] public string Setting; + [JsonProperty("token")] public string Token; + [JsonProperty("uid")] public long Uid; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Model/OrderModel.cs b/WV2SDK/SGModule/NetKit/SGModule/Model/OrderModel.cs new file mode 100644 index 0000000..2612b59 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Model/OrderModel.cs @@ -0,0 +1,36 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class OrderModel + { + } + + public class PayOutUserInfoData + { + [JsonProperty("email")] public string Email; + [JsonProperty("first_name")] public string FirstName; + [JsonProperty("last_name")] public string LastName; + } + + public class PayerData + { + [JsonProperty("amount")] public int Amount; + [JsonProperty("email")] public string Email; + [JsonProperty("name")] public string Name; + [JsonProperty("tel")] public string Tel; + } + + public class OrderData + { + [JsonProperty("code")] public int Code; + [JsonProperty("order_id")] public string OrderID; + [JsonProperty("pay_url")] public string PayURL; + } + + public class OrderState + { + [JsonProperty("order_id")] public string OrderID; + [JsonProperty("status")] public int Status; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Model/RequestLoginData.cs b/WV2SDK/SGModule/NetKit/SGModule/Model/RequestLoginData.cs new file mode 100644 index 0000000..cb9578c --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Model/RequestLoginData.cs @@ -0,0 +1,20 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class RequestLoginData + { + [JsonProperty("device_id")] public string device_id; + [JsonProperty("secret")] public string secret; + [JsonProperty("app_version")] public string app_version; + [JsonProperty("device")] public string device; + [JsonProperty("os_ver")] public string os_ver; + [JsonProperty("pack_name")] public string pack_name; + } + + public class RequestTokenData + { + [JsonProperty("expires_at")] public long ExpiresAt; + [JsonProperty("token")] public string Token; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Model/RequestResultData.cs b/WV2SDK/SGModule/NetKit/SGModule/Model/RequestResultData.cs new file mode 100644 index 0000000..9a0e883 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Model/RequestResultData.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class RequestResultData + { + [JsonProperty("result")] public string Result; + [JsonProperty("type")] public int Type; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Model/RequestSavePlayData.cs b/WV2SDK/SGModule/NetKit/SGModule/Model/RequestSavePlayData.cs new file mode 100644 index 0000000..0c106bf --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Model/RequestSavePlayData.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class RequestSavePlayData + { + [JsonProperty("data")] public string Data; + [JsonProperty("version")] public long Version; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Model/RequestStageData.cs b/WV2SDK/SGModule/NetKit/SGModule/Model/RequestStageData.cs new file mode 100644 index 0000000..f99042b --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Model/RequestStageData.cs @@ -0,0 +1,17 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class RequestStageData + { + [JsonProperty("begin_time")] public int BeginTime; + [JsonProperty("end_time")] public int EndTime; + [JsonProperty("item_costs")] public int[] ItemCosts; + [JsonProperty("item_type")] public int ItemType; + [JsonProperty("layer")] public int Layer; + [JsonProperty("level")] public int Level; + [JsonProperty("pass")] public bool Pass; + [JsonProperty("remove_item")] public int RemoveItem; + [JsonProperty("total_item")] public int TotalItem; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Model/RespDebugData.cs b/WV2SDK/SGModule/NetKit/SGModule/Model/RespDebugData.cs new file mode 100644 index 0000000..d0d48aa --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Model/RespDebugData.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class RespDebugData + { + [JsonProperty("channel")] public string Channel; + [JsonProperty("device")] public string Device; + [JsonProperty("device_id")] public string DeviceID; + [JsonProperty("level")] public string Level; + [JsonProperty("message")] public string Message; + [JsonProperty("network")] public string Network; + [JsonProperty("os_ver")] public string OSVer; + [JsonProperty("pack_name")] public string PackName; + [JsonProperty("stacktrace")] public string Stacktrace; + [JsonProperty("uid")] public long Uid; + [JsonProperty("version")] public string Version; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Model/RespLoginFunnelData.cs b/WV2SDK/SGModule/NetKit/SGModule/Model/RespLoginFunnelData.cs new file mode 100644 index 0000000..a345787 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Model/RespLoginFunnelData.cs @@ -0,0 +1,15 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class RespLoginFunnelData + { + [JsonProperty("device_id")] public string DeviceID; + [JsonProperty("bid")] public string Bid; + [JsonProperty("payload")] public string Payload; + [JsonProperty("trace_id")] public string TraceID; + [JsonProperty("type")] public string Type; + [JsonProperty("uid")] public long Uid; + [JsonProperty("version")] public string Version; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Model/TrackData.cs b/WV2SDK/SGModule/NetKit/SGModule/Model/TrackData.cs new file mode 100644 index 0000000..232a662 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Model/TrackData.cs @@ -0,0 +1,11 @@ +using Newtonsoft.Json; + +namespace Uni2SDK +{ + public class TrackData + { + [JsonProperty("event")] public string Event; + [JsonProperty("n")] public int N; + [JsonProperty("property")] public string Property; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Scripts/Core/NetKit.cs b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Core/NetKit.cs new file mode 100644 index 0000000..5ca31a0 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Core/NetKit.cs @@ -0,0 +1,113 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text; +using UnityEngine.Events; + +namespace Uni2SDK +{ + public class NetKit : NetCore + { + public void Init() + { + Log.NetKit.Info("NetworkKit Init!!!!!"); + } + + protected override string Encrypt(string text, string key) + { + var str = !Uni2SDKManager.Instance._isDebug + ? Base64Kit.Encrypt(Encoding.UTF8.GetBytes(text), key).As() + : text; + Log.NetKit.Info($"NetworkKit Encrypt!!!!! {Uni2SDKManager.Instance._isDebug} \n key== {key} \n data== {text} \n result=={str}"); + return str; + } + + protected override string Decrypt(string text, string key) + { + return !Uni2SDKManager.Instance._isDebug + ? Base64Kit.Decrypt(Base64Kit.UnquoteBytes(Encoding.UTF8.GetBytes(text)), key).As() + : text; + } + + protected override TokenManager.RefreshTokenDelegate RefreshTokenHandler() + { + return onCompleted => PostAsync( + "tokenRefresh", + onCompleted: response => + { + if (response.IsSuccess) + { + var token = response.Data.Token; + var expiresAt = response.Data.ExpiresAt; + onCompleted?.Invoke(token, expiresAt); + } + else + { + onCompleted?.Invoke(null, 0); + } + }); + } + + protected override TokenManager.ReauthenticateDelegate ReauthenticateHandler() + { + return onCompleted => LoginKit.Instance.ReauthenticateOnExpiration(success => + { + if (success) + { + var model = LoginKit.Instance.LoginModel; + onCompleted?.Invoke(model.Token, model.ExpiresAt); + } + else + { + onCompleted?.Invoke(null, 0); + } + }); + } + + + /// + /// Post请求(异步) + /// + /// 请求路径 + /// 请求参数 + /// 请求回调 + /// 是否带Token + /// 额外的请求头 + public new IEnumerator PostAsync(string path, object requestData = null, + UnityAction> onCompleted = null, bool withToken = true, + Dictionary headers = null) + { + return base.PostAsync(path, requestData, onCompleted, withToken, headers); + } + + /// + /// Post请求 + /// + /// 请求路径 + /// 请求参数 + /// 请求回调 + /// 是否带Token + /// 是否使用协程 + /// 额外的请求头 + public void Post(string path, object requestData = null, UnityAction> onCompleted = null, + bool withToken = true, bool useCoroutine = true, Dictionary headers = null) + { + base.Post(path, requestData, onCompleted, withToken, useCoroutine, headers); + } + + /// + /// Post请求(泛型) + /// + /// 请求路径 + /// 请求参数 + /// 请求回调 + /// 是否带Token + /// 是否使用协程 + /// 额外的请求头 + /// 返回数据中Data的类型 + public new void Post(string path, object requestData = null, UnityAction> onCompleted = null, + bool withToken = true, bool useCoroutine = true, Dictionary headers = null) + { + base.Post(path, requestData, onCompleted, withToken, useCoroutine, headers); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/ErrorLogKit.cs b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/ErrorLogKit.cs new file mode 100644 index 0000000..66aaf27 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/ErrorLogKit.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using Uni2SDK; +using UnityEngine; +using UnityEngine.Events; + +namespace Uni2SDK +{ + public static class ErrorLogKit + { + private static readonly Dictionary> _statusDic = new(); + private static bool _isErrorLoggingEnabled = true; + + /// + /// 初始化方法 + /// + /// 是否开启错误日志上报 + public static void Init(bool isErrorLoggingEnabled) + { + _isErrorLoggingEnabled = isErrorLoggingEnabled; + } + + /// + /// 发送错误日志 + /// + /// + /// + /// + public static void Send(string level, string message, string stackTrace) + { + if (!_isErrorLoggingEnabled) + { + return; + } + + // 如果只需要日期部分,可以使用ToShortDateString()或ToString("yyyy-MM-dd")等进行格式化 + var currentDate = DateTime.Now; + var formattedDate = currentDate.ToString("yyyy_MM_dd_HH_mm"); + + var md5Str = MD5Helper.GetStringMD5(message + stackTrace); + + if (!_statusDic.ContainsKey(formattedDate)) + { + _statusDic.Add(formattedDate, new Dictionary()); + } + + if (_statusDic[formattedDate].ContainsKey(md5Str)) + { + return; + } + + _statusDic[formattedDate].Add(md5Str, true); + + SendLogToServer(level, message, stackTrace); + } + + private static void SendLogToServer(string level, string message, string stackTrace, + UnityAction callback = null) + { + var requestData = new RespDebugData + { + Uid = LoginKit.Instance.LoginModel?.Uid ?? -1, + Device = SystemInfo.deviceModel, + OSVer = SystemInfo.operatingSystem, + Network = GetNetworkType(), + DeviceID = DeviceHelper.GetDeviceID(), + PackName = Application.identifier, + Version = Application.version, + Level = level, + Message = message, + Stacktrace = stackTrace + }; + + NetKit.Instance.Post("event/cliDebugLog", requestData, + response => { callback?.Invoke(response.IsSuccess); }, false); + } + + private static string GetNetworkType() + { + return Application.internetReachability switch + { + NetworkReachability.ReachableViaCarrierDataNetwork => "Mobile Data", + NetworkReachability.ReachableViaLocalAreaNetwork => "Wi-Fi", + _ => "Not Connected" + }; + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/HeartbeatKit.cs b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/HeartbeatKit.cs new file mode 100644 index 0000000..0ab5cc8 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/HeartbeatKit.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections; +using SGModule.Common; +using Uni2SDK; +using Uni2SDK; +using Uni2SDK; +using UnityEngine; + +namespace Uni2SDK +{ + public class HeartbeatKit : SingletonMonoBehaviour + { + private Coroutine _heartbeatCoroutine; + private static int HeartbeatInterval => 60; + private const string HeartbeatForegroundTime = "HeartbeatForegroundTime"; + + /// + /// 后台时逻辑 + /// + /// + private void OnApplicationPause(bool pauseStatus) + { + Log.NetKit.Warning($"OnApplication Pause :{pauseStatus}"); + // 应用程序失去焦点 + if (pauseStatus) + { + SaveRemainingHeartbeatTime(); + } + else + { + RestoreNextHeartbeatTime(); + } + } + + // 应用程序退出 + private void OnApplicationQuit() + { + Log.NetKit.Warning("OnApplication Quit"); + + SaveRemainingHeartbeatTime(); + } + + public void StartHeartbeat() + { + _heartbeatCoroutine ??= StartCoroutine(HeartbeatRequestCoroutine()); + } + + private IEnumerator HeartbeatRequestCoroutine() + { + RestoreNextHeartbeatTime(); // 恢复之前剩余时间或默认值 + + while (true) + { + if (Now() >= NextHeartbeatTime) + { + NextHeartbeatTime += HeartbeatInterval; + RequestHeart(); + } + + yield return new WaitForSeconds(1); + } + } + + // 应用程序失去焦点, 保存心跳剩余时间 + private void SaveRemainingHeartbeatTime() + { + var remain = Math.Max((int)(NextHeartbeatTime - Now()), 0); + LastRemainingInterval = remain % HeartbeatInterval; + } + + + // 应用程序获得焦点, 恢复下次心跳时间 + private void RestoreNextHeartbeatTime() + { + var now = Now(); + if (LastRemainingInterval < 0) + { + NextHeartbeatTime = now; + return; + } + + var remain = LastRemainingInterval % HeartbeatInterval; + if (remain <= 0) + { + remain = HeartbeatInterval; + } + + NextHeartbeatTime = now + remain; + } + + private long _nextHeartbeatTime; + + private long NextHeartbeatTime + { + get + { + if (_nextHeartbeatTime <= 0) + { + _nextHeartbeatTime = Now() + HeartbeatInterval; + } + + return _nextHeartbeatTime; + } + set + { + var now = Now(); + if (value <= now) + { + value = now + HeartbeatInterval; + } + + _nextHeartbeatTime = value; + } + } + + private int? _lastRemainingInterval; + + private int LastRemainingInterval + { + get + { + if (_lastRemainingInterval != null) + { + return _lastRemainingInterval.Value; + } + + _lastRemainingInterval = PlayerPrefs.GetInt(HeartbeatForegroundTime, -1); + + return _lastRemainingInterval.Value; + } + set + { + _lastRemainingInterval = value; + PlayerPrefs.SetInt(HeartbeatForegroundTime, value); + } + } + + + private void RequestHeart() + { + NetKit.Instance.Post("user/health"); + } + + private static long Now() + { + return DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/LoginKit.cs b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/LoginKit.cs new file mode 100644 index 0000000..6ebe36f --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/LoginKit.cs @@ -0,0 +1,114 @@ +using System.Collections; +using UnityEngine; +using UnityEngine.Events; + +namespace Uni2SDK +{ + public class LoginKit : SingletonMonoBehaviour + { + private string _channel; + private bool _sim; + private bool _loginSuccess; + private LoginModel _loginModel; + private bool _isFirstLoginSuccess = true; + private RequestLoginData _requestLoginData; + private string _packName; + + + public string Channel => _channel; + + public void LoginRequest(string channel, bool haveSimCard, UnityAction onCompleted) + { + _packName = Uni2SDKManager.Instance.GetPackageNow(); + _channel = string.IsNullOrEmpty(channel) ? "organic" : channel; + _sim = haveSimCard; + + _requestLoginData = new RequestLoginData + { + device_id = DeviceHelper.GetDeviceID(), + secret = NetworkManager.GetSecret(), + app_version = Application.version, + device = SystemInfo.deviceModel, + os_ver = SystemInfo.operatingSystem, + pack_name = _packName, + }; + + StartCoroutine(LoginCoroutine(_requestLoginData, onCompleted)); + } + + public IEnumerator ReauthenticateOnExpiration(UnityAction onCompleted) + { + if (_requestLoginData == null) + { + Log.NetKit.Error("登录数据为空,重新登录失败"); + onCompleted?.Invoke(false); + yield break; + } + + yield return LoginCoroutine(_requestLoginData, (isSuccess, _) => { onCompleted?.Invoke(isSuccess); }); + } + + private IEnumerator LoginCoroutine(RequestLoginData reqData, UnityAction onCompleted) + { + const int maxRetry = 5; + for (var attempt = 0; attempt < maxRetry; attempt++) + { + if (attempt > 0) + { + Log.NetKit.Warning($"登录失败,重试第 {attempt} 次..."); + yield return new WaitForSeconds(5f); + } + + yield return DoLoginRequest(reqData); + + if (_loginSuccess) + { + OnLoginSuccess(); + onCompleted?.Invoke(true, _loginModel); + yield break; + } + } + + Log.NetKit.Error("登录最终失败"); + onCompleted?.Invoke(false, null); + } + + private IEnumerator DoLoginRequest(RequestLoginData reqData) + { + yield return NetKit.Instance.PostAsync( + "login", + reqData, + response => + { + _loginSuccess = response.IsSuccess; + _loginModel = response.Data; + }, + withToken: false + ); + } + + private void OnLoginSuccess() + { + Log.NetKit.Info("登录成功,处理登录后逻辑"); + + ServerClock.Init(_loginModel.LoginTime); + + TokenManager.Instance.UpdateTokenCache(_loginModel.Token, _loginModel.ExpiresAt); + + ErrorLogKit.Init(_loginModel.DebugLog); + + + // 开始心跳 + HeartbeatKit.Instance.StartHeartbeat(); + + + StartCoroutine(TrackKit.NoSentTrackProcessing()); // 处理堆积的打点数据 + } + + + public LoginModel LoginModel => _loginModel; + + + public bool LoginSuccess => _loginSuccess; + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/NetGmTool.cs b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/NetGmTool.cs new file mode 100644 index 0000000..0910782 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/NetGmTool.cs @@ -0,0 +1,51 @@ +namespace Uni2SDK +{ + public class NetGmTool : SingletonMonoBehaviour + { + public void Init() + { + GMTool.Instance.AddItem(new GMToolItem(GUIType.Separator, () => "网络模块")); + GMTool.Instance.AddItem( + new GMToolItem(GUIType.Label, () => $"当前网络状态:{NetChecker.Instance.GetConnectionStatus()}")); + GMTool.Instance.AddItem(new GMToolItem(GUIType.Label, + () => + $"loginModel uid:{(LoginKit.Instance.LoginModel == null ? "null" : LoginKit.Instance.LoginModel.Uid)}")); + GMTool.Instance.AddItem(new GMToolItem(GUIType.Label, + () => + $"Token过期时间:{(LoginKit.Instance.LoginModel == null ? "null" : TimeHelper.ConvertToLocalTime(LoginKit.Instance.LoginModel.ExpiresAt))}")); + + GMTool.Instance.AddItem(new GMToolItem(GUIType.Label, + () => + { + var str = ""; + foreach (var record in TokenManager.Instance.GetTokenRecord()) + { + str += $"Token: {record} " + "\n"; + } + + return str; + }) + ); + GMTool.Instance.AddItem(new GMToolItem(GUIType.Button, () => "Token刷新测试", + s => { VerifyTokenExpiryImminent(); })); + GMTool.Instance.AddItem(new GMToolItem(GUIType.Button, () => "Token过期测试", + s => { VerifyTokenExpirationBehavior(); })); + } + + /// + /// Token即将过期(测试功能用) + /// + public void VerifyTokenExpiryImminent() + { + LoginKit.Instance.LoginModel.ExpiresAt -= 85400; + } + + /// + /// token过期(测试功能用) + /// + public void VerifyTokenExpirationBehavior() + { + LoginKit.Instance.LoginModel.ExpiresAt -= 86400; + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackEvent.cs b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackEvent.cs new file mode 100644 index 0000000..983f070 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackEvent.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; +using System.Linq; +using Uni2SDK; + +namespace Uni2SDK +{ + public static class TrackEvent + { + private static readonly HashSet _registeredStaticEvents = new(); + private static readonly HashSet _registeredDynamicEventPrefixes = new(); + + + public static string Register(string eventKey, bool isDynamic = false) + { + var targetSet = isDynamic ? _registeredDynamicEventPrefixes : _registeredStaticEvents; + + if (!targetSet.Add(eventKey)) + { + var type = isDynamic ? "动态" : "静态"; + Log.NetKit.Error($"[Track] 重复的{type} Event 注册: {eventKey}"); + } + + return eventKey; + } + + + /// + /// 是否为注册的静态 property(完全匹配) + /// + private static bool ContainsExact(string eventKey) + { + return _registeredStaticEvents.Contains(eventKey); + } + + /// + /// 是否匹配任何已注册的动态前缀 + /// + private static bool ContainsDynamic(string eventKey) + { + return _registeredDynamicEventPrefixes.Any(eventKey.StartsWith); + } + + /// + /// 检查是否存在(静态或动态) + /// + public static bool Contains(string eventKey) + { + return ContainsExact(eventKey) || ContainsDynamic(eventKey); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackKit.cs b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackKit.cs new file mode 100644 index 0000000..a7372ca --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackKit.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Threading.Tasks; +using SGModule.Common; +using Uni2SDK; +using Uni2SDK; +using UnityEngine; +using UnityEngine.Events; + +namespace Uni2SDK +{ + public static class TrackKit + { + private static string _traceID; + private static readonly Dictionary _statusDic = new(); + + //登录前的打点数据,没有token无法正确发送,登录成功后重新发一遍 + private static readonly Queue _waitLoginSuccessTrackQueue = new(); + + private static void PostTrack(TrackData trackData, UnityAction callback = null) + { + if (!LoginKit.Instance.LoginSuccess) + { + _waitLoginSuccessTrackQueue.Enqueue(trackData); + return; + } + + NetKit.Instance.Post("/event/incrN", trackData, + response => { callback?.Invoke(response.IsSuccess, response.Data); }); + } + + /// + /// 发送未发送的打点数据 + /// + /// + public static IEnumerator NoSentTrackProcessing() + { + //处理未发送的打点数据 + while (_waitLoginSuccessTrackQueue.Count > 0) + { + var trackData = _waitLoginSuccessTrackQueue.Dequeue(); + PostTrack(trackData); + + yield return new WaitForSeconds(1f); + } + + _waitLoginSuccessTrackQueue.Clear(); + } + + + public static void SendEvent(string @event, string property = "", int n = 1) + { + // 检查Key是否注册 + if (!TrackEvent.Contains(@event)) + { + Log.NetKit.Warning($"Not found event key: {@event}"); + return; + } + + if (!TrackProperty.Contains(property)) + { + Log.NetKit.Warning($"Not found property key: {property}"); + return; + } + + var data = new TrackData { Event = @event, Property = property, N = n }; + + Log.NetKit.Info($"Sending track {data.Event} | {data.Property} | {data.N}"); + + PostTrack(data); + } + + + #region 登录漏斗 + + private static readonly Dictionary _loginFunnelEventMap = new() + { + { LoginFunnelEventType.Bootstrap, "bootstrap" }, + { LoginFunnelEventType.LoginSend, "loginSend" }, + { LoginFunnelEventType.LoginRecv, "loginRecv" }, + { LoginFunnelEventType.LoadBegin, "loadBegin" }, + { LoginFunnelEventType.LoadFinish, "loadFinish" }, + { LoginFunnelEventType.CoreInitBegin, "coreInitBegin" }, + { LoginFunnelEventType.CoreInitFinish, "coreInitFinish" }, + { LoginFunnelEventType.AllReady, "allReady" }, + }; + + private static readonly Queue<(LoginFunnelEventType eventType, string message)> _loginFunnelQueue = new(); + + private static readonly object _queueLock = new(); + + private static IEnumerator ProcessQueueCoroutine() + { + while (true) + { + (LoginFunnelEventType eventType, string message) item; + lock (_queueLock) + { + if (_loginFunnelQueue.Count == 0) + { + _isProcessing = false; + yield break; + } + + item = _loginFunnelQueue.Dequeue(); + } + + if (!_loginFunnelEventMap.TryGetValue(item.eventType, out var trackName)) + { + throw new ArgumentOutOfRangeException(nameof(item.eventType), item.eventType, null); + } + + if (_statusDic.TryGetValue(trackName, out var status)) + { + if (status) + { + continue; + } + } + + _statusDic[trackName] = true; + + // 发起打点请求 + bool isDone = false; + PostFunnelLogin(trackName, item.message, () => isDone = true); + + // 等待请求完成 + yield return new WaitUntil(() => isDone); + + // 控制请求间隔 + // yield return new WaitForSeconds(0.1f); // 可根据需求调整 + } + } + + private static bool _isProcessing = false; + + public static void TrackLoginFunnel(LoginFunnelEventType loginFunnelEventType, string message = "") + { + lock (_queueLock) + { + _loginFunnelQueue.Enqueue((loginFunnelEventType, message)); + } + + if (!_isProcessing) + { + _isProcessing = true; + SugarAsyKit.StartCoroutine(ProcessQueueCoroutine()); + } + } + + private static void PostFunnelLogin(string type, string payload, UnityAction callback = null) + { + if (type == "bootstrap") + { + var timestamp = DateTime.Now.ToUniversalTime().Ticks - 621355968000000000; + _traceID = timestamp.ToString(); + } + + var requestData = new RespLoginFunnelData + { + Uid = LoginKit.Instance.LoginModel?.Uid ?? -1, + TraceID = _traceID, + DeviceID = DeviceHelper.GetDeviceID(), + Bid = Uni2SDKManager.Instance.GetPackageNow(), + Version = Application.version, + Type = type, + Payload = payload + }; + + NetKit.Instance.Post("event/funnelLogin", requestData, response => + { + callback?.Invoke(); + },false); + } + + #endregion + } + + public enum LoginFunnelEventType + { + Bootstrap, + LoginSend, + LoginRecv, + LoadBegin, + LoadFinish, + CoreInitBegin, + CoreInitFinish, + AllReady, + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackProperty.cs b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackProperty.cs new file mode 100644 index 0000000..16df996 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Scripts/Kits/Track/TrackProperty.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Linq; +using Uni2SDK; + +namespace Uni2SDK +{ + public static class TrackProperty + { + private static readonly HashSet _registeredStaticProperties = new(); + private static readonly HashSet _registeredDynamicPropertyPrefixes = new(); + + public static string Register(string propertyKey, bool isDynamic = false) + { + var targetSet = isDynamic ? _registeredDynamicPropertyPrefixes : _registeredStaticProperties; + + if (!targetSet.Add(propertyKey)) + { + var type = isDynamic ? "动态" : "静态"; + Log.NetKit.Error($"[Track] 重复的{type} Property 注册: {propertyKey}"); + } + + return propertyKey; + } + + + /// + /// 是否为注册的静态 property(完全匹配) + /// + private static bool ContainsExact(string propertyKey) + { + return _registeredStaticProperties.Contains(propertyKey); + } + + /// + /// 是否匹配任何已注册的动态前缀 + /// + private static bool ContainsDynamic(string propertyKey) + { + return _registeredDynamicPropertyPrefixes.Any(propertyKey.StartsWith); + } + + /// + /// 检查是否存在(静态或动态) + /// + public static bool Contains(string propertyKey) + { + return ContainsExact(propertyKey) || ContainsDynamic(propertyKey); + } + } +} \ No newline at end of file diff --git a/WV2SDK/SGModule/NetKit/SGModule/Scripts/NetApi.cs b/WV2SDK/SGModule/NetKit/SGModule/Scripts/NetApi.cs new file mode 100644 index 0000000..6962915 --- /dev/null +++ b/WV2SDK/SGModule/NetKit/SGModule/Scripts/NetApi.cs @@ -0,0 +1,141 @@ +using Uni2SDK; +using UnityEngine.Events; + +namespace Uni2SDK +{ + public static class NetApi + { + #region 玩家数据 + + public static void RequestPlayerData(UnityAction onCompleted) + { + NetKit.Instance.Post("user/userData", + onCompleted: response => { onCompleted?.Invoke(response.IsSuccess, response.Data); }); + } + + /// + /// 立即发送请求更新用户数据 + /// + /// + /// + public static void UploadPlayerDataUpdate(long version, string data) + { + var requestSavePlayData = new RequestSavePlayData + { + Version = version, + Data = data + }; + NetKit.Instance.Post("user/updateData", requestSavePlayData, useCoroutine: false); + } + + + /// + /// 启动协程更新用户数据 + /// + /// + /// + /// + public static void UploadPlayerDataUpdate(long version, string data, UnityAction onCompleted) + { + var requestSavePlayData = new RequestSavePlayData + { + Version = version, + Data = data + }; + NetKit.Instance.Post("user/updateData", requestSavePlayData, + response => { onCompleted?.Invoke(response.IsSuccess); }); + } + + public static void DeltaUpdateData(long version, string data, UnityAction onCompleted) + { + var requestSavePlayData = new RequestSavePlayData + { + Version = version, + Data = data + }; + NetKit.Instance.Post("user/deltaUpdateData", requestSavePlayData, + response => { onCompleted?.Invoke(response.IsSuccess); }); + } + + #endregion + + + #region Pay + + public static void PixPayIn(string account, string phone, string email, int amount, + UnityAction onCompleted = null) + { + var data = new PayerData + { + Name = account, + Tel = phone, + Email = email, + Amount = amount + }; + + NetKit.Instance.Post("shop/pixPayIn", data, + response => { onCompleted?.Invoke(response.IsSuccess, response.Data); }); + } + + public static void PixPayOrderQuery(string orderID, UnityAction onCompleted = null) + { + var data = new OrderData + { + OrderID = orderID + }; + + NetKit.Instance.Post("shop/pixPayOrderQuery", data, + response => { onCompleted?.Invoke(response.IsSuccess, response.Data); }); + } + + public static void PayOutUserInfo(string email, string firstName, string lastName, + UnityAction onCompleted = null) + { + var data = new PayOutUserInfoData + { + Email = email, + FirstName = firstName, + LastName = lastName + }; + + NetKit.Instance.Post("shop/payOutUserInfo", data, + response => { onCompleted?.Invoke(response.IsSuccess, response.Data); }); + } + + #endregion + + + #region H5 + + public static void H5RefreshTimes(string link, string type, UnityAction onCompleted = null) + { + var info = new H5SendClass + { + Link = link, + Type = type + }; + NetKit.Instance.Post("event/h5Impressions", info, + response => { onCompleted?.Invoke(response.IsSuccess, response.Data); }); + } + + #endregion + + + #region 结算上传 + + public static void SettleUp(int gameType, RequestStageData stageData, UnityAction onCompleted = null) + { + var requestJson = SerializeHelper.ToJsonIndented(stageData); + var reqData = new RequestResultData + { + Type = gameType, + Result = requestJson + }; + + NetKit.Instance.Post("game/settleUp", reqData, + response => { onCompleted?.Invoke(response.IsSuccess); }); + } + + #endregion + } +} \ No newline at end of file diff --git a/WV2SDK/Singleton/ISingleton.cs b/WV2SDK/Singleton/ISingleton.cs new file mode 100644 index 0000000..ddc3779 --- /dev/null +++ b/WV2SDK/Singleton/ISingleton.cs @@ -0,0 +1,7 @@ +namespace Uni2SDK +{ + internal interface ISingleton + { + void OnSingletonInit(); + } +} \ No newline at end of file diff --git a/WV2SDK/Singleton/Singleton.cs b/WV2SDK/Singleton/Singleton.cs new file mode 100644 index 0000000..fd70b7d --- /dev/null +++ b/WV2SDK/Singleton/Singleton.cs @@ -0,0 +1,34 @@ +using System; + +namespace Uni2SDK +{ + internal class Singleton : ISingleton, IDisposable where T : Singleton, new() + { + private static T mInstance; + + private static readonly object LockObject = new(); + + public static T Instance + { + get + { + lock (LockObject) + { + mInstance ??= new T(); + mInstance.OnSingletonInit(); + } + + return mInstance; + } + } + + public virtual void Dispose() + { + mInstance = null; + } + + public void OnSingletonInit() + { + } + } +} \ No newline at end of file diff --git a/WV2SDK/Singleton/SingletonUnity.cs b/WV2SDK/Singleton/SingletonUnity.cs new file mode 100644 index 0000000..5f413ad --- /dev/null +++ b/WV2SDK/Singleton/SingletonUnity.cs @@ -0,0 +1,100 @@ +using UnityEngine; + +namespace Uni2SDK +{ + internal abstract class SingletonUnity : MonoBehaviour, ISingleton where T : SingletonUnity + { + private static T mInstance; + + public static T Instance + { + get + { + if (mInstance != null) + { + return mInstance; + } + + if (ApplicationIsQuitting) + { + return null; + } + + GameObject instanceGO = new GameObject(typeof(T).Name); + mInstance = instanceGO.AddComponent(); + SetSelfParentRoot(instanceGO, mInstance.ParentRootName); + mInstance.OnSingletonInit(); + return mInstance; + } + } + + private static bool ApplicationIsQuitting; + protected virtual string ParentRootName { get; private set; } + + private static void SetSelfParentRoot(GameObject go, string parentRootName) + { + if (!AppObjConst.EngineSingletonGo) return; + + if (parentRootName == null) + { + go.transform.SetParent(AppObjConst.EngineSingletonGo.transform, false); + } + else + { + Transform sinleonRoot = AppObjConst.EngineSingletonGo.transform; + Transform rootTF = sinleonRoot.Find(parentRootName); + if (rootTF == null) + { + GameObject rootGo = new GameObject(parentRootName); + switch (parentRootName) + { + case AppObjConst.MonoManagerGoName: + AppObjConst.MonoManagerGo = rootGo; + break; + case AppObjConst.DispatcherGoName: + AppObjConst.DispatcherGo = rootGo; + break; + case AppObjConst.LoaderGoName: + AppObjConst.LoaderGo = rootGo; + break; + } + + rootTF = rootGo.transform; + rootTF.transform.SetParent(sinleonRoot, false); + } + + go.transform.SetParent(rootTF.transform, false); + } + } + + protected virtual void New() + { + } + + public virtual void Dispose() + { + mInstance = null; + } + + protected virtual void OnDestroy() + { + mInstance = null; + } + + private void OnApplicationQuit() + { + ApplicationIsQuitting = true; + if (mInstance == null) + { + return; + } + + Destroy(mInstance.gameObject); + } + + public void OnSingletonInit() + { + mInstance.New(); + } + } +} \ No newline at end of file diff --git a/WV2SDK/ToolKit/Base64EncodeUtil.cs b/WV2SDK/ToolKit/Base64EncodeUtil.cs new file mode 100644 index 0000000..e88a716 --- /dev/null +++ b/WV2SDK/ToolKit/Base64EncodeUtil.cs @@ -0,0 +1,32 @@ +using System; +using System.Text; + +namespace FutureCore +{ + internal static class Base64EncodeUtil + { + public static string Base64Encode(string source) + { + return Base64Encode(Encoding.UTF8, source); + } + + public static string Base64Decode(string result) + { + return Base64Decode(Encoding.UTF8, result); + } + + public static string Base64Encode(Encoding encoding, string source) + { + byte[] bytes = encoding.GetBytes(source); + string encode = Convert.ToBase64String(bytes); + return encode; + } + + public static string Base64Decode(Encoding encoding, string result) + { + byte[] bytes = Convert.FromBase64String(result); + string decode = encoding.GetString(bytes); + return decode; + } + } +} \ No newline at end of file diff --git a/WV2SDK/ToolKit/Base64Kit.cs b/WV2SDK/ToolKit/Base64Kit.cs new file mode 100644 index 0000000..533b196 --- /dev/null +++ b/WV2SDK/ToolKit/Base64Kit.cs @@ -0,0 +1,95 @@ +using System; +using System.Linq; +using System.Text; +using FutureCore; +using Uni2SDK; +using System.Security.Cryptography; + +internal class Base64Kit +{ + private static byte[] GenerateKey(string secret) + { + using var sha256 = SHA256.Create(); + return sha256.ComputeHash(Encoding.UTF8.GetBytes(secret)); + } + + internal static byte[] Encrypt(byte[] plainText, string secret) + { + if (plainText == null || plainText.Length == 0) return plainText; + var key = GenerateKey(secret); + using var aes = Aes.Create(); + aes.Key = key; + aes.Mode = CipherMode.CBC; + aes.Padding = PaddingMode.None; + aes.GenerateIV(); + var iv = aes.IV; + var blockSize = aes.BlockSize / 8; + var padding = blockSize - plainText.Length % blockSize; + var padded = new byte[plainText.Length + padding]; + Buffer.BlockCopy(plainText, 0, padded, 0, plainText.Length); + for (var i = plainText.Length; i < padded.Length; i++) padded[i] = (byte)padding; + using var encryptor = aes.CreateEncryptor(); + var encrypted = encryptor.TransformFinalBlock(padded, 0, padded.Length); + var result = new byte[iv.Length + encrypted.Length]; + Buffer.BlockCopy(iv, 0, result, 0, iv.Length); + Buffer.BlockCopy(encrypted, 0, result, iv.Length, encrypted.Length); + return ToUrlSafeBase64(result); + } + + internal static byte[] Decrypt(byte[] encryptedBase64, string secret) + { + if (encryptedBase64 == null || encryptedBase64.Length == 0) return encryptedBase64; + var key = GenerateKey(secret); + var fullCipher = FromUrlSafeBase64(encryptedBase64); + if (fullCipher.Length < 16) throw new Exception("Invalid cipher data"); + var iv = fullCipher.Take(16).ToArray(); + var cipherText = fullCipher.Skip(16).ToArray(); + using var aes = Aes.Create(); + aes.Key = key; + aes.IV = iv; + aes.Mode = CipherMode.CBC; + aes.Padding = PaddingMode.None; + using var decryptor = aes.CreateDecryptor(); + var decrypted = decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length); + int pad = decrypted[^1]; + if (pad <= 0 || pad > decrypted.Length) throw new Exception("Invalid padding"); + var result = decrypted.Take(decrypted.Length - pad).ToArray(); + return result; + } + + // 用双引号包裹字节数组 + private static byte[] QuoteBytes(byte[] input) + { + var result = new byte[input.Length + 2]; + result[0] = (byte)'"'; + Buffer.BlockCopy(input, 0, result, 1, input.Length); + result[result.Length - 1] = (byte)'"'; + return result; + } + + // 去除双引号(如果存在) + internal static byte[] UnquoteBytes(byte[] input) + { + if (input.Length >= 2 && input[0] == (byte)'"' && input[input.Length - 1] == (byte)'"') + { + var result = new byte[input.Length - 2]; + Buffer.BlockCopy(input, 1, result, 0, result.Length); + return result; + } + + return input; + } + + private static byte[] ToUrlSafeBase64(byte[] data) + { + var base64 = Convert.ToBase64String(data); + var urlSafe = base64.Replace('+', '-').Replace('/', '_'); + return Encoding.UTF8.GetBytes(urlSafe); + } + + private static byte[] FromUrlSafeBase64(byte[] urlSafe) + { + var base64 = Encoding.UTF8.GetString(urlSafe).Replace('-', '+').Replace('_', '/'); + return Convert.FromBase64String(base64); + } +} \ No newline at end of file diff --git a/WV2SDK/ToolKit/EventKit.cs b/WV2SDK/ToolKit/EventKit.cs new file mode 100644 index 0000000..f8c6194 --- /dev/null +++ b/WV2SDK/ToolKit/EventKit.cs @@ -0,0 +1,24 @@ +// using UnityEngine.EventSystems; +// +// namespace Uni2SDK +// { +// internal static class EventKit +// { +// public static void Set2DRaycasterEnabled(Physics2DRaycaster com, bool enabled) +// { +// if (com.enabled != enabled) +// { +// com.enabled = enabled; +// } +// } +// +// public static void Set3DRaycasterEnabled(PhysicsRaycaster com, bool enabled) +// { +// if (com.enabled != enabled) +// { +// com.enabled = enabled; +// } +// } +// } +// } + diff --git a/WV2SDK/ToolKit/GameObjectExtend.cs b/WV2SDK/ToolKit/GameObjectExtend.cs new file mode 100644 index 0000000..e705363 --- /dev/null +++ b/WV2SDK/ToolKit/GameObjectExtend.cs @@ -0,0 +1,24 @@ +using UnityEngine; + +namespace Uni2SDK +{ + internal static class GameObjectExtend + { + public static void SetParent(this GameObject gameObject, GameObject parentGo, bool worldPositionStays = false) + { + if (parentGo) + { + gameObject.transform.SetParent(parentGo.transform, worldPositionStays); + } + } + + public static void SetLayer(this GameObject gameObject, string layerName) + { + Transform[] transArr = gameObject.transform.GetComponentsInChildren(); + for (int i = 0; i < transArr.Length; i++) + { + transArr[i].gameObject.layer = LayerMask.NameToLayer(layerName); + } + } + } +} \ No newline at end of file diff --git a/WV2SDK/ToolKit/GeneralKit.cs b/WV2SDK/ToolKit/GeneralKit.cs new file mode 100644 index 0000000..a4b9e54 --- /dev/null +++ b/WV2SDK/ToolKit/GeneralKit.cs @@ -0,0 +1,25 @@ +using UObject = UnityEngine.Object; + +namespace Uni2SDK +{ + internal static class GeneralKit + { + #region Engine + + public static T Instantiate(T original) where T : UObject + { + T obj = UObject.Instantiate(original); + return obj; + } + + public static void Destroy(UObject obj) + { + if (obj) + { + UObject.Destroy(obj); + } + } + + #endregion + } +} \ No newline at end of file diff --git a/WV2SDK/ToolKit/LogKit.cs b/WV2SDK/ToolKit/LogKit.cs new file mode 100644 index 0000000..098d5bf --- /dev/null +++ b/WV2SDK/ToolKit/LogKit.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +namespace Uni2SDK; + +public static class LogKit +{ + // 是否启用日志打印,默认 true,发布时设为 false 即可关闭 + public static bool EnableLog = Uni2SDKManager.Instance._isLog; + + // [System.Diagnostics.Conditional("UNITY_EDITOR"), System.Diagnostics.Conditional("DEVELOPMENT_BUILD")] + public static void Log(object message) + { + if (EnableLog) + Debug.Log(message); + } + + // [System.Diagnostics.Conditional("UNITY_EDITOR"), System.Diagnostics.Conditional("DEVELOPMENT_BUILD")] + public static void LogWarning(object message) + { + if (EnableLog) + Debug.LogWarning(message); + } + + // [System.Diagnostics.Conditional("UNITY_EDITOR"), System.Diagnostics.Conditional("DEVELOPMENT_BUILD")] + public static void LogError(object message) + { + if (EnableLog) + Debug.LogError(message); + } +} \ No newline at end of file diff --git a/WV2SDK/ToolKit/MD5Kit.cs b/WV2SDK/ToolKit/MD5Kit.cs new file mode 100644 index 0000000..cbf2597 --- /dev/null +++ b/WV2SDK/ToolKit/MD5Kit.cs @@ -0,0 +1,74 @@ +using System; +using System.IO; +using System.Text; +using System.Security.Cryptography; + +namespace Uni2SDK +{ + internal class MD5Kit + { + public static string GetFileMD5(string file) + { + try + { + var fs = new FileStream(file, FileMode.Open); + MD5 md5 = new MD5CryptoServiceProvider(); + var retVal = md5.ComputeHash(fs); + fs.Close(); + + var sb = new StringBuilder(); + foreach (var str in retVal) + { + sb.Append(str.ToString("X2")); + } + + return sb.ToString(); + } + catch (Exception ex) + { + throw new Exception("GetFileMD5 fail error: " + ex.Message); + } + } + + /// + /// 获取字符串的MD5值 + /// + public static string GetStringMD5(string str) + { + if (string.IsNullOrEmpty(str)) + { + return null; + } + + MD5 md5 = new MD5CryptoServiceProvider(); + byte[] bytResult = md5.ComputeHash(Encoding.UTF8.GetBytes(str)); + string strResult = BitConverter.ToString(bytResult); + strResult = strResult.Replace("-", string.Empty); + return strResult; + } + + + public static string MD5String1(string text) + { + var buffer = Encoding.Default.GetBytes(text); + var check = new MD5CryptoServiceProvider(); + var somme = check.ComputeHash(buffer); + var result = new StringBuilder(); + foreach (var a in somme) + { + var value = a.ToString("X"); + if (a < 16) + { + result.Append(0); + result.Append(value); + } + else + { + result.Append(value); + } + } + + return result.ToString().ToLower(); + } + } +} \ No newline at end of file diff --git a/WV2SDK/ToolKit/SerializeUtil.cs b/WV2SDK/ToolKit/SerializeUtil.cs new file mode 100644 index 0000000..8833d9f --- /dev/null +++ b/WV2SDK/ToolKit/SerializeUtil.cs @@ -0,0 +1,49 @@ +using System; +using Newtonsoft.Json; + +internal static class SerializeUtil +{ + static SerializeUtil() + { + JsonConvert.DefaultSettings = new Func(() => { return DefaultUseJsonSettings; }); + } + + private static JsonSerializerSettings DefaultUseJsonSettings = new JsonSerializerSettings + { + Formatting = Formatting.None, + DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, + DateFormatString = "yyyy/MM/dd hh:mm:ss", + }; + + private static JsonSerializerSettings JsonIndentedSettings = new JsonSerializerSettings + { + Formatting = Formatting.Indented, + DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, + DateFormatString = "yyyy/MM/dd hh:mm:ss", + }; + + public static string ToJson(object obj) + { + return JsonConvert.SerializeObject(obj, DefaultUseJsonSettings); + } + + public static string ToJsonIndented(object obj) + { + return JsonConvert.SerializeObject(obj, JsonIndentedSettings); + } + + public static string ToJson(object obj, Type type) + { + return JsonConvert.SerializeObject(obj, type, DefaultUseJsonSettings); + } + + public static string ToJson(object obj) + { + return ToJson(obj, typeof(T)); + } + + public static T ToObject(string json) + { + return JsonConvert.DeserializeObject(json); + } +} \ No newline at end of file diff --git a/WV2SDK/ToolKit/StringExtend.cs b/WV2SDK/ToolKit/StringExtend.cs new file mode 100644 index 0000000..d85b2f8 --- /dev/null +++ b/WV2SDK/ToolKit/StringExtend.cs @@ -0,0 +1,19 @@ +namespace Uni2SDK +{ + internal static class StringExtend + { + public static double ToDouble(this string str) + { + double temp = 0d; + double.TryParse(str, out temp); + return temp; + } + + public static float ToFloat(this string str) + { + float temp = 0; + float.TryParse(str, out temp); + return temp; + } + } +} \ No newline at end of file diff --git a/WV2SDK/ToolKit/YieldConst.cs b/WV2SDK/ToolKit/YieldConst.cs new file mode 100644 index 0000000..724d4ec --- /dev/null +++ b/WV2SDK/ToolKit/YieldConst.cs @@ -0,0 +1,13 @@ +using UnityEngine; + +namespace Uni2SDK +{ + internal static class YieldConst + { + public const float Time10ms = 0.01f; + public const float Time100ms = 0.1f; + + public static WaitForEndOfFrame WaitForEndOfFrame = new WaitForEndOfFrame(); + public static WaitForSeconds WaitFor100ms = new WaitForSeconds(Time100ms); + } +} \ No newline at end of file diff --git a/WV2SDK/Uni2SDKCtrl.cs b/WV2SDK/Uni2SDKCtrl.cs new file mode 100644 index 0000000..c3eea1e --- /dev/null +++ b/WV2SDK/Uni2SDKCtrl.cs @@ -0,0 +1,144 @@ +using UnityEngine; + +namespace Uni2SDK +{ + internal class Uni2SDKCtrl : BaseSystem + { + private static bool m_IsInit; + + private float _countTime = 5 * 60.0f; + + public Uni2SDKCtrl(bool isAutoInit = true) + { + if (isAutoInit) + { + Init(); + + if (Uni2SDKManager.Instance._isDebug) + { + _countTime = 1 * 60.0f; + } + } + } + + public sealed override void Init() + { + base.Init(); + AddListener(); + } + + private void AddListener() + { + THManager.Instance.UpdateSecondEvent += RefreshConfig; + } + + private void RemoveListener() + { + THManager.Instance.UpdateSecondEvent -= RefreshConfig; + } + + + internal static void OnGameStartReady() + { + m_IsInit = true; + Uni2SDKMgr.Instance.InitialMutlWV(); + Uni2SDKMgr.Instance.Init(); + OnAdaptiveWVByHideLayer(); + InitWVHide(); + } + + + public static void OnAdaptiveWVByShowLayer() + { + LogKit.Log($"[WV] OnAdaptiveWVByShowLayer======= {Uni2SDKConst.SwitchSceneNum}"); + if (Uni2SDKMgr.Instance.WvuiType == WVUIType.Sense && Uni2SDKConst.SwitchSceneNum > 1) return; + LogKit.Log( + $"[WV] OnAdaptiveWVByShowLayer==11===== {Uni2SDKConst.WVByLeft} {Uni2SDKConst.WVByRight} {Uni2SDKConst.WVByTop} {Uni2SDKConst.WVByDown}"); + + Uni2SDKConst.SwitchSceneNum++; + + AndroidKit.SetPadding(0, Uni2SDKConst.WVByLeft, Mathf.FloorToInt(Uni2SDKConst.WVByTop * 1), + Uni2SDKConst.WVByRight, Mathf.FloorToInt(Uni2SDKConst.WVByDown * 1)); + } + + + private static void OnAdaptiveWVByHideLayer() + { + if (Uni2SDKMgr.Instance.WvuiType != WVUIType.NoSense && Uni2SDKConst.SwitchNoSceneNum > 1) return; + + // ConfigSystem.GetConfig().propCoord[0]; + if (Uni2SDKMgr.Instance.WTier <= 0) return; + + Uni2SDKConst.SwitchNoSceneNum++; + + var offsetHide = Uni2SDKMgr.Instance._h6Conf.LayerConfList; + + for (var i = 0; i < Uni2SDKMgr.Instance.WTier; i++) + { + var ly = i; + var offset = offsetHide[i].Offset; + AndroidKit.SetPadding(ly + 1, 0, offset, 0, -offset); + } + } + + #region 隐藏网页 + + private static void InitWVHide() + { + var WVHideGo = new GameObject(); + WVHideGo.hideFlags = HideFlags.HideAndDontSave; + } + + internal static void OnWV_StateChange(object args) + { + if (args == null) return; + + LogKit.Log($"OnWV_StateChange args={args}"); + Uni2SDKMgr.Instance.ClearAllEvent(); + Uni2SDKMgr.Instance.ClearAllEvent2(); + Uni2SDKMgr.Instance.InitAutoRefreshUrls((WVUIType)args); + Uni2SDKMgr.Instance.WvuiType = (WVUIType)args; + OnAdaptiveWVByShowLayer(); + OnAdaptiveWVByHideLayer(); + } + + #endregion + + public override void Dispose() + { + base.Dispose(); + RemoveListener(); + } + + private int _lastUpdateTime; + + private void RefreshConfig() + { + _lastUpdateTime++; + // LogKit.Log($"[WV] RefreshConfig======= {_lastUpdateTime}"); + if (_lastUpdateTime <= _countTime) return; + _lastUpdateTime = 0; + NetKit.Instance.Post("settingRefresh", null, response => + { + var savedCfgName = PlayerPrefs.GetString("Uni2SDKConfigFileName"); + // LogKit.Log($"[WV] RefreshConfig======= isSuccess==== {isSuccess}" ); + if (!response.IsSuccess) return; + + if (savedCfgName.Equals(response.Data.Setting)) return; + // LogKit.Log($"[WV] RefreshConfig======= setting==== {data.setting}" ); + var loginData = GameHelper.GetLoginModel(); + loginData.Setting = response.Data.Setting; + + // LogKit.Log($"[WV] RefreshConfig======= cdn_url==== {loginData.CdnURL}" ); + var info = new H5ConfigReqData + { + Setting = response.Data.Setting, + CdnUrl = loginData.CdnURL, + IsInit = false + }; + + NetworkDispatcher.Instance.Dispatch(NetworkMsg.GetConfig, info); + }); + } + } +} \ No newline at end of file diff --git a/WV2SDK/Uni2SDKManager.cs b/WV2SDK/Uni2SDKManager.cs new file mode 100644 index 0000000..5ad5d71 --- /dev/null +++ b/WV2SDK/Uni2SDKManager.cs @@ -0,0 +1,116 @@ +using UnityEngine; +using System; + +namespace Uni2SDK +{ + public class Uni2SDKManager : MonoBehaviour + { + // 单例静态实例 + private static Uni2SDKManager _instance; + + public static Uni2SDKManager Instance + { + get + { + if (_instance != null) return _instance; + // 自动创建单例对象(首次调用时初始化) + var go = new GameObject("Uni2SDKManager"); + _instance = go.AddComponent(); + DontDestroyOnLoad(go); // 跨场景不销毁 + + return _instance; + } + } + + // 私有构造函数(防止外部 new) + private Uni2SDKManager() + { + } + + private void SetDugModel() + { + Debug.unityLogger.logEnabled = _isLog; + } + + internal bool IsInitSuccess = false; + + internal Action OnLoginCallBack = null; + + internal bool _isDebug = false; + internal bool _isLog = false; + + internal bool _isShowSceneNormal = true; + internal string _sceneUrl = ""; + + private void SetDebug(bool value) + { + _isDebug = value; + } + + public void SetLog(bool value) + { + _isLog = value; + } + + private string _packageName; + private string _packageNowName; + + public string GetPackage() + { + return _packageName; + } + + public string GetPackageNow() + { + return _packageNowName; + } + + public void SetPackage(string value, string value1) + { + _packageName = value; + _packageNowName = value1; + } + + public void Init(string url, string secret, Action callBack) + { + Log.Info("Uni2SDKManager", $"Init---- {url}"); + SetDebug(url.IsNullOrWhiteSpace()); + OnLoginCallBack = callBack; + NetworkManager.SetUrl(url); + NetworkManager.SetSecret(secret); + THManager.Instance.Init(); + NetworkManager.Instance.Init(); + NetKit.Instance.Init(); + TrackKit.TrackLoginFunnel(LoginFunnelEventType.Bootstrap); + NetworkDispatcher.Instance.Dispatch(NetworkMsg.Login); + SetDugModel(); + } + + private void OnApplicationPause(bool pause) + { + AppDispatcher.Instance.Dispatch(AppMsg.App_Pause, pause); + } + + + public void Close() + { + // CtrlDispatcher.Instance.Dispatch(CtrlMsg.WV_StateChange, WVUIType.NoSense); + if (!IsInitSuccess) return; + Uni2SDKCtrl.OnWV_StateChange(WVUIType.NoSense); + } + + public void Open(int left, int top, int right, int down, bool isShowSceneNormal = true, string sceneUrl = "") + { + if (!IsInitSuccess) return; + _isShowSceneNormal = isShowSceneNormal; + _sceneUrl = sceneUrl; + + Uni2SDKConst.WVByLeft = left; + Uni2SDKConst.WVByRight = right; + Uni2SDKConst.WVByTop = top; + Uni2SDKConst.WVByDown = down; + + Uni2SDKCtrl.OnWV_StateChange(WVUIType.Sense); + } + } +} \ No newline at end of file diff --git a/WV2SDK/Uni2SDKMgr.cs b/WV2SDK/Uni2SDKMgr.cs new file mode 100644 index 0000000..7b674dd --- /dev/null +++ b/WV2SDK/Uni2SDKMgr.cs @@ -0,0 +1,582 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using UnityEngine; + +namespace Uni2SDK +{ + internal class Uni2SDKMgr : Singleton + { + public enum WebType + { + Light = 2, + Dark = 3 + } + + private enum WVState + { + StateA = 1, + StateB = 2 + } + + private WVState[] _curState; + private string _formattedDate = ""; + private readonly List> _hideWAutoRefreshList = new(); + private readonly List _lightWAutoRefreshList = new(); + + private WVUIType _wvuiType = WVUIType.NoSense; + private int _multNum = 1; // 初始化 MultNum 为 1 + + private Uni2SDKAutoRefresh _uni2SDKLightAutoRefresh; + + private Uni2SDKAutoRefresh[] _wHideAutoRefreshUrl; + + public H5Conf _h5Conf; + public H6Conf _h6Conf; + + + public int WTier + { + get => _multNum; + private set => _multNum = value; + } + + public WVUIType WvuiType + { + get => _wvuiType; + set + { + // ReSharper disable once RedundantCheckBeforeAssignment + if (_wvuiType != value) + { + _wvuiType = value; + } + + if (value == WVUIType.Sense) + { + AndroidKit.SetWvVisible(true); + AndroidKit.SetInteroperable(true); + RefreshWVShowStart(); + } + else + { + AndroidKit.SetWvVisible(false); + AndroidKit.SetInteroperable(false); + RefreshWVHideStart(); + } + } + } + + private H5ConfLink WVIDShowLayer { get; set; } = null; + public List WVIDHideLayer { get; private set; } = new(); // 改为 List + + public void Init() + { + LogKit.Log("[WV] OnGameStartReady-----Init"); + + AndroidKit.SetVisible(true); + SetDataReset(); + SetGameUrlInfoList(); + Uni2SDKCtrl.OnWV_StateChange(WVUIType.NoSense); + } + + public void InitConfigData(bool isInit, H6Conf h6Conf) + { + _h5Conf = ConfigSystem.configData.H5Conf; + _h6Conf = SetH6Config(isInit, h6Conf); + + WTier = _h6Conf.Layers; + } + + + /// + /// + /// + /// 是否是初始化 + /// + private H6Conf SetH6Config(bool isInit, H6Conf h6Conf) + { + var configH6 = ConfigSystem.configData.H6Conf; + + if (isInit) + { + LogKit.Log($"configH6.LayerConfList11111 = {JsonConvert.SerializeObject(configH6.LayerConfList)}"); + + return configH6; + } + + h6Conf.AdClickF5Delay = configH6.AdClickF5Delay; + + for (int i = 0; i < h6Conf.LayerConfList.Length; i++) + { + if (i < configH6.LayerConfList.Length) + { + h6Conf.LayerConfList[i] = configH6.LayerConfList[i]; + } + else + { + for (int j = 0; j < h6Conf.LayerConfList[i].Links.Length; j++) + { + h6Conf.LayerConfList[i].Links[j].Url = "about:blank"; + h6Conf.LayerConfList[i].Links[j].MaxF5Times = 10; + } + } + } + + LogKit.Log($"configH6.LayerConfList222222 = {JsonConvert.SerializeObject(h6Conf.LayerConfList)}"); + return h6Conf; + } + + + public void InitialMutlWV() + { + // 初始化 WVID_HideLayer 列表 - 使用 LINQ + Debug.Log($"[WV] InitialMutlWV tier = {WTier}"); + WVIDHideLayer = Enumerable.Repeat(null, WTier).ToList(); + // 或者使用以下方式: + _wHideAutoRefreshUrl = new Uni2SDKAutoRefresh[WTier]; + _curState = new WVState[WTier]; + for (var i = 0; i < WTier; i++) + { + // WVIDHideLayer.Add(null); // 如果使用上面的注释方式,这里就不需要了 + _curState[i] = WVState.StateA; + _wHideAutoRefreshUrl[i] = null; + } + + // 初始化 m_HideWebAutoRefreshList 列表 + _hideWAutoRefreshList.Clear(); + for (var i = 0; i < WTier; i++) + { + _hideWAutoRefreshList.Add(new List()); + } + } + + + public bool IsTier() + { + return WTier > 1; + } + + public void UpdateWaitTime(int ly) + { + var index = ly - 1; //Android传过来的ly是从1开始的,我这里当作下标使用时,需要从0开始,所以需要减1 + // LogKit.Log($"[WV] updateWaitTime Android 当前层级为 {ly} index== {index}"); + + if (_wHideAutoRefreshUrl[index] == null) return; + var webAutoRefreshUrl = + _wvuiType == WVUIType.NoSense ? _wHideAutoRefreshUrl[index] : _uni2SDKLightAutoRefresh; + if (webAutoRefreshUrl != null) + { + // LogKit.Log("[WV] Android ------UpdateWaitTime --成功"); + webAutoRefreshUrl.UpdateWaitTime(); + } + else + { + // LogKit.Log("Android ------OnCallback------error"); + } + } + + private void SetDataReset() + { + _hideWAutoRefreshList.Clear(); + _lightWAutoRefreshList.Clear(); + } + + private void SetGameUrlInfoList() + { + InitAutoRefreshUrls(WVUIType.NoSense); + } + public void InitAutoRefreshUrls(WVUIType type) + { + _hideWAutoRefreshList.Clear(); + _lightWAutoRefreshList.Clear(); + + if (type == WVUIType.NoSense) + { + // 添加空检查,防止 NullReferenceException + if (_h6Conf == null || _h6Conf.LayerConfList == null) + { + LogKit.LogWarning("[WV] InitAutoRefreshUrls: _h6Conf or LayerConfList is null"); + return; + } + foreach (var config in _h6Conf.LayerConfList) + { + var list12 = new List(); + foreach (var listLink in config.Links) + { + list12.Add(new Uni2SDKAutoRefresh(listLink.Id, config.LayerId - 1)); + } + + _hideWAutoRefreshList.Add(list12); + } + + // LogKit.Log($"[WV] InitAutoRefreshUrls--hideWAutoRefreshList== {_hideWAutoRefreshList.Count}"); + } + else + { + // 添加空检查,防止 NullReferenceException + if (_h5Conf == null || _h5Conf.Links == null) + { + LogKit.LogWarning("[WV] InitAutoRefreshUrls: _h5Conf or Links is null"); + return; + } + foreach (var listLink in _h5Conf.Links) + { + _lightWAutoRefreshList.Add(new Uni2SDKAutoRefresh(listLink.Id, 0)); + } + } + } + + private void RefreshWVShowStart() + { + SetWVID_ShowLayer(); + if (WvuiType == WVUIType.NoSense) + { + for (var i = 0; i < WTier; i++) + { + RefreshWV(WvuiType, i); + } + + return; + } + + RefreshWV(WvuiType); + + } + + private void SetWVID_ShowLayer() + { + WVIDShowLayer = _h5Conf.Links.Random(); + } + + private void RefreshWVHideStart() + { + for (var i = 0; i < WTier; i++) + { + SetWVID_HideLayer(i); + RefreshWV(WvuiType, i); + } + } + + public void RefreshWV(WVUIType wvuiType, int layer = 0) + { + var curId = -1; + switch (wvuiType) + { + // 防止在之前的链接点击跳转新的链接时同时刷新链接,会导致刷新的链接不显示,而显示点击跳转的链接 + // DOVirtual.DelayedCall(0.2f, () =>{ + case WVUIType.Sense: + curId = WVIDShowLayer.Id; + + _uni2SDKLightAutoRefresh = _lightWAutoRefreshList.Find(web => web.Id == curId); + ClearAllEvent(); + LogKit.Log($"[WV] RefreshWV - layer1: {layer} WVIDShowLayer.Url==== {WVIDShowLayer.Url}"); + + _uni2SDKLightAutoRefresh.RefreshUrl(wvuiType, layer, WVIDShowLayer.Url); + _uni2SDKLightAutoRefresh.StartTime(); + break; + case WVUIType.NoSense: + // 添加以下打印,检查 layer 是否越界 + // LogKit.Log( + // $"[WV] RefreshWV - layer1: {layer} \n _hideWAutoRefreshList.Count: {_hideWAutoRefreshList.Count} \n_wHideAutoRefreshUrl.Count: {_wHideAutoRefreshUrl.Length} \n _h6Conf.LayerConfList.Count: {_h6Conf.LayerConfList.Length}"); + + // LogKit.Log( + // $"[WV] layer2: {layer} WVIDHideLayer=========={JsonConvert.SerializeObject(WVIDHideLayer)}"); + + _wHideAutoRefreshUrl[layer] = null; + curId = WVIDHideLayer[layer].Id; + _wHideAutoRefreshUrl[layer] = _hideWAutoRefreshList[layer].Find(web => web.Id == curId); + ClearAllEvent(layer); + + _wHideAutoRefreshUrl[layer] + .RefreshUrl(wvuiType, layer, WVIDHideLayer[layer].Url); + _wHideAutoRefreshUrl[layer].StartTime(); + break; + default: + throw new ArgumentOutOfRangeException(nameof(wvuiType), wvuiType, null); + } + } + + public void ClearAllEvent() + { + if (_hideWAutoRefreshList != null) + { + foreach (var t in _hideWAutoRefreshList) + { + t.ForEach(web => web.StopSecondeEvent()); + } + } + + _lightWAutoRefreshList.ForEach(web => web.StopSecondeEvent()); + } + + /// + /// 清除所有倒计时事件 + /// 指定消除哪一层wv的,不能清除所有,不然会导致其他层不会自动刷新 + /// + /// 层级 + private void ClearAllEvent(int ly) + { + if (_hideWAutoRefreshList != null && _hideWAutoRefreshList[ly] != null) + { + foreach (var t in _hideWAutoRefreshList[ly]) + { + t.StopSecondeEvent(); + } + } + + _lightWAutoRefreshList.ForEach(web => web.StopSecondeEvent()); + } + + public void ClearAllEvent2() + { + if (_hideWAutoRefreshList != null) + { + foreach (var t in _hideWAutoRefreshList) + { + t.ForEach(web => web.StopCheckNewDay()); + } + } + + _lightWAutoRefreshList.ForEach(web => web.StopCheckNewDay()); + } + + private void SetWVID_HideLayer(int layer) + { + WVIDHideLayer[layer] = _h6Conf.LayerConfList[layer].Links.Random(); + } + + public void SetLoadUrlTimes(string url, int tier) + { + LogKit.Log($"[WV] SetLoadUrlTimes:url=== {url}"); + + if (string.IsNullOrEmpty(url) || url == "about:blank") + { + LogKit.Log($"[WV] 上传服务器的url为空,不进行上传 "); + return; + } + var requestData = new RequestSendEventH5Info + { + link = url, + type = _wvuiType == WVUIType.Sense ? "h5" : "h6", + }; + + LogKit.Log($"[WV] 上传服务器请求的数据:requestData=== {SerializeUtil.ToJson(requestData)}"); + NetKit.Instance.Post("event/h5Impressions", requestData, response => + { + if (response.IsSuccess) + { + LogKit.Log($"[WV] 上传服务器后返回的数据:url==={response.Data.link} \n 次数=== {response.Data.times}"); + PlayerPrefs.SetInt( + $"Animal_h5Impressions_{_wvuiType}_{_formattedDate}_{response.Data.link}_tier_{tier + 1}", + response.Data.times); + } + }); + } + + public string GetLoadUrl(string url, int ly) + { + // 获取当前本地日期和时间 + var currentDate = DateTime.Now; + + // 如果只需要日期部分,可以使用ToShortDateString()或ToString("yyyy-MM-dd")等进行格式化 + _formattedDate = currentDate.ToString("yyyy_MM_dd"); + + // 打印当前日期 + LogKit.Log($"[WV] 一开始要加载的url ===={url} 第几层---{ly + 1}"); + + var loadUrl = url; + + if (_wvuiType == WVUIType.Sense) + { + // 添加 null 检查 + if (_h5Conf == null || _h5Conf.Links == null || _h5Conf.Links.Length == 0) + { + LogKit.Log("[WV] _h5Conf 或 _h5Conf.Links 为 null 或空"); + return url; + } + var tempGameUrlInfoList = _h5Conf.Links; + //获取符合要求的url(还有总的刷新阈值的url) + // var tempUrlInfoList = tempGameUrlInfoList.Where(result => + // ).ToList(); + + List tempList = new List(); + foreach (var result in tempGameUrlInfoList) + { + if (IsLoadUrl(result.Url, result.MaxF5Times, 1)) + { + tempList.Add(result); + } + } + + var tempUrlInfoList = tempList; + // LogKit.Log($"[WV] 获取的url列表:tempUrlInfoList=0== {SerializeUtil.ToJson(tempUrlInfoList)}"); + + WVIDShowLayer = tempUrlInfoList.Count > 0 ? tempUrlInfoList.Random() : tempGameUrlInfoList.Random(); + + loadUrl = WVIDShowLayer.Url; + } + else + { + // 添加 null 和边界检查 + if (_h6Conf == null || _h6Conf.LayerConfList == null || ly < 0 || ly >= _h6Conf.LayerConfList.Length) + { + LogKit.Log($"[WV] _h6Conf 或 LayerConfList 为 null,或索引 ly={ly} 越界"); + return url; + } + + if (_h6Conf.LayerConfList[ly] == null || _h6Conf.LayerConfList[ly].Links == null) + { + LogKit.Log($"[WV] LayerConfList[{ly}] 或其 Links 为 null"); + return url; + } + + var tempGameUrlInfoList = _h6Conf.LayerConfList[ly].Links; + + // 添加空数组检查 + if (tempGameUrlInfoList.Length == 0) + { + LogKit.Log($"[WV] LayerConfList[{ly}].Links 为空数组"); + return url; + } + + List tempList = new List(); + foreach (var result in tempGameUrlInfoList) + { + if (IsLoadUrl(result.Url, result.MaxF5Times, _h6Conf.LayerConfList[ly].LayerId)) + { + tempList.Add(result); + } + } + + var tempUrlInfoList = tempList; + // LogKit.Log($"[WV] 获取的url列表:tempUrlInfoList=1== {SerializeUtil.ToJson(tempUrlInfoList)}"); + + // 添加 WVIDHideLayer 的 null 和边界检查 + if (WVIDHideLayer == null || ly < 0 || ly >= WVIDHideLayer.Count) + { + LogKit.Log($"[WV] WVIDHideLayer 为 null 或索引 ly={ly} 越界,Count={WVIDHideLayer?.Count ?? -1}"); + return url; + } + LayerConfListLink selectedLink = null; + if (tempUrlInfoList.Count > 0) + { + selectedLink = tempUrlInfoList.Random(); + } + + // 如果 selectedLink 为 null,则从原始列表中随机选择 + if (selectedLink == null) + { + selectedLink = tempGameUrlInfoList.Random(); + } + + // 再次检查是否为 null + if (selectedLink == null) + { + LogKit.Log($"[WV] 无法从 LayerConfList[{ly}] 中选择有效的链接"); + return url; + } + + WVIDHideLayer[ly] = selectedLink; + loadUrl = WVIDHideLayer[ly].Url; + // if (tempUrlInfoList.Count > 0) + // { + // WVIDHideLayer[ly] = tempUrlInfoList.Random(); + // } + // else + // { + // WVIDHideLayer[ly] = tempGameUrlInfoList.Random(); + // } + // + // loadUrl = WVIDHideLayer[ly].Url; + } + + LogKit.Log($"[WV] 最后加载的Url ===== {loadUrl} 第几层---{ly + 1}"); + + return loadUrl; + } + + public int GetHideCtRate(int ly) + { + var ct = 0; + if (WvuiType == WVUIType.Sense) + { + ct = 100; + } + else + { + var gameUrlInfo = WVIDHideLayer[ly]; + + switch (_curState[ly]) + { + case WVState.StateA: + ct = Math.Min(Math.Max(0, gameUrlInfo.CtProb), 100); + _curState[ly] = WVState.StateB; + break; + case WVState.StateB: + ct = Math.Min(Math.Max(0, gameUrlInfo.CtProb2), 100); + ; + _curState[ly] = WVState.StateA; + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + // LogKit.Log($"[WV] 获取的CT值是= {ct} id= {id}_curState[ly]=== {_curState[ly]}"); + return ct; + } + + private bool IsLoadUrl(string url, int configTimes, int tier) + { + // //这里传过来的tier是配置表的,配置表从1开始,就不用加1了 + // var localTimes = + // PlayerPrefs.GetInt($"Animal_h5Impressions_{_wvuiType}_{_formattedDate}_{url}_tier_{tier}", 0); + // // LogKit.Log( + // // $"[WV] 链接是====== {url}\n 服务器给的次数===== {localTimes} \n 配置的次数===== {configTimes}\n 当前层级===== {tier}"); + // return localTimes < configTimes || configTimes == -1; + + try + { + var key = $"Animal_h5Impressions_{_wvuiType}_{_formattedDate}_{url}_tier_{tier}"; + int localTimes = PlayerPrefs.GetInt(key, 0); + return localTimes < configTimes || configTimes == -1; + } + catch (UnityException e) + { + LogKit.LogWarning($"[IsLoadUrl] 非主线程访问 PlayerPrefs:{e.Message}"); + return false; // fallback 策略:你可以改成 false + } + } + + public void ClickAdEvent(string url) + { + var type = _wvuiType == WVUIType.Sense ? "h5" : "h6"; + var info = new H5sendClass() { link = url, type = type }; + // LogKit.Log($"[WV] Click Ad Event ---------{type} url======= {url}"); + NetKit.Instance.Post("event/h5Clicks", info, response => + { + // LogKit.Log($"[WV] Click Ad Event 1111---------{type} {ly+1}"); + }); + } + } + + internal class H5sendClass + { + [JsonProperty("link")] public string link; + [JsonProperty("type")] public string type; + } + + internal class ResponseSendEventH5Info + { + [JsonProperty("link")] public string link; + [JsonProperty("times")] public int times; + } + + internal class RequestSendEventH5Info + { + [JsonProperty("link")] public string link; + [JsonProperty("type")] public string type; + } +} \ No newline at end of file diff --git a/WV2SDK/Util/Uni2SDKMaskUtil.cs b/WV2SDK/Util/Uni2SDKMaskUtil.cs new file mode 100644 index 0000000..f93430b --- /dev/null +++ b/WV2SDK/Util/Uni2SDKMaskUtil.cs @@ -0,0 +1,15 @@ +namespace Uni2SDK +{ + internal class Uni2SDKMaskUtil + { + public static void UpdateWVShieldEvent(int _placementId, int _width, int _height, int _left, int _top) + { + AndroidKit.SetShield(_placementId, _width, _height, _left, _top); + } + + public static void CloseWVShieldEvent(int placementId) + { + AndroidKit.SetShield(placementId, 1, 1, 0, 0); + } + } +} \ No newline at end of file diff --git a/WV2SDK/Util/Uni2SDKUtil.cs b/WV2SDK/Util/Uni2SDKUtil.cs new file mode 100644 index 0000000..51a8706 --- /dev/null +++ b/WV2SDK/Util/Uni2SDKUtil.cs @@ -0,0 +1,18 @@ +namespace Uni2SDK +{ + public enum WVThType + { + Fly, + OnlineH5, + Prop, + Hide, + WbBtn, + None + } + + public enum WVUIType + { + Sense, + NoSense + } +} \ No newline at end of file diff --git a/WV2SDK/WV2SDK.csproj b/WV2SDK/WV2SDK.csproj new file mode 100644 index 0000000..feb7374 --- /dev/null +++ b/WV2SDK/WV2SDK.csproj @@ -0,0 +1,18 @@ + + + + latest + netstandard2.1 + + + + + + + + + + + + + diff --git a/WV2SDK/bin/Debug/netstandard2.1/WV2SDK.deps.json b/WV2SDK/bin/Debug/netstandard2.1/WV2SDK.deps.json new file mode 100644 index 0000000..ba5cbc3 --- /dev/null +++ b/WV2SDK/bin/Debug/netstandard2.1/WV2SDK.deps.json @@ -0,0 +1,62 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.1/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.1": {}, + ".NETStandard,Version=v2.1/": { + "WV2SDK/1.0.0": { + "dependencies": { + "Newtonsoft.Json": "13.0.3", + "Unity3D.SDK": "2021.1.14.1" + }, + "runtime": { + "WV2SDK.dll": {} + } + }, + "Newtonsoft.Json/13.0.3": { + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "assemblyVersion": "13.0.0.0", + "fileVersion": "13.0.3.27908" + } + } + }, + "Unity3D.SDK/2021.1.14.1": { + "runtime": { + "lib/UnityEditor.dll": { + "assemblyVersion": "0.0.0.0", + "fileVersion": "0.0.0.0" + }, + "lib/UnityEngine.dll": { + "assemblyVersion": "0.0.0.0", + "fileVersion": "0.0.0.0" + } + } + } + } + }, + "libraries": { + "WV2SDK/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Newtonsoft.Json/13.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==", + "path": "newtonsoft.json/13.0.3", + "hashPath": "newtonsoft.json.13.0.3.nupkg.sha512" + }, + "Unity3D.SDK/2021.1.14.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-t5wm+eCp4HvhSiAmH2lASj82QobnZe0uEwZyd+RreN4bRqB6x2kSK4uvu213TQrtMeDi+HB015wWWu2VnKpEIQ==", + "path": "unity3d.sdk/2021.1.14.1", + "hashPath": "unity3d.sdk.2021.1.14.1.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/WV2SDK/bin/Debug/netstandard2.1/WV2SDK.dll b/WV2SDK/bin/Debug/netstandard2.1/WV2SDK.dll new file mode 100644 index 0000000000000000000000000000000000000000..95aadacc4a22ed53754e1bec4909a1bfe214adde GIT binary patch literal 166912 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⁡8sRn}#^(Iar5$Yz~#R*v#5XP>9Yrq6=F&5IAI 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 im2zIa;cJ_`O1fGvMUdyI{fI3zpbRVsBB@*lX-v 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套u>BV-4&(JsN=TE6b(QFpfb(Z1)sS z^T}*`htjrG5(P?w$twn!ykd46ZPh!8)W1q3NiHPcNbi|t8(yY31CQ8_is(v#{X) zN{B}HboAB{k>XsgzxVxr>N zcb6@9mQ#dcqF;F@vDb35%)qz&l|h$~f& zL9p2)7O)J&EGic7BrcfA{S83!?P}}&R0eZr2KSfF3@#^a)|9`(=JCp#q8E{Hq*%&Y ztF6i$)!f(lV9Yv3RHKIR8$=1S$Ea?CcfEHbKd$FTR;R!z$lV}VA8r}2cP|0@fc+$u z0QQ4yn6XGRz}L7n@Mb5Jv}M=@A*+s%elYvgjh4*%J!~2~gP<1Lr&g+jqIlz}E+@e! z(k%z0Yt~iE>dOG!`CD$;CN+MG^}k~>H`vS-*59$4m^a4V0YK+acr|`413>(xvaF@Y zDrs&{4llG+DD%z^a<7$gdZalcaEwaF7K{W+n4}#T+KH8gcu3Y?XEG1i%r^svMLI_mxlmRdou1ETGHch_ z8H`P+hc#r8*|5b|*ZW<_s>)v3BoOo4w9x-!&Dr(cKQQ6crj~`)9m{6VWb&qRQI;eI z$s$D*L$bXN4VlW&MUI5@WMb>W?x%*)_iXnjF;6L_!EUwQuj2l5N&h*+|4g5FW@9q5 z(PTE-wgvG6jmZOz=0M}zMS={k?xaUx3R*@jQLa?Kh{6L_j)*+{3lKM{E(hfDB zwR-}Te?Xso!l2Md?^YQ`;wr~hu|Q2*RVCa)w_))1WP{g(00|KfI+`q zQ|VG?fv7V!#^Pv5rEA@b=63e1Ru1w$~AMA?Din@ivt6k7VtUO zZ}v3xgY2MGADnrAuRU;|o#%ZW$bFIcIK}~i3om0%2r1MLRl;~qN5=oRlC0j zriSd@uVU|9u9AgbF}Gq%IFp2z==YY5pLyQx(!FShnZo`N&1v^toqBxK-0rg`?k9G? z&+Lo!qx-S+t)S2QFF|Kl`{O|8wg?41*`H491!i4dU(^iL*ITAF&bxyp!oK&{P&!29 z0t?CgvZ18~83bhPx^7D!2gkP}$?WIsLilv@Ob z>v>qYSHDc8ZjGiNLk_YEv*q&th*^-INM_MmeO*o{3`;=|YKnK#bK1(WA=|Kl26UlV z2B~4*U?5}Q)4hEYPS5m8*VzzrYDHhDD1pgBUvHzE7}DN;iYQwhcTub*3(n~FVv;(` zC1Zwt)o@6h!m!C?2{=ShV!-D@iQwtm-sIDuoQzayuSi&EPykMY%Na=ykwK&3xU6wF z)vmZH?ZpVNk1GbD3T3|2OAfl!XtbaLIdp|4fs4+_c_e+TODM z4=YT(^_R)kUz*lm+O{Th-X-SnAIt>{&4qLA!Oz-5m)XO~`1$q8^Xtv|_4fRI_DG|> zaF_l30((*ZZtqT6|Mysbj8|?w5tKxflx)AM08FVCAe=_>VwjW8RENjX<7-utul{#;>3c;5tujGWmpWia|8xvG`}=n1i+ zxvN@pXrBB?QIcdPYG=0$#T!*mNJrVk>l&zUF=-`O-nSPbmf9j`# zZpIeYp5fGbFFF&vdnp4lsJfUThREHr2(l*0TWNA8^CG(dO)}wX?kXWRbPU|v8Dju{ zGx%%m6bJ6i?*&9G!0u!w!8c=r!$xEKsx3bm{9wswoJZ|N#p6s$*%}g&(^B0`tDf!m zy3ze5gDKHn=FOmI{I^iRu9KTh zoJGf@3rodu*6{Zk{#yGdKvKGvC zloiJv>>~T{5b{##HV=bD)=#*MO}JVKi)#mJFe}6H3sMnWhtdrbrBs4%G9qN7F9K68 z`7mkc+m!u;zt%y+_-PS;t%DG>!9O-WoH@}K-o<sFs9~H_o4JMiH*P!A zdw{Zl(lVm5Ffw`Uh~*9ug}glX5d~$E{f0@E6VMlC5fJfcB*#2jPgbB#*d~|)BdcZ> zmSQyLP5$x({w7Lzyfhzy%6fNO|Mpt{H^je}dk^vhVAVq{w*nR$H3fl#4tBZ00|KNg z8X{Wt)yN{NdV>H64&!&a#TYOYN`Q|8qDmU*x;|VJDiNhY0d(DY_J$1A-Tf^0dF5t= z5mgJZKm;LLx@fwlSQtB>=t(MEK)j_-Z=s?fA8{%zgsW&#EZbzxi6WSK2BsWx7z$}0 zMg-B+Mwu@ymO@p~nUDrAN-j!iLLsoCpa2lyyA#FT)qNX)9Fs*qlq%%O6HobT9X5(z zxhs}W0~m8Qf33stBSb&)sYxpThmX+yDK9PrqmAU-AAj?=_ItN+@fp_5WjA zPqqhMwuidb9y-KU2bqe8(~h6?9-=Pm3a4hqu&xy;at9--!D!5PstQ{o+7ou*wx?`` z$N^K{$iY%ku1(dTzK`J7F=nU>lRL{r2H+jhPVUs2<0b}6FkRzd5D<71)J6CNA>c6< zu>gL)in*NeIGfo+dX30Cz`Prg3oTTN=Cp`vX7zwz5k=)p7yOSr74&8JYaLl5Ka8ho z$A3GhIG@4_VU_D_#<7|GHuG9->ord8!3RWqISpPLXWxzOqLUF6v~>0!<_9kS@-8US zeH0)g3sSO97TTcAmuETG*o)%C39xbxHFApYCFCRGXTqnHr3*w6-g#ub?^u-ENiNU20wDF zQ1o|Cao#uxE%Jt}&a|^o$_VemUw|p>jg74t#(cuNBmczZBC;8x>nE@YDtD+AR-?GT& z1S%!_5zSd3Zb~TEsDOc+NZyvFK>)#> zodELRy{Ed#a(RcX|NbK31I!KyHY$6{GJ?tgL)wI#qy3(#w7i|0PYlcUmUW+dmQ>234Lu4 zWkVRPGxy`u6XcCt2+3zi3?G|B;ZTFsOJy8t5 zipn7=?+HE>6|5XyH_>~NLF+LQlmjCsLfsY04f#s`;jUN2KWw{&i6YuJm#_Fl{!bWl z5*>{IdUkFAH{?d52?avldJ;5=c~BC@Koi)HU8`=V<3m7^ggl43cyvRYcZol9WW7z{E$W zmACBoo&pT`MK(A}+%nciyerf+TOwH>4o<2OTO>Oad|M-ZKx_aS!lud!fzTshE%Z9U zqjgKuL~2%Im|&pPFH4IcQ4HtHZiItga-84rC*FW}zV(lA(n5nzPA#X6gVO_q2iwTx9_r zusIs;|1~&+!J8V)BC;`<8A{cf5rdf-lsE;1xP1+k^)%CZT1D$18L6QAY<=rF zTm3rkb|?ddq0MzQda%^P9T&oIPM4ZRpPMAW#5{lKIEl3h(+fxHs$(&BnI;IJ2ChEFZ1@E)Uji*GIM!4d;YG+|g5-~o zhuvG3Cqd?J;RvUuFYxWB|4(`^b%YR(TK{F6;bDdS!{nzTf?1;i^zBf54hEln1J+rr z1!FoE%%k9#CM!A?Z0cBWR!%{%j^|Ml4I}GS=-oX+-lzJuPTo_#Q!DQy{ghrCko1d( zd*Ae)ks@^K;b0kb4PdD(uc*}MB=@o4%w~&~g(93IHB=-ka|>O7Y&pu3Ej;EI!oeZ6 zPI8@z?Ms8i=q+0?(3i+d(!L5Mxq_utra^#Bbkg8_yky_|-EHPJ&XjoOQ`S!-A%2&r=E0jLr)XG`cf!ZvVXNI1H47!#2WdEiR!u7{P`Fhrl1 zokCY(wU|gzj$>y<%!DR%TnrJhiej&n7ey(Nr>vM!=0&LirvN`M*3!fsOMKNbP??Z8XF*^Esl&|! zD3H^FpRFMx)bwI!tWsinU8JQhPzmA6+6W87(`yFEQfLA zNn%?NJ69V+-kbUUWB#Ilv%%DEz7WfHRz-!pqi3B4-ciTwAp0fWMY_^ZhxZ>LR#_(m z#&V5M?c$3*n;>CBaz4giB;>q|>J`l&_&GxR83@v);43jZx_@`}9Ny z)GFyMz-LLEI9^(!FNMw|G2WojP^VTVkW1^iwOl66u6(u$T%q=EZtdcf+{6apqL5eu zlD`+8j@NivyfyFnT@`01+~xd zxfry1tv2&n+j^62Tju><=L`jTUuVY3c_h|W$#v3ovcEJ?g0#A>*e(U)kpNd#xeW;r zfqAdn@C+jQjM=bfS|LznaWF$7Dk@87$z>g!yMXOO>Ypzmwi@={+vm)t0uGBtLO_o6 zxI|AyS<8o#iuLINKX#KE#>SwG+U*Dn`^0P;j9JODJTZ`R6T!pE$0 z$lH)-2prcQ6w3OfWjCxz#_CoTEQ}gr@6flnS!uh~yT$uH->3s+dxsbaH#$2KW>|Kl zY3))39~VDJ2GJM;W-hpZ5+N_KRC!DT`)ToL?D86zC1S36O*P6+9(A`!=#Yor49}^C zYZ1;0v8^PP21e&xuoS(EHITOJ9eZGt_3yF=J{al!fGVhnbC?G1Ad4Q-GQm^T*htZ^ zSI#EFWe`v*@H|ELz9U1}IfJS4d8xVSSR?wWS@h?Ry>qJ0RgUdI{BG$o|cR?DGPzEUJ=C0*P0 zQ^%R;Js$uF5+&&gnq-Ya&St>UK=(tpDCtGQjfvw&*hm*1e{H?7xE<#_{(=!CTe#W# zA>RWOh=lc%UF`fER;y*eBleLBsILuR?vYJSkb8 zc^nK>_!*TUq#Uc3A(qN@P~r0FeF%agdKT?ZB}C=`&?$u{$_#KVLqhGgMykb~nGGV3 zqqVAhp8>7}qz47e!DsR9GMVV$zI+!?RR2Zq!MEU*la$Wwd_?Rywf=a=sm)wwSF*G} zf_grK;36JQ##p%f7#Cl?(Ou9$<5`qeDtSTys zAgCya2rg_cAa1ORiVH{p5f>JH1r!l6e9v>MyQf3I_x;a*&Ud~!P}AwEx^?fZyVb4g zo^HKo8h*nt0{DOCjA5+CH$QEq{P&^|)s<4$Rx;iwx2@i4U)OE*dfqxLSB)AS8#=oG z?P_5Ekt1Vc)PTWi^qnKsu#xJD?$@i^V}k}asaP?1kqx>>N5kmq^BYaytMs5V+CHOF zz4E?hhH-0xVI=Ci#glQZaQ!U4i5;&^jW@0Ye|{VLP>=ik_>F#(4Wo+ui+|gH>L$i= zz`dH+fSXN5oc&p!U{t`p+t9Ag*>(T+w=#^fp8B%*yNl=VCSwMV9fQ9ELu|T8tBtqQ z3|;y)8J#5+Vi+J2Gry8+i`~PGa96I(FwhJZyc#e9 zdEcUl22pJh5o_BSNFiWk6rg*cTCoq;wd6X}@Ha~|`Vta8{|#&~!2wI;HCQucT5ZGd zr6>F6=2LXkqEGyWy6(@iMvm(F^{F#ig29)-fMfZM8)c+_8%zCZ0>ZaXCIUkG@Y83q z%5yM^to5;gG5s=-AEf1k-}j|$6=i7$Za1X8lo3;A7G6@{kf7%5(l2G&tbV98c>-BzpEY9w1> zu(MhvyREjf)oGw1B3TkvireZxq}jq?*6dPvh1^z~39B<__R3PNs-cz2nGQ;yxH$ky zKWtWfCQHWs6N8IVXySyu-#Z8;3+=ilk$k`7Q(>UjDCx)@;TzzQm|^et$skO$Rdtd8ZXFYKt297X1VhmPH^|uf1SzNM2O44 zr;_Zh?n2y2h}8+PWAWLoE^u3wB|nP)0lVKR)v5-^{Wb`-yu7y`<36|i%$cmEY

` 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

cP#3};QLZ4krn1kK{Kc@Xp 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 literal 0 HcmV?d00001 diff --git a/WV2SDK/bin/Debug/netstandard2.1/WV2SDK_Secure/WV2SDK.pdb b/WV2SDK/bin/Debug/netstandard2.1/WV2SDK_Secure/WV2SDK.pdb new file mode 100644 index 0000000000000000000000000000000000000000..43358ca65b0ebc780985cca81bee75b37c6c4bd4 GIT binary patch literal 115712 zcmeFa33yf2^*+4LB{vfxB!OJGB;+Om!b~7Q2=hG8lgwa*2$3N`K#Yjofb)R0wa)WY z?O{R(bk}VZ+ryvgIro`VJK7bGFFM_&*EwKFjy*ZQixDm0@l- zZY!6|T`*6{hyU!Ab7#QscOylvztoXF({{9+0{c0SIC2U8@3UkJt@?8$%gtOm87El= zQ(d;mJpAv-3Sda4z`K(y2WH7f-9*At)LlSdw^ETD834?c?qwo*(jS;Fzv(T~Sv~+3 z$R8?1x`-1KDU@@nMY_smz#`c`NTgU!2bRc+AtK#m6R^8fFAyn}5x|J7M)o~qE3l_j zo+J{LT3|1!SS?Z}LxJV;ll3CK?I)Jpb6BE#im z;0W0btdorwi;R?Az)^DXB_gBcYGA#ry;Nk3Yy~#RTUU#WmA?bW$;&s2jF&fn6Xe9_ zL?+7jfs^FRUlo}w4+E!2?0%7{G7LCPjsd634Zs<)=Nlq3B@Ub=|9C)Tw&ZjDmfpxS}uD@WR2VjTq_>}*Gab@iL962FNC7Wq)9#mo+^WWEwWXn0=LQ0--xl9K;8zP zAuog-X_G$!&y@3W962br0nd_9u_K2h20UBtD{3E`O;8Fj>==e zbL7}$N6wWyfal5LDUO^krvfjK`3oJnP)-J3B)!(rcR| z*GYfi^>P4sgB$_gDAQXUxk(lQZOs1 zf840}R2I!ogo*jkFd?}-hggtLe5-)CsEBx#;zzIzbzSWEwE>7m{|k zbdnL>iA{>v08@WiGPg9d0>pH=)PFw-wjDu)F9 z@+A(JeEGcMi;6vl2E+W{X$#9*&>5BolBf;KH-^#uhl+mzCjP?GtCqg?imQN$zp$LG z?$;_ll;ZnKb^n)Q%o|sk_>jyb7vp3956hQ6HjE9O&J>mhkwRGd)DdqUNz5B7xP;~T24hbBKP<;4rn(xJusk%`m{b1`%Nw&& zT}jU`=BIP-EXx*fRJdj#@g2om7t#DL#rcbAep7Mr5}GeitXWF)CdI3PiNDVBth#@g zl9!YX{gLIbM?|jxxZIQClD#4rE7evY7a&Z5{6=xn zN)w_$KJd-1TNhb!635Hi75}FA{3;W^k(j5+^9GSA0P6$H2s2kqpAfx=6+=E>*l;vFK#FFIGIJ*tL-^a}?Ww?ypELRhMfL zT<%bpuPT09@oB}EfQi3inTD}^u`E|?RyUyJhIP(h{&&Dj>rZ3iI<;FTzr7| zImH(ge|!dA=A21faFAGY7V&Igre8#!?ZDTK)kAJQ#QEhLibZGBJXvv<;-BJl`D;6I zD&|DdP@I`IMZzae$ro5E=R1W{3I!EFS+bu&Y15| zdx-m8WCwHlk zoSQiB-*GeXhl(F4_Pm8I#}wnY()_UE-rH!tUhyBd(|q_&V(sUMR{|4%G5Hf*VzTNk z;#t7NUrc`GyTs(~yA%D=nPcL7A)R|Bx0rnIOPT!AxyNMem(#f?x>d^0zA92Fd+#N_ zrugNr(OhsJ@zaW-uhaZh#UCiX4ov)2$>RGH?ObJf7%tWFy6;{sx!(we=_9wmrH|aJ z_>|%+ihop;2k0A7tXFJOJXi4!V8_3{G6-uSePt%_KmYZU=?`*EXoccwiU$=hSG*ON z`s*hTsPEH?KU4gZV)jE!tp_mm*H4D3?zq`I`DZmcjQY>if2$^KIr;0!;mZ2K61QxLEPz z3?WZf-}4o3P`pR+F~ye@-&XukvE*Uq+XtBX>nCH?cb?+OihC5#SG-2?D~gXQzM}ZH zV(2(i?hZ`-^^?Ksd+~`>KjYF*Zb+qU;TFhvMgcPji<)5XUGUR{XZ&-+=C~L2CbK%&Gr3 z$lkQR4RT8c_w9cQrZQGq{>)v1a}{rUm*(%iM_l%oU`W?CR(2-2kCVT`Wt=#FCGJs%?~e^LUbg&$dma0MslV~E?Vt4R z{2{Siaj4=lVCrwYoR`+!4LM$pci@{YwXGkex@LA6FPHy2v#;wjK?)oPyE2+H$j$am<@`D6dzIyW7lGW+^KjkF!480in1N-Abm&i_li~6*_bGsfQi3J z@|f>3NjBvg-$~M*=V13~WIplo&c;0$_m+b6?mx=lUeSfAjRI!+O_Et1_@>61Bn^d` zQ**;lmMPfDnJn)q_Qp=mWLc_s88GoTMc#tT6q((Pc$Z>zcbczPoKi~j{fhG=H2(mY z`kNx_dZc&1Era_nGPuWjrcY;U2KO&#aDP98`(*58CH|($V{n-&FDbsQnBB{SnJQH< zPn9nzKBYLY%=jjz?+`S6`8KUb_Rr}+ZKmlex;)8#Z^rr%U4sbHACiW?QrRJ;zD z=?4ls@J)?1RW?>-PAy&d`}=&d@OStBWZ`ce^l{;*$!~^c4l@mdCP5O`+t^Px5UBejJFiuSFB!Y z(wrr=Fwc@h2`*n!m%k~VvW&jRfvLY)(qnl#cQ@oLd2eM$z74B7^6jyvBj0yB@SQEA zaJpf(d{^-oK=(IWe(#%ImpL+Jql2?5<(r5@6{jn{a57z9SNw}&ej{B@0jB=u%42Y! zi!(k!-+A%|T;@sX=Aiq0IUg?bfkiZ z_kfANMKTBHFA{%?Ha&# ze<^m|N0)wz?TW7{K6g6Z=bu45sJOh1<_i?>R{YLEx?FY^@iE0khiKkKA6Gx zr)k|&)9Kh{nT)^G!3nI>fdBpd-^zim&kwxdf#Pn{&cFCT;kj3RG4jDFOD8{(^TXm# zEteCEZwuY>U;qE|=fCpt-}doe{qSG?_}~8Fzy0HX#|Qr%A0>_tB{Y3p-l~?p+n4Wd z+}xDAd|Ok~?oG3ogjb!ke8&9jRVUT)zZp%ZHt%Z6S=iLt+PJkTGIjUvg{@mR&Dz_z zvuV@tp=0qIwz)NLy^~egqj%rIBP+|Fz2>`nhrblrF`&nZ!YQ|3dD^U_^*Ns&v+V0z zqT^P-IQP>>ZpXQwDTU!Mmac{C*9o9*QK|2V1qt>cdmlG@C8>kAc8LvLZABJy$#maHR=T`UzSgagZw>lZenjS}*1E6lG z>1udPAv*)|r{bt?xyxrSY}vAZM^pCnmYq9WcI7PJytjGxzShv}g?Y0Vu4rl50jV!> zrT%Ey(Z2XM_~^)^^_7ps@4I#Uid}1qzkl9!Wu@zHJJ$5_1HXO8dHCp&8!o$e&Dt{u zLi(L*Y?kG>mt%V072&t$>WL=2n9sN>4~5@q1*;zM{ECS;K)D)trTuKUIE#W;h0219qU*-zmC@-!6=aLkY zzM4X`=8Mw`kM5z|Fb;bn9w0;j@hpbY)~x_0Cxmc?*)V}3H`SOF#?PTwF1);KjyEG; zBpi`K#@fgT8<{X5>_b)1q`uj{Tl_;ZHGT|Sb=HX!&O%wjS%@D5bxZQFZq~!PrAr{1 zm4(c*n0ye_Ey=^WSr0WKmHqz*sieztItpJFzXEbnMwS6^qL0jX+Q3FruUfe(2~oJw z!;=YhYd;r>xHVD|zq1Quq6w>TOcen-m@fdAD>^V~5Y$uzj4nA)qzN2p^QxgvocMF7(MTvagr>pPH3%71F{3Ib z3J4QIL96wRO4&rj7)>1jt!?$UniL{3C<_S;qOXC7^r=K19T9GeXS%n zp;U=$5NA7RN%e?HH6jJ2A)|0WC>xOqE&&5bvq}p;(sCKL z0j6Q(AHeY;?7M;Kss~l$E@z(0nI}L^N!F0>VNK}*$7CRt?La04NHVEaAtLh&P!01L z4q#28pjAD2jI?7qDie5Qo_xp+@f31eosy5AfvB(XorQO;V%p( z;Qv$!gfP?N6UaN0f*4|4V+S&73UQcY$2w{S)A8r!9%buAPZ%axlV@eB&L9Yy!?s9J zQ#xxpk909yH>n}1HOvwa_D$)njSSq#Z~!%>v!?S%7en0wOz2IG)|=@YP^;rxJ$bDl z9Tf}*P*b9{n!eTa0BE1mffbxRdI~y`)7l4iF|7ejV>oKjS&1qcn?+zc0BcffBvg&w zUYu+MuAvqP@G%s$THmPD%|>9OrqY=rG9&_43}LnCV=s52&T8q+_G=>x*P$y!4}H}y#8mgHfBXrfVR;$S;<_+v*ycF<$PrE^nX>tRhg zenLhp%nnM|4weWIBB<56S!MTZ=Z=lcm>CeXtojQN##0>B||r>ooiHj(TX&bpegTN!i@lQWZ zXc-bJqQ)#@On{oAt_jiGzp24iAs8kd4#MEPQkY>4K*7YMzHf`_MV+6JI*4w5yC!nY}IfYB-@Xnsvns!t6HhyU^P1g5}nP>I))5! z3>o$T0b??^03$>6gW8vAuVz8rvi)8Xv)b-%lAw7HOKxH7UY$k^!a23xP zvhrk182jg=;;@<$BIHXSuNMwcA>_*x>UT`dbuOMS!)YB(DYDcZ)I{qA)G6_Od)_(G2NTf6nW^&|&NM<0V6Dqal)2-C^P&Y>J z*}kQcG3yBPA=QiysaDZeu+}o)L)}i5e5axP0*tvD5T1ZESk?kcbOEgZ%(PixGu?)S z&a^?c)o&xd(l^Ca{wK!cXZ;snyHqCXbOn3LMl2f zYT6gw+_H06)2=N|JBICQ+}C`1(}AW_T3a@6Z`zl;ym9C59Zjug7p-bKWw|=dJVTwj zOmEq>t7-GT=9XRHN_VrQbH#H<%dYsr6>nehm(PYP9~xZw#*_7fo|^OX>tjo9y6@P1 z$J?G<|Kg4X%TLb!{QSFrF)79});<8<-jnj3;+v2M~94G8PPxxYAk{|QprG-eD4N}MCDz|s0NaT$f_T#;wTU5 z5vT?w!CxuBFeqsR6n~v`k4L#sw_1VjB7xhKl|uTcr%N!%b!Y2r^hp8SSkP)16~PMu z5ZDdlDhaqi7!D!5o)rH;6S9rT)t`R6a?KwJxCTvw6uC*ddAgXGn;W?OQIyXsfg8mS z*+U8Rb3vvEfQeQugnu|I*=QqGN!Dsj>R};~Y$Sz0kctNHa>CCDj`(w}J~1w}ek?Z% ztggW=7XrIw*SNLpV@*e|y?s^Cnwq3bk(;wm0@8LlK^ z)J7Nsv*u2rlJ_<#W+3NJ2V(Ud}2Q zN3d2$Fn2&1!CL(!5!+9|r4jUcoC{|a!8l5R$&BIxD?m*OKEFVdOO_wot-dJ3LwU0c z0J+fRDS%uXWMU%%VA)*P$t|c`zQ3NX9@&048w2|w%w`<38OKxtVBM@K+Ye&hqVCH2 zRHibOsRTgX^66%Mv;82}Ev7-Zu4xxw?Xs)7<#QR=`eys9y4KCFAYX9&YWGDTDNLT< z5fu2Q#BR~;0IvP$x}3^Gbt9TyDZjGn;@3vhf9hXfyfgAv%Xc1H*tq0JGiO}-+Ruh< z>x`w7tfHY|Jix@^sT34pETA1XKs}46ThHP-)>AvjQuP0Gxa2YiT=XF-4dg7kR`?!- zY{D9*#+WF*oKd}@htRP=eo#Ij3a8D+If!M0QA`Yy6e463)Cvy@51I@2A4af&8hH=V z6m^BZf|?%PlMdlcM-^&AALnfDJ;-r3GdX}Ysa5;HA-%nR9t#8EV`6lrFS8=wvr$Z=;P85F|t z-(J#f8m9d{NEozwm|#t%u9aLC@-DbU6k{}vp*{Fqrpf*(unrr)6nU@$K=(p0wg(v- z$OL|-mdw(-nHQt#wBC9gc8SuM$kw9~-tHfgfQD4vqe-{~t8bzvLEx^-np$_a>}qYA z(YUWMS)h*&zV@RVUaCCljN+x$p}$=`=*C}Mcj2+Emt6JZv#Yu`Mf&{v-o-D@tEqij z8J#^OiP703ERWTs!E$kRBTyf?7{|cDf(Gk?J0F2yT}IjvYSLg`-8^jVcEt^f)YOWT zGc8WY6yqnnv*I^uZq~J?W5kWGR`wgvbnPoc|GDqn(Cc3sz2uIyi+*!W`?G^S3J*H_ z{<{wRW#olTs9Gm4j9E)}Fdy6n>_PQTVI5Cl-2o!5sb^Lj1_%r_nesZBy$C?(&}vn{ z{xErChQQ_26Y=YqO)p4SHDgw@;{e3mS&>#Xglk+j@^tH+(&`F>vmJ?5vg@iOH3rlg zq801A+*cdNgrVlET%{dQ_}-pqHD`)u9;S=@3h{>p1aoj(&ur?M4Irb*&au5!Q4;E{ zfL4$SsFo^Uzo0~_#Snnnu0O}1m=IPGbbhFyZb?>kv%q$T7`BBQPQ~9K{bN9XF)OW@ z=>kHo2^K?~!{YU2n7(ua;G{pBKh$y=fd~IxtGZdh;wAGo3!0{u7+4oTR4C@M>=<%a z5$q&h$L!Xsro;r?+V|K~%QP^oEAt0)CTOTFelyFNsDP}h3%Lp?d+_1f)0Z!1GwF<)?898JP|zE4 zjhZylY{w=l(h=8#^5^PKS5u-fd(+h;4`Z_86eB?}R>#XxNX5x2ADE_vs%$^lLkhW@ zQAoi7sJ4$$Vv9)tus4qS#%>S{8J4S1Mx;LYI$W-~c4KVMv1# zM5X#L{)bvfTJDZW9qG{VvjN@nvWw0jfz$FBNmU*IVlshxVFGgpgnW~AQ&Ut5xt4@Q z1tni82bYR)&c?Q)K%**`A))DZVY^m}TaiE!6M%}>rM!rA$_Gz6F>?bwWKI^E5t^8S zHa2UrZ7(7-IJq%}@z#=uv0I+OJZ3OafSRn;x~WMaD#OUrVT=JtXHpLgQWy>c7ahIW zA&j-ENeB56iSZZ_!c$6suGB%#_%2#a7`*guL_lZ_Q^U0^1e&*n5Ur4_8neDqyl&eh zxIr@Eabz51tH;2ZZaz_e)DV%{{5*}SpejQlB7+Y#l=(9Zvb zv1c|T@^TqPu5wUMKvh*3;V5guvV9rTHK0}noB>ez8_z*5vWtI#)jB;7gH~4c09N$? zMoon<-7t>GH~Ea>bi}lVq;_FFpgBC18Ij0A# zc&KX-S%~drJ@j!BGH^EfE3FicW$av+k$8ZbLNqC)vqm61P<4=z5J9D-XnE7#=Efb( zXEv?e*UY1GemDR5wUvi!uekUdKOOqO2df@D`?ac1In^&e_C%+gz8{TwVSJBCw?EY> z{uL0_oU0SKHq7x$+=E;?+qYAGYfa}?7F;CY2^18lnMG^nKn9?uXgDjoP1hT2dP&y* zAbH(yC^uZ3!YXkNgVlj)g3c8*WDJ5liM0UTm8ha@txh_eJB&5suYu3<)11YKvsgU< zJvOR<{!5&JNEl;mt1NW1t>C#K3k=AFqg!!?A^0!`M`Ycc^GqfXr}P!MOQ0eIcObEL zttml_c*+)ubaMxCGk0xn*^*MxUz}2T#W!xAQN8S{weizl2rvHEDeqq2^0_-pZhG$7 zMdi=D{NMxMJFd*gLp@`$P}d3VieaLN4?di$Aq&%n1UY_VKu9h#6h?4@&2;TrFeq-X zy&?EPuwWpIJ&;@k=s_5GWV?-yNen8-ngJS#Jst&>PBFKc>G8VZOlLTg03a7n<85H& z#gCyA2Aja}766xc{27ED&!}5O`eorbs0vL#CfQFlE|mgiBsv+1u+H3mCjJqUUlRXp zX;hZvV}}yjwaTG(C4>nPSw@fe{RL76q!$qPZl*CqZHJktO@s!-vY zoX|iG)eix>$M2hE_tVr=0cTAiM?*1-e({Hp1uCL~ketPFY#Ev?`kE|CHB^me@tq|} zS@bno9LFVP(91jq#h*bQkh2OxavtBCVe{~d(K#WH7jUs&={DdO<9M^5NB{UM$O9vj z3U^W+WYud^)8tW{kjF2UWy}K?yOG$b5XMRIx3C#!)EUHp+7BvDwVTy*WeLp(Dh{Xh zS*3t%-(&+P#l=8TocLQ<{lkJ#`&NvK$F^UGf}zLL&JI&jPQWm7X){1h@D@W03WDvEU#a|CoO<(8?Iv)1inq`W+nl#hZ6>)HMrb2>0}4_fDem?d({ z0ie6l@pBQY>PRH2WTSJ7N^k7tYbWP6t)bHUARL?~C}Y#Qbx}^CTzXgHaF08~+mG(B ztPO#y4#HHyeb5T_)a)^#PK!*hTGrfCyFEl^7)0g~6z9l5Xu?fgz}!SO0>Zw@TGb7y z`QxQchjXdDog>`V#z-)65Qs5h#MzBcU_d*06F+A+PH#B7kpm&@n?h+!Hi(96AFug* z7A(eTEsQ66p@YD_j!yLKSt2!+x(A9>0d_iAm$FXOt97wmO2c_FUsUUuULDJB05eaj zNANLBh!QB*$Q)JVPS6n+Oh&!IrPMR`YJ&|4BX~?I3lN}^!2uD_Um3z@IpAgh>uarz z8eVs7!QluqScf!l+%-jGqtf)uYee$Ov09j?qah`sChM?rz)p$P+Fql~dk2*S8d)HZ zTtw1%4i^Zjm{k?YG@w>J?uBw7Aj<15M!8lL*)27ygNZgWfkp;Pg^V7Hly68G`}xQM z>APvVyjAK*FRWTmG~>^APqG?!tszEoPYD=jy1?uf!p}$RlwRk2i-SP~K&l9X?%TDx zA^nI+c_Jceto?0>W?(X;jRC^p=H?O-lN=5*a`>_tYF{BtlLa?3KM%x4#>fN3kD@Pa zasY@3z{xESa8eG9%?+rbl~yOT21~H46fDr{bvg@4Zb?=wMl%m1=bo^Grd|>{IKX8h zY(59Gjky$O2$5+$^E1$~)rN~m6>msZF|GkW2fvP7DM0z)<@y3$D=2dRU7Y1^UxFUAQVGfuHOZQxMT$qDkm$@ zPQpG|YiSxc4HtEr_)sR0%E5fPl?FXxwA!iyb&1^7qV>o}#~Rpb*Wo$zT-zQ;N=YX) zeb@)JhG@lAFH(})TYI_ub9k?hnja2aZ5qQ`ZeO4!JauJn0yEL_3YLNT=0h? z92xAXNSL*YKvJbgE`(ajKr2{{%=~QJblv3OSSP*M9JRdxc!0sRY9D2LD=;M&{3zkz z0b;G70&Y#{WA}q^%9-vAhuVi6c%WAA4yY?xC7K|;O@dL^WVz=S8DzpxXE@-q&NZOe zuE8&pUqnA7Qcwoy8PdRb0>c_CA_Y~tx4wm;O*)e*d~dmkbfF&HDnbre3Tr}T2Y9HA z1WE8lP>=+JUltAN#&_5%83YyP8eC5$+;j2GY)i-p;Z#`sf@0|5#&uoJ=Zcu;;tGo{ zW-%8erKvebeh%5`#ZeuCdLt7?K^DcRPP4nC(`8>Mk-%t^ut|vms06W)ejUKz(&Exp zhLtMhf<-ECxe8IHQx#38O90$xZjpgV2!AjjZ!p|-L89&-tS(bw_4D(IfTJ7U_41kQ z#|7UIz_q$5Aa0UlV)_US{;Yhs(+fI0AWE73LJ#Mg3@LT?@hgQ)7Vg|~KLM#A79 zxS}bJ%EeOiC|V4tRd<;%OsioQm}v3Drb$dq7Bp>NVnM7+FXG`(tJgzKiH^RP9})(z zsu~Q^Rt5n7mr@5({Y@k1rjbSi)@n`GS50me`4xr2VpF1!I)$m3Y;0TgX)#ngJu?S( z#R>!7#M1cH1HN(1+qN>K?J~km8??B&sbf8lFx0bj2JEyN-_qF*k^O%uSW!tYSU$nN zVS|2P=wjK}$gBT7<^`(^c6f$L+F;6EOF4p3zBYd z(u4V$mI`Vh{~+9zHqZ(e{J{W6rL~M*w9#hvj*FVywgcMnhbW1{qH(=s-NccgRwe^O zN%~~a?o!~g%FjE|fCz`tJ!vdM46^Vkhe0cyWVl(w1!lLNd>1ziGIaB_6{TJ1Ie+&O z@smXgej;uxlfHAL1%0NQe$Gnlad=6(F;c90(!GW%0bAHQRZjx-(Ahj%&HyBq+H$zb z1`n-#^N@fYI6(peixnWwr^1yrl*)C%Vc1|Rak<822&WD-I_T!YX&|EqD%j-fR+1@Vf)wu_8wBpzh!9+w# zY(|LfTHTR{%VnVJ==uT?OBw0X=v9W_I(<1nJ-OUP6#V(A`I3PKp?wEAms&G;YoZI3 zOe7z^NJ#LFeC~VVnq)HNu&Hz`YLV=1kqPYi~>QmM&9wZQ=j!>C8g+ zbmj?JP=J5kE1&tyq1~Z>yj8#DSAB-Rbp9(RcfPWq;jC}Xy8OGVYhT}a;>I7e^MD90 zNr7yB$YX6*qzd0<2laq*SzCbR7h~;#gGbm1UCj3Y7PHF)gbB6`epyjaw}>E`*Jg1B zBE;hlWx+EL>0`QW3>5i_6e|NPJrcr#UzLCK&(8mFdVn=&VxTI@Bxl`e_+Ke;4tK@y zgA*%^L3Ctl4?(FZemNpI6BDLiw&D4*@9G{bO!(B)hjMi&GONPRXzrQT}^&USp5#`x1`48^kVzv-Ee#Uqp^S7HnvoW7H;&v0K8_?ofGXdlZv$D6 zB&+qvXj*`@2Q}h@3xk+8pvpJtLYwtSvZnKhUys!KZCP68o)zdvSqA7R&O$mj_5Gjm z2r)~WRMe-S3B*-yovrgbg(^`s39u7C>zmHa`X-rdU|uaMJFTG#vX6qB@tm40*wLOh zT0}TyUe(Tpx_GQmB~?rVpliw2Bct2@pohI6uZgl)mHQ^zV(YzIwc4^%P=F08K|aqw1H+1XPq)2cdTsfMe?W@b_kC`&SM3zEr z;5!rI#4qmRbjpS@?SvhGY(kh2B_O6g(*`Asp2zK_Tm=YS0d4HMEJQNB>N5iZk#)QH=W0s$r%(C;lCzJBR6Z8Q+UGij8Oa?=FSMX(l2d16;b zjsPrWb6pPPX!kG{>5h)SfOJPQ-C|xd!ur2LR7P{4{yF~-}$3T2X$Lrbz$V! zyKX615B~S)h66+pPUOhLtRO{K(2x(8?C}no9g?akB0b0ew~N+Z5Veia2jDo8{U|yM z?Gv_v7hR(`i3eUOL|v|FneZf&eT^xG_$aoUBx6&kTuFDw5T(-fpj#mrKJbK7S4Ky= zSZK~|i{FJ}bge=U3zy!0cA6(fbw~>p>SlmMkZ|v8>{4iMn7G-69~~;_1~(5uA}HFE zwhr4^a5$X3zG+IV430Yu&F*Ma3xiPlV56ZFgcr6IfzX+G;V?cz12O>NsjY3hHWw+* zXlmTyT^;o6@ua*Ha#GjIcRsqi^z^k~oVl^#AJ444F6Z4X&kUP(#(Upvt-kC>6MlW~ ziY5&7rKmejXqk;CHR-jF_=TttrzeV|PG^UV;h%nvsbExEii zcx-wYJXylohEWFkf{9xD`fgFJbd2^_?rPrGHmzw} z9&eaf*<;4x^5+jO>oc|23sA}em`bs` zhY=|sfNvO~YPF45tTW9ziJV+%v1GGtWBVAVwL?7VqbIA=(b=wZxUtY*B!%JiUkj}OJZZrJ%S2iM_JxZITGgX)`Tnhqd!fsc z)-9;J)_=G1NcN_!C5)}^3?Em-#I#@S9>-!RgFF< zgaldIn8elkeQ}=iAA!J6MiN-$GCeX|O)!GL8>gk7GJ9zW%I_ z$Ko9Z`{W3!YY&70gHP{X;|QL1u~MSyiqyFS3crirgitn;k;|m~aWioMvnCq>5$U=a z(NGqc=myYx7K2a|=DxVSQj41M*NevSHVPQVV}o_1RmVqwm}^2v&fJIBn|3su%lyO1 z3_ys0lCmwH!q}(K!@z%FW!^(4n6!1yfnzv&0!I&#aC|eSGj2_d5ghRbWbvX(XTtP- zdwCtnAK7et^Mq{tL*)`jKKIuTes)QC?JYlf^*5F0Z#cTH z6di$N<@DC42>iDR3UaFLAtW^|L&iDX%h5w+ZFcnaI06|+`3;iAUOw+Trm@Z0s?`Ys$|F;w|D$?SC@dU98VgyDJh(< z51o$uhq5&QkR)&53~WP49Iw!8LgWM7`ct8r9)=NnESAwp8hGLlx`Lu@wjDGHoJ;f?Iv>GtMzivn1&Gzc z=pzgGgaMwyOHy~6U#-03R~2u+dU^4qn~xppdhhT19{cuL154MBy7jfGi{8Dh+w%B* zJS>*mEkJrMNry5c)p=#U7Y`nr4;G;4)GJ1tK-Z9`M%Too3n$N}#W4#f2CB_dhhFOj zv*=aW&(DITGA!2qiD%vONe+(B;yftxR2Jv6MXME~N7C7Kq)DWJUWU(jzJQb%ErZs{ zp2%<)*XWs|Q95kf&Sc~`ltV$Q83wX}8>QeW^HilU8w6OTpf{}p3IK|Ndfq4sq?6mG zieMq@(^Cq|6U?g;%o`HSjS1$a1aq@%?!xxIysdR#)6QgZXnL!1%v<+eJ>d1X|9a@| zzT;;MIc3`B2V*0Dl702;pMK;1*%y6u*P}`iRf?e~Kf%mfnZ~^&!5m32^JyD|Q7Tr> zP1gsXy1R1th0#s-UigRHMHg>i`4 z;}DhjJc@vM>=8`=#~3D&`B&|EO$YDy>*V(Or$bGg4#u{p?)>~%^#PW+O3tTE{1G$x^~HA#~% z>_k?B5g95@`QBx~LQ^JQpRr}?iaQ>DeUfLG?Lm8c3<(_?l#~}|+L*o<@o8Li&PgZA zHLtEC*4ZSzMGZ)u)@pm4h>78 z-03kLBFe?=4CJ@#b3#j@nsjj|Lnv^me5zKS!wvwwgc1n3qR?7Wi_?<|+Q>JeFGr|B zz7yP04LU7oUwHjm*G}!5*PNSYuF!JiQkj}pK58&?D}_XdAT3xQ)@p>{1{-77gmMK$ zHnm(XLpOg6LtUwn1gXKtViGb*C?8clh{updpT_3$Sh9qIm)#L011~Y-_&7DDRa@MK zhihzIc1s{9LF`CQLgObnR_uHs=I8?LGo#wG5|qU0M78Hm>>Ht_DLHtU@c?x72ucz_ zP5NSElGWQUP*vE4FA+eeLVow7>oS`+P=I(CfYec6V$zMFR{Y#xr^>^X=35n}_X@l@ zV^8Gj2?%TT)UXm@og0Z%?5jLctC@v9Y_7j(w%WXbehHN7|*h(2fBT+7d;OI?z+6n8qin zQ);rlNtz7zk@B_mp&qbxsa-F2GX1J8<`CbsVTw*k{2?-fat>!tz|33@t&|=Rid7o) zF$6VJKup0{*~Oe+A*KS_KBr({6_qJd(+@vUm`yb785~An^pgrpG5u-aq9&H=^dY?b z;KNP%{>^}#|KO$PKmX*GN93nJ`|HzZ=9fQI(eU>>R?plAs-mT!N;M21pKo?) zJ5j(E5v_K|DDZ4Tz6{})xrUIcF6>&NU=+X)u9OVnwwtzoGw9Zlxz6jmNA2|g2qtLg zS3!oEbt#j>vYs0O>zOD3R?nnX3+iFPPC4yn90XQnHb>B7jLBMMzo%k9s)EPS@{vg` zGXbax-{v3*O>_h32RiJ>JuXt468zd<`4eZ4T@LiwnbBlzHKowjH=S0pO zu>!8E;?`uXp`dRd1&pMtIM76D9HF0)h5gbqn3jPMP4Gwr>#HUlpyS#J4$IlM^VEt1 z9Hg>_aSbG0YSzZrh{oqkM%x?A-H^e|9sp_Lrhlr|*Ile~8SKA=x|keT%v=C^dNA<_ zAw?j5E3z27x{LQl$XEsgU}SI*4;wKAW^M-uVp7ON&5E9yqB1QX0j4nuz?!`K9Oz;b zTRb~syzoZk`x?%*bhoavp|6Cgkuo&h7#HYADjm$ zV;2f5kM+(V88a9k5DuEu8k62l$QNC>?XI)^>l1iqI=4*~lm+zTOmr^SlIAi|1NNel zHAQ4}5y*fPp(oW1O2$BMs(q+#HbrC<&t+hm44QeB(0n5(X#y4h7ETF_Ivet!=d&?w zf+%qKGLd>WAnA1;!veQmRq^VWnQP6}=&6*c)AO-grBXg|4@!h|G%;-*SRLiwI&P{Z zT~f1mHn7IjdKNC7G6WiSM*prNoUj*tkuR_ijba5MiPhYY@7%M88 zwUMr(b&;qGn}boV?l|Zew52(7nnZ&4h&FO<&!S?De+FSEGKm1owB$*}PqdO*yvKeP zj>Ke#wTrNaW7Nb4uoy}Mx}!W+j42grlZ7Qnn8>k&(mK?ZM!4(d$(njrwRp> zP2HUU=)LbmE4i?XY9;;vYQijlK%#d-j?4!DwG-E&nmfR)lbJY2z@soBJr5H!c?V@! zY$H-MV|ts7FR_}Z`!JfKAebC$WhO@qSWMK_2n*P4;|RMeX$K(MW`x7bK=xx1-fLnG zzvp9CS5bn>J>)0d8jJ8PKejrv0vVACs)oQA)@ynN{;nYjV` z7{4`*cgN${2CVYOAG&p^V4vJoYdcRX^^L!RZ7ythDtLE5%UfVYGuGj{nox}H?%V^- zqy_XCet{3$p&5GdVPa@QL{b*_tpv~4Y=&hGT>#-sCWjtLfI2Ed@mJ*{&sB^Ih!E7O zPd|EYn_JKUZe{|2un*R%CTrCo)~ct9@cl%{T;N1NxwDOHXFXZyux2I9|`J^1Bvhtg@GWshN$%PwpGDRbxcI|O>j=V&lPi{^(09E zr0D*+`T$9UDO5F_G?>8-J{!I3)aI>S-TzWo-Vd!iA%{+>y!JEoHRFH#gXjBy@b4-8 z4)=Sc@YIdn&RNzxW9gf7?)t;y_q{kB!}Y;jRmZ5PFUHuY9G!7t{Op#i4*D9|TG1Hn z55bL;aap*4&l#E?2<7Bl+cZ3H+XhMS$;qYFfeKklwX~Ea1n7fl*}j#*SM(1AU%}uj z7#yH4_GSClBXNY^un35r@pf>dwfSZFAFh@lK%K=+x{Eh01d zwR`kS+BvDIRyK?SZ~HTMj3rT<@mo=y&hbV{M;0Gf;wa3D#ALo%Y*?1=n*?BEt8yCA z(1VyYpW$no^{7S}&ugIdSHOD{JA_RvGr*ekWhn)!I1~yG`6s?ti||NcQ(K#jVof%3 zO!^OZOJz@PX)>4&k42dWv*$On1iW%h&ef6_K)!F%iJYC+;e^*T@=K(h+aBxVU+7Zh zPcQ8((um0_JTB>X71}o_pj?~4WsJb8{6U}&2i6SE<(6PY)_jw01$*yeO^cH0^TCQBh1 z7?>n|X&CEV1;ceWLIG<`ERr^-ejAqRwG{;n1SUYzTyKOxX`P7>srl3`^GQGe;JXZ= z%(g1NuQ3AC86)m$ipZWpD8^)#6dtxQsIPv(60@M55Y7hr0(2^5O=^wGz?G;gbCw7B z)+68Xtnu-T5deH*X*61Z;a9ngU%)oXnfAyQ(1O$H`q6SdqHY>o-ewG#^XLQ6l@svd z@K#Uf=i{~-x4fYUbFq4!p&;s^MN$(ai2}BVDrXN<284s~pSs1MkK0sn*|ld~fJRw| zphyr{6;74ah-}&bftXFV*(?ko&o}8Snzb^S2a-)Wlx786dolXjl(hjQwgMzh#l&N5 znC_@N;=>cT2#0-G_+bmy0v_Mmgjc(ifty<9r&B*x5m{56WY_eBP;nLtVmKEoj{n|t zdU}W`X^GMFyI6L>7(EaF9Rkb8lG1_HUuYTaOQcsgH-1SKPVE)JeF8rkW)=3>Jz%F= zSvtnSwsKW)TUjL)-s{(ZFdUDp3N}!+!h^L9@RGqUK$&~VB1Zi&mPvy!kGhF`;l>OS zbXKR^Yvt0X8toCn=Pm7^`$T#x(InTi!!?U^`Myb&D%2P?T@PHR4WlK5!yL^L@(HB` zb<6fm>Z@)FU`r*koIv^j`ovj2O=Uqh_23nf{_)HDVFX4x%`glfisbQ;{&YhJpuGTS z=kRANd4a;~Bk9TkwI(t|Kb-A^+Kzk+spqU2i6@VHVP9?l*9r!(A(ryXmFS48{KPdI z3o)5A4lFV=R-LRO|M`eEp1d~o2DEIK|RHv~k)1a#D#>YfyDlaD7**N*{05o8fpnnSRRChFD@fjw8qgk?9@vRO zOlCnZ%OqYB<~WW3-p&RMqgiWa!9`7a%LwW91kd`>w;y8wB4tHX| z=T&39bZp;TN4;!?8~A8noCJf}d*cd{>UY)jNuW9(;j}YgpA_f}JYTo01y}(nE5a&d zSrIbv0dAhvnzGZlX^f)TjXRrG?%mOvavF@2kPF|a9Q}o-ewZ_0?Zfj|m6x?%y|nsR z&e`qn=XD-6>A;?Ix^&xJgS;dwA6Fl+xa1vvr9-VcSl2M-I<5OUPu;y+4cMCK>TXT+ zJs}q@!oL-jFPCk8b==C@SI;c`=fr=^eB$1g@V#?Sn>lCfyt@3ao!olo`}~A-mtjz@ zSo+eB#$oz?c$}$t=kR1*6xLlp9H1vP0DeUlw|EO^a!F*dBB3UOxc{UT{@2CvPMWPtcW5Tc;Zcujk3UdWw%w;MDVloKFEYTex z+yFLC=!3%LoA)*~?Mh$zix*d3SH1q6qR_u8{yzP~zYmzR?z!)F{=v)p@BaGoeOC;> z|4V26IgVx^y>qdp+?zQ8bX7oI^Jj>%72T-J=3O+?Wha>$WG8)hGAV%Lo06jPLvN zZQqYyfchO2#tCm!K%ER{b00>^P+MAM7St^!!}(2~;q(oFx?x~LK43GaAWqo1As$i&Y^RvtU&$lH&eTsrcrCtddW z_nMxYa>r9Y_}i;XKY#Ib6lX#miUX~us?UPD;h}U&Ae5P^H4C1C8{Gh3quX@rKtbKG z>{kunaf}-Pb%T^2uZ6ev>Elel%x4}0+dEz90;!gNZBvk?MMm-Jm%|LTZ#+{ToZ+MlCZ_@y{%AB+6<^0s<0P)Gq58n;}>_7 z^6264%~+&yT&BoaNfY+MH-l`)WXw?bW@Pk)d70ya<|g=N;0CH;K72FKjOyP8-wZTk zPE!NlfJ`M0r^jxGZ-(kei<{d~%Ht?H8S`ymEo7*pn2eeNU$elVs|4kFU#|G&a}Ry=6>#EVWL?0@uf{ zg|}$~Nv#1nQ}JaiQ~kn@;*RaxQO092itd1}amSf<29AK6XTmo_kz+EF5`Yn7`a$J{ zuJFy+(&~1@*9`l0>~ALkcw6Q;1tbHz(A47hz&m4G8+&{!yffBCL;O?l&MeoR;G0>l zPtTk*=w{!Tk!%bfGx8cbU{GdX=u3)b2Aa_)4}ounJ{c(w=qTkez2Tct_9jwKXOw{P z3*eif9-srLO*2-**!qrq#~kNSCnH&7IReO-bOYOBMrMuM2;Yn%KlXTgM@iSS56D=< z<2iiD$Pav$Gh>T@re+OiBx}O)mJTE1a7o74v5)Cb$8dz4fz_Bc=X8|u`1sB6&RFD$ zRJa+$Cn_VkZZL_1stmFlg(hGJmVx0Y*ow@#!@rNnoUWLNV#VweTrtxreTM5~@hh1oZ#-eEU#B5XBwr4Ud zXm4S`*P!6$m1&rm8bD1U*8~e3b7UHpH?pw0)0^G^Z}}szFP0?adI1Lug81{AOX}S# zobcg3Kv$*;(DN4DO@V1RKKtmd1(-|{PtWA>4dgsOao$4V%Bp$UN>6Gijp=i6*}x3Z zE>R(@lcYOCHi()!ZJ(6%of{t0-mGV}bvaB;rnp0UHQKv~DsJ&xu!PX-AT(AlW(&Y; zMy%%u^N!FBfa^tEDk&vD05}=XlSqM6TDXzOXi-LsG8_Q=mAwAelP9c=%;Wwk&$XCv zdOQqknmj{duApM4gs&GAGZg?2M9+>wB(S)o>q_~ei*=J}1?1ydM})*OtFEx-iP!HQH?deckBi>~;H=xsV4LN|nymj~l zi6&9X3N`hY63?lCTy)x#Oam548ziq_I_ih7>ELX(?l6{1x7Iz{S0Dh6(&xe%9fyK; zCN9M>X2~}y69A>>aXR#l_NtvV!Glx-$|b)N;qpcJovH4Fuz9N5)#_Pe!YVFRj=PG> zcU6Xvvw?#Z*bL<{E^q{^#5{T5#U2xbk!!`dec?B71gg?)U)=mbCuz^gsY!2&jxjey zYy6v{Q1n{2`za4Rl?-`ET6e`sI#Ph_y!B}(-yF(wD-ASgDL^b=^1!>R+8PzSy?gUv zXHUsN-QlWaNaBB@&YX(|V(4I1xq3*|q!WT3GVjvaF4OBqv9+GGxT&KG>y~6y?borJ z`YL#;5^JX^Zm#-jn_|D@?wJY&!dOT_0OnZp#4a{;fxdX8a)FOZ>A?W~o)m)cR;L*X>6uI0O?&MEAAw?%Mj94q z%%&503#rLpV@1cSe)DXgcA-g>XhP{IF?XhTP6DX|yz3=_epk<`A`MMO`%AD|8LSte zJd-|i7i#@j;=7hWbE3o7hiuiPpt3_AO8ZfAH-0YIi&3FB77R4D3R$EB0t@y`yXV$P z&>lOnJQhlYmz3!Su$KT#$%bb&+NR{0DoIf#qX4{dkujNgy=9tqM^=8tB99+>)?tteoD&+4vbH66FYJ((+g>TP)cFO_ z1n2`iDK&DA^&}qCzTPO}yf#;|YndfB=lHM-Hs}5WNZ40KZ^b??b9?0IriiH;KpSOt zpbo7ZUyw#G$^Iv`sj~~Kh~I^SuxnZodJQWW5Rpo5E}_bxNb=nd3hitsvRK1GqYVd> zjaJUDJSw+Uu&fEEZSmYTHiH(BEL_*Kr<4n4v>e#AqopzVb#4xHKKIqiXI}r)>GeCV z`)=ns^{)-D8F+1Ede-Vg!@JFB-uU{sJI)^3g9UI360}d!cpUUIx4`*jh%p$0r7)^U zSM~BLPqjE+p9605#S zOC@Rww3uToF!4+xz^+oo9~0E|Y7k>?z@ZIrp?!t!rtytZU#et9W4z}T7$9YIh5l1~> zc3tvi4i6jSio5nI?nn@|N0AL|g~kwRdzxg>ig?7xa0$EQq!~~yBatmvuyq+*q1F?! z{DWwH$brof32*?V$Dd*c;b@l#U{Y&2@`flV*|=4~RWC+{FuF;gzQDFDe@L(p1Pu$} zGfvp;)Gf~=--W1F@@_R+uZmfctRaUxck+YeccSVQRk0u)?+>JaD??yYu6V8(B_5^| z#R2ZRQyi7flrl4X)VD5BOr!*=BS?FdmjfyTxw(j$M4ydYADlq4 zgB!bYpe6 z`ro|agRK&3FNmCil{+=z9dh2YF#{7FqA1{uM+-ds3Pkz#c)W4Tnuy?OUj*()3IIu_ zbXF9Bv+scZ(`z%B<8j&9bYU?m9RTXhctTA{55%fldo%U!LI|^IblToxkUK<&KF~8_ zYZmW|HE>d=dj@_xcmkF|$Ftl8RTf zdLl2)6M$1UROCi;>b%cdtqD@^3chVPjO0m`K8R(Lq!PdiHxT7=#oI3+3^-fL<~f;s z0jLQp5`4kdxLFUYkJWU9y;nW2KHvztHi_hR;jE@&T1_Q9tPMf5J>Y--LDu=d0j!Dh z8K9nQ#63w3z?#ZrTm+|X&4RfuohyKa%-fVV#uD{xMnYEVM`XL_b&+9HLWT)#5+AyQ zM1xGF)dErjp-@bim2jB@%YpXG6m}&Lq<7D)3K9o5e%m>fIFx(t8Z@)HOdDWN9$6E% zp(z(5S+Wex72?WUw5HrqXZ1l`Z6mqrB}aM^Ye*6K7P@@Q=e!)XXTsM|7g)WvqyXxUm?K< z2zp_>ns=bmo+(!o=e&&=%=1|tJ9~i%j~VCBx3fkL3C)m}Ooh_oOpTI=W4Q=kz&mdRtU`dElEsq9p=38*e6dTS z_RBuVkI%HK0N~*-En)n5_1e4mG*tu#Q{-)){vE9G_jzOei*UWEl#8 z!BU6v_DGz25DtrT{y>ZUS_3)Nz{~-t;e6<)1}+&JH#O-Ui+sANwFN{(R+Vc1jd>Yv zIC64^rMBEXZsS4~$0U0{zsv?{jNolftY8kLp2{x7omhC{uS+&4(Iq;k863xwSs6W0 zl%7UP7#nHDzl02(W|X%F4@w3)s?l!AM>F|jrkKB26qR~vWjOI}C6zp!%Lg?o27&ZN)I-d+D}v-h7}x#y;1g@1VIk?Wt^)@l3uMJ+4dJL_k44-VLW&u<^C*CNuyqIKKpRS}_PeO+XqzO))u{GI25q2dD{d zJRt#Vx$jmdCv#!9ip``-B*%NeuNya^^-=vaFZz9BrF|#&a|Ng6&Z{4!#ve@#{z6K}NdF#_H9+vn9S54@bp^X|Kxvo!G?*kONn`bF^1HSpM6Y^kI<+AsF zb=eCqed?9_&K&Uh$$kEI-Ogu^{Qk3lzVE!>E*kswvX^iBv&vNU$e`$DRpY%tTo$mP z!TOF(3f6a$4WT9tR+Aj8CLvgq>1wbcGm}yqGA~_fwJs_Cqup7x*o`x^+0;h3t~S^R zEV!CrF+bD#;Ypd+kG8>VY7NQ38WMtO1TDfutal<0o9RTCkv2&UHYJ(8Qxe!~X`Ak{ z$)+|P4Y;+y1$h7q$pzCQI*`X{Gm2 zvh*HGkX}sY@ zCZwnV+c91fCw@89{0MddBiL*K=}g&ae7(Ttx|>zxi6*3mRCRUPsC0eI2o^E5;BWV z-oC$^mQseXrcTuqKrO#K6>3fR?vA&q=tl7n1;a*W$p(9pO%DRFuJMIsN0Qg5A>h<=SG}9DCeaq^nnWaW**swrB(gfT)qtA@;p}j`noHV zT4Hmd*Pl0$LAbmRAgut~yX$k|9CVr?IR-}zUZ}v}nAURWM4(kYaFHJtarz=6vg8PB z_CPb_(T7nmYqV2Boi%3r=V%yw9&gRLLky-rkHP1$)&Y9iE8DkX4qlesz~FknaVGo& z4`<*|EaH^mV_M;|Y&9XBG^YHZTQ;pp;o8sS*k~;B+QJLWTSyBa95kslDpP8(OfrSO zfDpmVwqW!MSH}@~9j$<-bF$ytR%Y{=T1z4J@0fBZ%IASTRYf0}~77mb4C?lAU z=d!?a2cTZf+L^AR<ne%`N2ZWWG;rJWtqE)7^u&p$jRI_%R=j-OX>&wzhE6F>VigZ3QJC%_#43lMcYiHB|iOLg3d8pHC8Aq@a) zQfoxE@jTQv`ldoTo=bqQ_Ba6j#+AMG@8toHQom=?KB{;@bL+m3FWA!?EAKpGpFH)< z<-hE7Qp>wzu6<)s{6}B7;Gs^BY-~Ph*8S`Ejq8DvZeFDXwj1;m&=TLQkqL`tiprFoS5)fpNLR3Tq5mZo75yu!*G>D3dXb2Kck-Ui+%skq5hVFER zPBcj;ozB$JB%QH4!<*?%^i9k>kKMWHn7rEe`}^%@Kl=<-v`P29|J=*xuxd}w9@k!b z?X}lld#U;!Rw^mZCs$*{6wxgdF^{GM-!iQ22deqeYM7!~Hu=1(Z`gIslW6~Euc&sM zd(1cAas7u^p7^y>-hJ(Yw_f+d?+u=L)7$pF{zpB>udjT2!`E5iveLZz^YrlhgP`V_ zs%iwuYgh6*N$!ocy8AuK>V*31P%0{a*QGp$$qjKi; zcpW-Gov_TKPXHtZsipPPekLDs0`W7puVc$6S&P(iYDDDHuU@T807)EfuR$&>k9E0? zyQq5C`Baq$NS20jS5t;5o0hCCeK$zL_}1c7VTzkmKE`XH4eB(yP8O1#tg1JGWWd@H zwis#P#L0kU?p4E7(j5}#PWCxcI#$YEHFZ)=>6$?5SN5$vWp>O^Uz6FSwCu3vy^Pf; z%NSA`t?mP`2U1g@$+@y_tP{J#Q_Cp0#m;t*rwdknMTEoh0q9j;(0MDy4`oI*#oCox z!ILXbDr>PAjD{vApV(BKCv;|9t~R>lGv+A4@zY;{NfVtnUog$+)CfD zmF-t$Ikm9%bE?=naTI5H_h7cduC${7aaEhh&>4?&WLCY@fX$`y)61s=$XlRGpe*1p zyBuL)?@(c^E3yzD7o4G19fzfe)QDTuH8svmwCr$Z;?on~sk8SeLs+WpW>+A70h-ye zQ?R$J2m>dv%MrOZj!yj*rEGio!TmsG1hA{CaJ59(i*ln_zf1K6AgMmuWnlfs6p<41 zv9SBEcDk3XdVd-53&5HirMdAKO@mu7)}{)}*n9 zjp;*px$Uc?hd1Wd=x)p>l){=OHOI8N;SwH##O3`*6YqH51iaw`ey2`A&I7SDIc%hf zaiMBit?bRiPSNxP<&EuK&B*Vt1e`8Snx}J|Qik!5XDaZhnm+N!FY&GE6V~C?T8CGw zJOCy)^~n->n?U;H3dvST6~!ucS<2Gp3U9Kj|F&yFHq9f?sB#D!mc&KPMHw^dsK1x@ zK#)}Q3G{Y$9DMMQg%)fc4qqWb#yop1xnPS(aCeZbl{z;`psNA$=*YqM8SA8+Jz3|d zNtPKxq6zAy?OM0AIayx+Ap6Yari;bN>hf@1=4uIE`W=h?9DNE%0+0GXi_xn8<9d+p zOK>Vc{Dz<#ZqUCaB!oAn87?G*A3dMOH0}8`meTHKa!@zekzA=n&$^DSe^Te}2SKxw z%kZEuI|hmEL26Mbq4Y?j&YM8@Du8=+`U3S&vwV{;y!|#r1ONH<;Hw9#Yu`KbtzX-* z_8Y5ew=Vj@r}s_S_ws?~Ri^*p@Qu4af9$uH-t$50TkCl~4#F+VH2Z|=s7j4HeT(KKd=5^*9{+f#k_Og{P-#Vd)wiUpLBEQl4ri})$jhuqo-cGc@4p%Ttci-Wtw1G15*szFk?NJ>`1xEKP1`Kw~RXr;Zcm9Vbnp$f5H>nEG>E zmMM#IGwEI2gsSDo9;Px(|3m{AA!*<&Q8&f;t?hM~DEUd~_S<*gxNoQpv^wa2jjO(F z;|0%p<690LKD&3}q7SeB(&W!PdgL>o`PO4^8n|L${G9uqen$PP!hC7j$D1!nqqOn< z^$gVv(0C<=3JdKd^oa6fAIXzO>|{)xK1r^l$6q4%2 zN&>KyH+e1oO9yS&8#k)Zpp-5ahKpTsbb@0(tP^@{Wn==*@*UpG>&rSdnl4(yV$wEb*Ejtx;bqC(k6SQ$pk`kA&C46t&8>!!7}$G z*n=pf?8z42$=jGsgPXiZ$C#ngaqB?ZhKt)UX8aku?$~`zQt2FWDm`*rb>g?r@2|Z3 z?$5pG)+_(l%xr>c-#Q|2#|J^$P34>5yGojwYP&DN_3i zr)0y;)JGn!-u>5~9oc)y)TJlA;MXsC@VDDOxbGvM|JK##J#bdnbM}7ojxYY=!#ePu zHHnv#A~U5Gka47hff-}_3X@vNWsxqin!bT#NCz+q*^SD%Dx|3!r)SEtRD-|3jnNR% zB!8%4FgA2}RIT9ttT>j~LPlQJc-u2~mdAxGnO@FlRgv+k!<^5oQUw8hh0EH^!)96k zEY-YJCs=G~(yqqd8O0{Y-eJM8>00u027SY2niAVZjStWiI*;pUMH_vipuJ;Y2hTf z4i`y350t5*5v-QWvC^GgwT)o}$090QliAp34cb^*ZY5&8`V0W3$V_!a9HUE%SDBY~ zG~?ZxVocTumDi{q0GlFe@h0SRLtDyM<|pn7HK+RF9i@0lahN(Y4UPOKcG1;M;_eo2 z{VS^ap604wR#ZKr(@^zVnq4Mw$z^I2Ae~(HHG5M;OFBpRgfk^cuAvgw{_~vuS@+g6 z29D0?e*5dyZ$0{vDF=S}_P%dl_nA!({e9`VZ@Tr=8}{6C^^%vZ`osgTI{Rh&2Yb~u zv%)DR*mxCq7dgkoK0J!dghUH}g!-pO$(B^t10SJ}pak=a$s zWr3G&-gVCQAZk%MfHfE}W8JkE(SOGQxDZXdH9F@5SIY&$8fy*UkFL74{u;Vw;UXA0 zuRINxUiXAHrd@bXHgOUe!Qx=xVIOF_TuXo4DxzY&pD!Y>OX6{8N7hGyj7t7so^Ni<5XM>O6SmL~MMw&v41xRzEq1CSb-^V+v*okW zIC?0{pCZ3_*KImp9FCFresA?(J~HZkBOZU_#XEoW##3q+-uDj|p78nJ@=MNq#Z~`! z!)0^NI`40v)ve9Y7)bkC?GM*VzZzf{mlQN%pyf&N-d;CcvREPG@lwA(UKkF@g~GUe z+M?wT*G$nX3#=l0m&+DmXj?{vlB86GnVmSQ*2eBwGCCq1b zO}$f5udY!J%-1wa?M-I#9pUAtsm7SiUWIxd3z_Ef<#2Fxa>0R+e{9FXW>S2pte z9TG27SeHr$kf0OFc#|okT!eVw(eUdN?MZ~nq$qiloGWKq%Ll72^(Y24N~12Fbm6Ys zcJI7#_cQ*J4Zx3Xsh;`z=bTeM_~{q_%~O8Uv+P2;xA(wMDojbsDai^`SWP-m=`)zONnk4-d{Sq}RSgkC zeLGaxjOP4`>lo`a3D&8u5op~3H#~&v!o`iXvn4pvCJMp;a$iMQ5SD08dJ987 zXX=|XHU5BfR1Dq7O2^S>EW>GuO1qpq%s545ARk$28OfnR>0l~%#Y7N}tY_MCpEr)Z zXm`VPy&?B@KRLhpnqRH|{;fN|dd`Rb&(`zac;RL5T>YVUzv`MVy>ZifZu-sEFMaGe z2cOBvE}w!Z3k)ky1vG-|<@7!Gf3u%R-AksW!a0Yid_3sNJB9pA)Ez7tq;JTgEiTpf6iEdsIzC zDoGNCa^-ATo>#i|e7H$bJV}<;!D^x+*k6Tn@tsEQgauf*oQ1-LWK5NE9neKG_?0;52ymsxz*DYLs z{xMVLO?bugKJyzpY+?X9h>`h_2 zGU|-syyj+i70pgvk-m8n*_Pdd1uF=B9yhKg!9G-XoUUk%8;1oYfldK%Z&o1EC`XQ| ztjy{27_lH@SUXDscEOFtdzND=yF+ZHh)wA@4$MmDGUd@$wvKWO@QGSFR&%VFEoMN; zRz9!+!Pi^#^%f0l6DZ4@K>qk7U$0iNH~kqOuIED#Nri`B=eV7QsLv$w~R42)!&Wi zfTr#nxAC^y_TC0%4cAnMpme{fJ(T@se)Zt{wto3r z^PGCLFmcjXdVl4`{AO@HY2U__J*EY ztX)r3akq>s0iK=WRlv}ZQDr_gH@T2|7sf#PuY~BLP{Taex)b+n<$~=Zj#U~HS%QokBSBuvX38W+~>7J~&Z@7Yn%^+2+r5df?QvKQV5DLZ^!N`Mdb{Epj+ zU}7HZBrTn+$boG9s7bY;nor!w!%rbWB`(PdIr#LN1WMD9Ft51)L;=5U6xnB%ZK0?Iyq^RAt@-G241onmu_<~KA8fBW|8iNE;!nXmrx*S`3+ zk6!=355I8Q`eXk%ck{b`_MLZ5{{G`DfAv2;uviRxc^sEUXzo5LtiQBIHyyYJV~%)e zb1NlHm3XGhB^g<#im%T@xuo zHrmF%%*<9#@+*4XC*3{SiB{!S@lmtRI(7qCpCDaLomNv-BCyv0>o}r`NQ`tTY5H|C z38G^pXpR}$M0o5q^+_)3CC+lX3IJ!kc_8cn-blzTwlOeWH=vBdDuy~pH(yFOvYxYQ zr`-Tv^#*_}#oo+NF`V`rkVmtnVP(Y8v3eT0s)eft$xC;1AE?(UY;Jv!hR#)1fOIXx z1t|ypJSuZ#RO2iyDrafE1hgm-QV%tEuKKGfF9t~l6QlXf{?~ z@^#AxXYxU5fRd<1Zbg?x&MpHRnX{IuU08pSfSwHJ=+$Xo4We@TC0c542ncf~W@TC-(8i zP00Inj?k+~2bQyY8T^Wd6?_CW#+%8blG{Jbs-FAAKb*K@)2f?)vi{Z+|FG$0AN}}Q zA3WulH~n$Kdw+g-#J9(O@_jl=9yMupsknn${|zA}u|bRoK($LC+T=>dlPyNLYT?{6 z-Fux(2BSJ?(Wnl)$Xu=&g_qbo%&tGvo3anNWT(k!9A~HrwA3{Bf^GFTf@sw%K(qzw z`6k93G?>QdEs!1rPcf$(Rdx;K72@y(6vW(qErV|KX4^#n;-!OxJq)a>c&zwaT)B6- zXj$rXTpFe^H!ZaI+xKi0F!mON0An>k07(TFj%C>3$PBs)*Q~+5{9(Ymk_Y5 zH@mJY7F)DJ4w~7U%@*o3JzbNO9Hods#{p7UH!{dgH(j)M?~TK53rg81s;9j6Kc=rf z{};PAO?}lzUOl4x?{~fDf@{9}mq)tJ`pV{?U;4=DA3pLo+4Ry=`^9$ne#|*k=q$CS zi4ihOLoIRw}navsyc;)QMn z5;76v!qru{99C(LP3i1Ppx2+3F5wa2!VcuHu1aAvGTD%{D@7!`l6GN_QX~6Ry1(>P zyEJ^!)m6A0R*^TwCRd7ZSOONKLL7jK0X5b?TUzXV1`wcK4rMlcV#Z+jd^FXRP7IJ9gP*Utjw%3}TT|=STSePt`SF z{@3hlwcmVh&C|Xx`;Dtder*3wj@`NC@}4;ZFPKuB`l6@2ss3(?D#<>|#o_=iRxR2A zmjZPfAEl*9Zkk^iRO`jq(U`~udP`Ud1dQ zZRJ}IFB+WihEsof_Lt9p%cn}ezH+d#XXV_PFFjO$En`Ne)FA)S_Y!8sJ+rw?GdcM& zrIO|26M3h^Hd#QzQt}E64gnb)LzXSv0kS0F4zZ2l!JUU|6&_D zCyeb*im$0QHFXidE=!a8vdwxnp0VSKXbzr)7ukq(;xHm=%4bWW>1}RnaZIki6n!lX>2y1 z!BmyR*~9sp>F>!_PQbNNNdZ%{iIR3w4A0U;ktv1i%ia-_>Te(0IRbvYCQvRwMJ`8_ z&mCe+JH^>@ION4uM8qO`bjFBrZ_AI;*RVWqf|h{8|Sm76FjWjE-!ZtOGH zSps5!VPVXbkb9**xWbybRvP2ou3}0sABrDVJdcC+&DEB7u23<8B#&)K8>gl?Dt-V+ zTHqjz`AhU@_!4CUu!gGdL_uFPC02R2 zz$(Rd1+p3{!xvo;S28#vlcy7}rg0`b0Mhxl7NJOSV3=I#sad-!MG`(Da~c>5Vy5c& zGxk922E?2L%x7es#6Wd=vxR5S-i7u%F+n9s&`>la@rAoBAca>YSnIX^E~0JGVr~8s zLTNU{CKeW|5^@V)oJib6tp+qO7lq8!6Bbh>J)5F1fL%p1BH=!3C$ZY@6??;By}p7U zzbh>Z&1ZcUqrFg6-^~QjhRX@QNSaI+DQiGyGe}`zgG>g34GAxj%MmlPi93mnjY}?H zOQU0iSeUu;LfEnzqRg!$E=B~G7#qutqUsg`@-{0A1wQ7|iomgik*BSNBZ#BI0Kj~S z*GwE{axu#1V1u6o`f=X9Rz0PGiQQ#&fr`9#8B8$Sb^dL8c{TF(1IP=G!h22lP4zXm zU-hc{Ufr=_%Z6jVe9o8GeEhug&wKlOD<>`4`~DxTyyp`it^|HrGSMqF|E`n<5}>mg zun>u(VIlG!$xD)54g;O}weZVbVvyVT<@Ms1*Ne9Slm+?(N&=2B(7=I2@vS!V6UsjE z%QnD&k_Pr9eGRZnq$DIF?C>b>8VlV@t1O^anT+aGnsqDtrEP~(n)J8TUv2);>fg@&!L5J! z!Y9r>a^f{-oYM29r*52a$+_1a`~F9sxp7tX3aB>O(c1h+kD!%as=t>e0nO(E6%rwQ zF76Q97#`etxcJa7C&8QxO;-U%Aodp+<#2DN|;Jnj(N7#`etxO!)QQx(B2s<>@*X@sgcLRBn4 z@RF}aLb=x($_x2E=~C-2AEHv$L>ZSLW{RAk(Ly({X^9->lv{{&1)UBiyE z7>Yl&YwjMR7KfqFO&fMi9IPP48Rxk-q_=ceH$B57>HCw>*G%YGjPaf*CbUUcAzAzx z)|E$;vRh82L8aqiW)~=*1wt{v(Or2G2#~)%>CgSzZP?1!|HU>qpG*Fm^11H6DW5z3 z>-lgWAuHAICZj)VaK^HxZFt(QYxeAFGOF;3&jov+s85%ApIQCP+UJeC6t}v4%)g981h^a#`e>i$&VE z$mix6vnd;#%>cKnI>k$Zs%+%meU-%*x$HtR6zqOF(8x_nURxw1hJQ5^ zYmIb^9_w%Be(g2WrGnjSP--BiWyE?zaC3UO~gJtg6$I0b6WN%qvUBz5;M1SGsls4-c%$UMm$_rqZ zPfM!Ats3mYvLZXwB($)%tT0t%^x!ybA&yo8z>#+nL>Blo5d18ukhl1mYAB79mFmv} z2Z*&n&Ze_{AMl4<@_VLnnAtf=E`m6=QNYxs_m^K=R29fuQ>RH`!lHtZcOD&Qu!)%` zZvqZW5xFi455n`50t1cZ#wHxLzflHE_Q`x542a zTrEc=Kp@r_t;(15`4mP(NjIiZ{{YAvL6=-DVfOkUHM#sn?rlJX@yakNG$C!3Od#0R zQ?BkY_azTdaCobNTY%EgfQn)0;TY1b=O`kX<1>CaE%2>sjQgfbpXtd=hoy+z8>*tp z2@TeAT~;E_BmlK5c^&JU6|vl&1*C?5YFT{k&BL5Em4DW6Ajt#uN8l6&^g#snmgVhJ z(Zndj;FzAx7q`=N`j$?Z9l-&eaDpU!5`N}fD2$b^eDd^`4u+>GV_71;<<%LCu8lm@ z1r{j-KxYAX=c41z$PXyi1pvtT;B0D&GYk`pDsI*edWIEy>-EFR{;7aWb)h$Jpfz9p?g4`M(MDO3wP)lmS}|Ic zWi?Feq8CR4x@-HTNv*a;!_!)}^ls?jkUbEudwS)`v1rO~wA1eD#ISTE*dOW{V?#Fc zvPs+NhNNG%RYGVEv1$SwYANdoW(*OQpLpdsH)RN%>jvjsdDnfm*h*|=csG)+B%~|d z=#w2LcD4!zBvRxTm6Os|V-cXm{JSIQZ(Ze&mxq!Dj&+tHF1mz?YJ|0r zlRk2b0VNxWNWe7ST|}wis1_VHAKq=ukPs!G;0;r9FZEn5GDp9rix{~`;RJnqf|g@I z{=fq+hZ*!|OLq}rIS_z{yJkf%fAvFwN9diF1m@gW-FO(Qd;oUk&-Id8BQY;qv7PWZ zzRBe=@5+{H?zv2r;6kR0Tt-wh?&-xhGK*o3wRdT_f7^6Z*m%^FEu9@Rc4IW_Ljkdv z<+^DTdn&m+0x*xVd5HeCm!FyhWPxmWFnTpfaTyGS5okbMN$#{7Oy@98<#b6#h@k}z zz6xs&jRL|Ye^q_arWNlxyx`N*{{6-Kc3k-vAM5|vcYb`{&HMj&_1>31@bKIZKYpvl zdsq)Btm)+srh)?p=$+CWqT>C!-fV$(0a4712^g=8Qiz_RtJv{O4wps`kX$6zbJM2? zTL5|s`w4;*=` zDpLP3HMvohzEOn&It!P*wPvrwh5{*rp<+|mu<25{cIDo93C#VOIyK)mb3fJym_Q;9 zNchwvHMI!P=&HX?_a^JFQ*R2QmMluiEBJoTa#lI0T{|v86vh( zki(Z)Crmp>E!qebqS3`<13I~KZ79z?Hj*u@W5Msax~eo;j@q#Z;YX!ox)hnk1Q%u>>MTAp3cBsTded`P`Yg)lb zu63CftGbKTln885p~bs28>=y4eeEmVxIfgY{(X)1U_YZBckS+yIFyTJR*FoM{Zy!% z6e(8;EdWVS+eq;uA<5-$=ZZF*tNH;tn_angy^^d~k_fELVi7#1W~K47NksyZGaQtM(N_gy6Dio(ovClB4paigDx)I;R zjk-nVDst50gl7_oG@KnLV{M@0WHJ{xx~no=y7XBnCDb**Ugw(~D+V=I+tWDBZ+k-v zR3-nMQA}TiKI`A;ifaAk2(zl{k0!vb5=PiIMHL4>m4@Z`peood#qP~kY(?k*8&wl% znc9vpK!UT5-6_HwOK@fcF%H&EhY~os^2c3IZt>!AIvqe=PWM0~wzZ&KUp7me6LoKC zz|?HkH1bQxHBP5fV234XG#y45OA^}IfYRx5X!1IYnmHj^kx2b@YE!P$#29nbo7+po zMF*)%xh9{O@D@%y2oQ@w;(F@2RKrx(fe}EGRB3zHEu}ZtsUW}%0e713rpG5A@=jiO zJ_CeeUQM7sTeOwTjRq|0Yl zi$Wh9F@=FoJ4o0x^$62dh}JL-PZOGV$qSmRq^89G!yB~FOZBgC?dn4HM*Eh+JB$QW zE?w7j7DsoUuEr^YVcONwOnVJl#%om+aE0!tdi~kvW2yUQ;WNM&KkQ8xKU!S&QYZ0Y zDC$~0cg7Ifx{Zpu7pZ@m0MlwV8Jw#O&Q;-nw4AoAsVxzZys&HaL^ysMjXGXm=fBWq zw{ZGX2upLCp+0vTxB99wcicpVlb1^{o0OqumU9K9qmh2@q%#Z=tCK57@{+_6@o};i z&1m{eO=gqk9ayc{q&05HK*^yEA|w*n(9nxcXA%rWuFsHB$1~I;0N*n>y30v=vw2$Z zV&n2L))c{1WEahbl%*qxbo#)a_CmUBSRrz03lo`aeEjCokY^h;f3uY63Biqwj zI9rVYw7AjNt-ZMbpoHG75=@SJwI`hn$ZYvW$> zm7cpw_x$m-*}weV6>s>(`%n1eg2A)9zVY^V&71VslBMwKErTeXsCnw!h^2Pf@b09z zgX!1v+}=n;sY|kaBhysNdm8NLM5D7q+s_$)(cV3~Zr)nFFFvG%YTaqo2g_gVS^3QO zZ(I9`PrmjAZ+O8!eCww(&wI)CiO>Gj)=xhC&?{H`a3{r1S&W&YFpb@erXzahkWiSr zZ8lm}3zylVkO_<~Y%Eycf)w=vdZb@Oli|Jhw zxtp(R7xOjSZGDAJX1O#YK##U;s(*u$ z*`4LPI$ZXa6*ecJ>n7z9lQ>Z+o*oSrMD2!;=;^dy0^@$>$dqo0+8?+}%j5s*MqbXr`Y@n}-@O!}U7ffYJNi5NgdW>aBzm};fZuTk4vgSh{) z*E_NHT~{bMK=hh-ka?Vn-uA{L^Sp{7AM@xiyqKW|Mv%NiyVA%sy`GpShUYUIR};?{7`oBumz73W z=q!QG0wiyx2y2N=NkRs(!%?t?#IRgbgrzEW1tjBm`xC7rXeknD^ItJ)%|oNnY#7H< z{ke=(yByndzXfaUO=su1w_yO9bi305kC`QgDUH+_8Yy;AwT5k!8-}4=riFT7s$|ej z%1+D;Q5|MUK2@45J>^3~+pLT*RumQywxv@(BDOcV@>p~?y$PrVeU7FbgCoM;VWft4 zq=r|ZvjE9kDZ*M}Q<9KD8r~^YT7syzQF#_`{*bb|D?cb{XGQX}nYqdg(C8&ZKMR|4 z(ztLNAx)diWPqUw@-9863uBWB*Mix2Qo(|Jca zNlC7BB;v%y6vzdi6~DHSuBGOu^QEn4{N-1xpL*?Sn-;y|J*z7h{L}e&EEw~`Bj3DW z%@<}}@zEbY{+$n<{qsG$#Xyf9Gdn5s*<~Yh;>Wuuz!iHU0o)`l+DxgEnCf_6BMr;s z9lNf+kj><-+qJXgoyo@gvY}%4KK@W?>ldq6oqJF1mzVC?_`$8;d)oXzeEPf3{mL6o zI_~^aci#8hkKKLdy+3`&;Qd-z#Qymn2TN93yc*tU%2B&r?Kj6+E+Km{EILhde@h2+ zV~cVG;MMRL1XT5M5%(vyL;#i1cTrf=BC$zcKfl!IZOAawI-(0 ztfUvMv~pqWi%J#d!IBlQmaw6`<>E8PhTh4`jOseR^OSRo(bR8#v=C6hc#wno7YmO0 zxU1l1ZA|9`5#PwY4-__qy?&}%{AL*9NC-}QySYG3^I0rf6<4rF1qY}8BaEQUA zkYqHPZI#|-ZDIh;^cZjWOtR6Y0|B%UWe5w&g$0E*F{trMP=B_h{(f4N+C1KdYE`rG z<~GGj#;L&c2>UDA(zL(o7CP7e5qt){bpBhae-uwtvbUl-2>0J{7*( z>hFHVrB)Os0n|Ytxso@9Q6;$Pj*3ixPtwL9k~*vvkEqn2V20ZcP6-{E5z2Rj@)bxf zdpA@1y!wmi3trrHho&iM7uy1DOJX<9P&aawuV@o5XF8p2P}g5h!SMd(_)}-`)S&3R z`(TNNmR_78kdEAY4LFcl_CNJ*+F5at5;4}8v(h9 zMbojPV+DgMs?}Sne`FIRr~VPLY=a@ZzoP>+vm)=K6zc5QzqDl(vJT;8$HJK-0K^G) zwk4;69L08YfZ9)@*p80NrSU@ILUkqSwAfWCB2LP?J|BrdCF!k21VGMnUNLS4(zc-3 zbXA=JgUGgxE(|{tJ32VeH6#v!BnacjHaR3HJ_$!EX5a%Q5^|s!)0eH$PPJ(zK_aDj z$dz*&v8xsK;F3){yU-9&y2vb|mRATJDYu`VUYHLLW;fhb0TugEqe1~z75_gGyf~PwUknl2ejM+EppSupcJD@fwx9CWC|l@al^Q_&hga$je#D1bA|>jA&VCVgudN zl_HGlXz7h+8m+OMKxky>95?b9sf4zZV>3LJLMRq`h#sG=peNN>^&uZLc4Omc5as?P zvy=uzlIX_i0QGNBUg_kvIa1Vy9EwcHFf`7cm`?#Rab~%mg)vC9Y?Hdze%^MIOnj2T==R;!$`nSU#UuHjr2wwKrvz=Vw=gV z7>H0H85be$5f#P6pk~spuuQJjtYYCXt6kWYK&TR{F3SJcK%r5WGhk_&i>vP{0hQ;8 z5nWnMsi!GjoDvoi75##vXeSNg{71Y19YM`QKjLt;2~LjCoY5EVzWMqaciq1CX6(b| zF80Ucf<38+N>}`X|NmZnbp5A)_nk-I^}6hl2fp{#(nZt1-}7+C>t6rx^Phj;!+Va~ z`jiLiugqx8IA}Qbf5i01tEVGp(T=jgS&V$B`1c ztXz;mBEKy*ok<*P1wNM#j8R>s?@1jdF!NW)x)$SdrNG3Z8@AuP+t$#U`r^tbsmgj{@C_$7k}+JqrQ1yRQ9g@zkKI!-(G)M`Rnb*rsgGq1Ql}w z+y${_dChqa*lIvcX}E=NSxu$5MV$+5PE_g>)fr6yiI`TbBo>R;xRcl~xj?!hI-AY) zP#tO&&*}-uf{J>$ySh3FWb7Kehuv@Gl$qe-<-7Bd12HSJs$i-o>zo7pog-{r+Hva> zg(7taiu6}|A1duUQl0Uw$6or0_srh$(RaS}hhI4TmD4tC`SnfPue<;Gzr1Y2_-B9i zJC8^xv1!c2Sb`~sc&jE}QAgc`HT7re*}OkB3iVf!-Q-CyX5d3Y50hbgc?v@+`lIzG z+`5j#d9fo7o?XsH2ni#QS_O&$+cbhvZOgh_Aej&b%r0l^R0aUA`mo6ru>xGcr~Ulen?JYh^#|`<@#sC>JFdR> zw69%`<`ZhFjQD(2X1+=S$QY=AT?>R|Zei6_`Vv+}y3YYa9iW)Jk?>Mk&it`W!I2 zcq6i*g4di^ed%`|{`~!u_D^2@x=-#MdvVW)FTCdyt6uiLlV1Lz-{0|#gJYKeMDnP~ zT2bh86suIDQkl#x6c@Rc7s=I=iAv#H1Z#q$SM2dpcC0@@oRWU_pzQOH#3Uf`R*ec70Um$DDgng)a4 zCoWDA3;ZOztmz+=RtrCXFLxNw`7%Ag@u|t2K{_w>++@%hK)pC0kDvOo+Fr7$DK~(n zHz1>=ks)_Ecxw7qqF7IQGTw=>oqo&&RJi3mQpo_&2*pnA+MDy6o?7holNtN8v$6}p zT>cn!{WVzIJu*>84d*wo(y^va|Y!i9r|Wq3Na*WE&$w z8&ON8TVSmzmQ=4)J=wZZbVvJ4^TZq6s6jg;B0PnLDykp$QcLDZ0zFyh!9JS^>C2{e z-{d|{9X&N0xgR{^I7=%l87Q;WS?%zZ?sL#W`Uy;=w(m;U>^8o%2_;J+r&zBti`W+y zAv24edVRr6pSdJJUpD{HUK^G-@Lcc7j+5Q}<5Zb)1##vgj2ReL$%W{g*p9t)_pTeS-LUuOeR^KAfq*@&yL!Q! z)|~L^U+(+W*FJae{S!Ymde*Nyx196Li>Liy?99%8`sy8*zOWyxK6?zT<=Ltk025g1 z@GWw&GK_=4TyfzU=WMwBHa*hQ6N#cXy;iR&CLX28)lj{*>rz4PNaV5CYiXzZb_Bx9hWiZm_p*VSE*xH zX$Ao*#m%YS5XOg2Irqt=@u;aF-ci2Xz8p#(Nu9>n%%#^ z%4c4J4RWi3vn#vJkQ*fBXD(asWrc~9(1)WYjLFsGK4G?LbsZy`%KD*K)XHWZd$P;+ zVhxD8cp~foy)o+Ns`mxuP~+}W(LS`q4C-&8rx!nU>8KKt>lMNvU&4>q z;T{>PN#k#V?~13kg*kOTG}{%aO#Kri9eL+6^w0H((rgVTz^>#?y>C~~6zm?8(V_#4 zvFAr=EB+QOib={Qg8sr{eNbhcf*wpKM(ndbfs%l|L%Ax$#X7M;{U;f@JcAZvOtY4) zS2F-Go~kI^XS#Y;me;Hgfg`gO?1VecOPYY*7$-pM_$lF2S-d-HUcr%^i~257K7eE@ zgwrEPh)$1uw$yUKG;Bmm;!?H_YslF;94-{^b3CWhOBqs#c$hw-j)$Rd`I=M_kZ%tmt4A^;hs2tL2q_^1w#tpRgO|U;zgJ; z1!pI=)xFfCEk~62^l6bt+Iax>HMYDbn|O%#qKIInJA6(O#3UKa#Vnw6W#qv#1JIQX zXka3t;bl#EVJZwb5LMw8w*$JeX}j<;Y_r1HmBQLbZuw%zuBt^-6~kA`jQ+CiiQ_1{ zX~Hmx@~CA*#o1uH5RP)zClVDku&rCw$ZSnHJjz+GAyM3sSHw=ZUOHqg#pYm7}HEetJgHv*Ls% zYfHu!)5i>r+xn5&0*txny));nnI}boCA(s2GY>+I!3Z*v7%EC=TQY)A6?+0Up(mj0 z5GV_nosWcdrVoA;9ThrRH4iKp8)w$_GKO5ts@q;r?Yw^b@dNk0|Al`uaNpeXc04g= z&+)Tw`T3n6eDM6Az5bPtc3*J61a+epPD$Hv?Pez|Vt+!6f!~l)ve8RPhUmi9(!dfZ zKh2~;%W32=icS_W<*F-FC27h0hguA+;Q8M z_hl3DCQR3fxt)`D<1FzSvz5VYWiVB1Y8ZbZL1@A3y>Py<5H+=9)8b~)WyhxF4oJYs zHY3o4WEPgAyEmWe-J*e2&Mp@g=we80D+kqXP0=LU1)j;5S8Lu;>b}N8`za;b0;kefh{j}gFc!33~ zFTloATfB}ia0HxL$8Kz(sJ_ef1;88ip}dah&&EhO-~5g@x+^u1aR=|ceA>__$t`_o zR9vR5^D=n=7O8>{2Phr>->;&9XV?%}%tfC5tE%aN@|@g6D((n&+BaQlB4~nVa0=K( zZV>I3J#rcYNARuYu_nhT>OY`HuwvNSWa33zyfr1EcH`)PabA)%*dDzRyRL3ygqI!a zXF7IZCXYFZ45SCsZz1u4+uIU{?#Us8ei-rB=rUI1_;w(haQ)uFyBP12>$)!zGC2rg zjp9fPCbfdFM7C?Rn_7+DgV3DJoTDj(y*-2lfhV7L!L^RKvprwv-LgGoeU9+t9OV&# zji@9*cZv!x>tJFqz)5hP9`9seH9~PD(_(@MS_l5|ZXsS*wjBCT^@NdVZ-5CCqoS@` zot<;}P6l!U`7l&zNIj5LPGdexOGGTi;sbkmd|R!fUanF?J>&|LZbh3dE7jk~nj4q; zbf{tmxpDbM?p6O9AIz%X&ptM8`t0gq3v~hF$pgoxCC1B?K~JgvJ{A=qwJ;3syyjf) z2}dnNVLzZDSy#5;FqLng^o>(}PItuCyt~L&^gV!r*plrYDMA%>KuZdD2nkouba5im zc<*Ytl%wu$>cRdn#vp5zzL;NsD6X_#*Q2o7^YX|vQjDyBj*CIv==n>+W7>= z7Tr0^WrAZ&$@$CxPrb2suD51B=OCA2`=q7S-Q$R*bV$tJ6WjW!djd;cOWjI`FpY`b z8*8NYW##E?_rT^h5#H>5Y}!~Py^Zp2X+_q*8-f~dUzxAXceiJZ(-XFFR3UZzK+*{$ zx439*#v5;Am01Km+3bBghWbV;@&-}J4N4BMVf17t-L5zT%exj2UHkIE{X<27gwwW} z5^v~=(k`_=)VTgxom|zw5AH;2s3V#oDFLlJKu(dXUhP2>b&v9}w6vPxLCjL&1Z#?} znYS>#HMJ4YmrW6|DoNE?m5N)KWA?_*9WewMo-$#BccKPn?(GV5=iit+$Eq`rRT}|~ zCZeJ@e`JB-tKZGk7+rsiT}wOd6Uk-;^wZ?Adl230+$t*3wzZiyaHyCM^N0hj#6FNy zuw6?@+>3KBSi211l+n)=;~WN(LB$4!76l|KNd()QZC=3W z$F`+b=B|=>rg_^z0VEB*r8}7E*#dP*q`!6LUO>FB58T$2NtXE(W#S9ZK)y zC1nbk%uSD3yQipSX%tVktkqzyRT&Z3+a+&`NY6Z`F!zOUl@1tOLyx!z5Zk3;NG=aZ zPqyjM_LjrybWPkh#MxZPLcu0=*Cy2pz}^n5cv77t)`U)qCsIST`}k~aH|=Kls@W!) zOr-=qlgMwFzGyK3KWtx=2Boer%t(i6-J6{%hK<6R?ETq-J0opv8u@1fjORoOxM4gCSEY+BcRU)9X8Gv?Dx;{~oN;HYm(_B_8;_(s@ zJ9>Ihnj6AXNT5(vW<{6F_5vHgwD%)M>5tVum!%0?Zi@9Sn&mQJwMtD{rAh#J{0|i# zy#VO<0sUN{L3kBVmrs4Ew5B_zm(#5UxDO$)_Gxyl?Lyh=$(EN_1NVLBPooY zx)icXrAoR;9p{=CPV6_|d8=;`fku)W#CJ~8>n5yhGS+7DX^;;MIre0e_rv)j(?Uo5 zbQWdA-aXm)TU6AsGXJC~+xlRoF1;gV zutcF&$Q$T(;bFh7+__aF&!-uab+X|Oo4g&wuxn(-Nm`01Rq4t0ow9|ONrKsvUAvzQ zqGTxPFw$un(4mF`%(QlkUe;&?95uY1Rp-u(?^w*HDl< zrK%}6%%ab`;QjPQQ>@v9rP-|Wp_A;<(ivpF9c4)?>F!nw#;RsWI46)@7>nNQT3yh+ zRuu+x3fOCx!;*KXu)%YfQ2m421=6G>&&fqOl-56u;ctqwcWO2uA~c|q0qH@IJFKPwPDCfctwUfT?&w8}hkxx=}vzLLMi&mqD zqjXc13du86B}=>E^O`O}`$)p4)1iK3vO%J zi8W*frR`c8{N`vFmic5!W&piZuq{6#PHJg(C6LaJQ&@62HhGWkN{Q|2)4@v;o~Kybe4foIC2G#K1m^B?C^9q_PC)8&To#O}7?j2$TiV zCB`m!({;v5b8JfIBnHpq&}z;!>Ka+^F0A2E!*f*|Kv!lOaF)D)u4a>TUB#^!^O9Xz z$3<5sxi@p5yujK^W|1`|$QdxJaLI0K&)^bXK>#yR^Hc&r2wsj-@DRZpLa^hC)Kdqy zkjYeiAAvHNI(R;*3E_?SJPwfu2>W|xKg$giDjPr81x1GLTSq6kycUE6Gpjut z)R6pcB)_=3x6GW0z)#wa{6&XgM)US%*gZ_z(v->wpk|brskq3haM_!}95GaEOOo_i zay^M}TN0;CldB<@AfbR#cWl3X_l=X{Vbjiid*tWDsZf1?;lDjpdg1S@FZk})?_7E5 z&jxG%XUy53`tA>}`^CLq-u%&b_thW0`<}aB^Ni15DpP5t3JA&+1gKY=fM+DuvlKzG zPR@hVI*|k@v>k9ToF`}O?mcE8yK>?U>)&`ix1gmH`1@`C6C|;k_*X4W*_-+QBL4q1|G`1$ Yr!>m +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] diff --git a/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.AssemblyInfo.cs b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.AssemblyInfo.cs new file mode 100644 index 0000000..8053a0c --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("WV2SDK")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("WV2SDK")] +[assembly: System.Reflection.AssemblyTitleAttribute("WV2SDK")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// 由 MSBuild WriteCodeFragment 类生成。 + diff --git a/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.AssemblyInfoInputs.cache b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7ed268d --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c7402f33f78c2735b29f9d57f72022d2015af415 diff --git a/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.GeneratedMSBuildEditorConfig.editorconfig b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..69087a8 --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,3 @@ +is_global = true +build_property.RootNamespace = WV2SDK +build_property.ProjectDir = C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\ diff --git a/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.assets.cache b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..03c83b43c732d65be37156ebaa5e0cfcd422a5e1 GIT binary patch literal 1134 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 literal 0 HcmV?d00001 diff --git a/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.csproj.CoreCompileInputs.cache b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..6d7cbde --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +bbdfe043061eb4310e6cc8a3d702f1bde48e236d diff --git a/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.csproj.FileListAbsolute.txt b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..3969d81 --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.0/WV2SDK.csproj.FileListAbsolute.txt @@ -0,0 +1,5 @@ +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.0\WV2SDK.csproj.AssemblyReference.cache +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.0\WV2SDK.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.0\WV2SDK.AssemblyInfoInputs.cache +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.0\WV2SDK.AssemblyInfo.cs +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.0\WV2SDK.csproj.CoreCompileInputs.cache diff --git a/WV2SDK/obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs b/WV2SDK/obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs new file mode 100644 index 0000000..c1106ad --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] diff --git a/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.AssemblyInfo.cs b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.AssemblyInfo.cs new file mode 100644 index 0000000..5860b20 --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("WV2SDK")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a88c90368784af655bb4c7c872f6a1e214320a00")] +[assembly: System.Reflection.AssemblyProductAttribute("WV2SDK")] +[assembly: System.Reflection.AssemblyTitleAttribute("WV2SDK")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// 由 MSBuild WriteCodeFragment 类生成。 + diff --git a/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.AssemblyInfoInputs.cache b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e72a49d --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +bf7dbf287bb3d210931f24c2d5e6d970315c2536753e1000897c2e63bb9f6ea2 diff --git a/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.GeneratedMSBuildEditorConfig.editorconfig b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..fcf7e94 --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,8 @@ +is_global = true +build_property.RootNamespace = WV2SDK +build_property.ProjectDir = C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = +build_property.EnableCodeStyleSeverity = diff --git a/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.assets.cache b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..2157bc515d88dbd20f0f00bb927a178ab6123745 GIT binary patch literal 2093 zcmcIlOK%e~5H2)rTKWhy(DJS?aG`RZZ3+^Hs%fjVD5^+GFDoG@>m=K5>}c(6x@Z0X zLgE)7B#!VWxN_i(#1RQN_6TAo-6TsCl0&IipDeG(^Nq)!$GbaQYtthmBk$jwWb?=G zUf9$751xPgnt%2B!>`}$`=^s1Up{+3-+oJvgOT4xp*Pka8GDL5%6OPbEvF4C+$z^b zgOv|il`BK=rj|mXeD6QsedAx#*7G!uZc(}=1i_#m1| zpy}5zlt@oj&~B;~ekw}~*&Q6C-F%N->@?4qs7nA$;1mE8h^IUQm<2=tmjPD*3jw#W zK*lgD=mUH7f!XQjV-EgD0apRYw>ad0z@%k&ehNCS+n5_{K?ULX+@;&TCPCu1bgw}G z^MD1wb-)e4O~Bc;){%6Z9{XNN_oKh{U+6nh{}(+;G4^BcuYht+vgI)_Wopg37lJU&X(6`EKg17?#0W;284 z2Kvp=L4H>U_+6z5+@&Ry=FB9rLUfIjh9eJnSrg41D7B>0-f4U51;40vcb;tdp`=)| z6!A+lsWXoVsY!{Gifh{*Da(3;X{%&&(zJAqc+z#+WE4eo2XGg#2*6uT0JC{_i);V1 za%OM6iUz0slNdj(O*6Yp*K)#NdLLed*xxTgtf!`74Gq@5sel-wxV)#V2mW=08Onn! z!hRspoXXW3wpF&Y?PYld>a;nw$!x_Zo^mDaBW{L@j>|(B>GF_rCc4j8;GtU?vdZoM zN=333s|u;KRer*cxE(&G&eRiiP6g|O;0U}DM(DtPE1cNj>$_cFUij<&QB}R z%PP*#i!n6TGte`R$;nItN|h9sB<7_g7Nr>J8N~P@RC)nb>ZRo5FfszIVAv%kzeN5v z2O}dRKbjgwUXVNz0ILV`8S8-rO9PMrq!}0&fJhaH$P^%xjS0dJ3U)MPU;(LOWcZqR zU%e)W+p{)lg3%U%v*$JPf@@gaRlfgUAm;4)P1`O-LG$_wp2L9?J420nyzX?dbSS@{ zu;IMLtJ)3MHBWuoW_)C)Si3wdv5cp$^1qF_WNWt1)ZXgmN+mSXXF67$zZMjvrWs^y=4qW^Qn$P7%+@8 z^Yd)M0cfCSprhbinp09*lxmxoT3S++n4_Z*P@0sJne3ff8Iqr!nrCZlkeFhUmTHz{ zlxUWinwkPM9|#z^%1l5}U|?)$$-wAEAo@!4GD|9rQ}l{cvSW-4j12XF&_vG=9Dku8 zIoFiTlKdh>WL59{a@O=FD6+VbbazfIH@Ho)VAV}EXd8Iiy5G$zd f*Sz%1yi`1X1{R+%QdZq^EM&=9v!X64_ literal 0 HcmV?d00001 diff --git a/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.csproj.CoreCompileInputs.cache b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..e02db69 --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +32455e1cfc8aa39cd71acf82e7dd619746f467c4b187ce628af96e49c12d44e9 diff --git a/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.csproj.FileListAbsolute.txt b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..65c0c6d --- /dev/null +++ b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.csproj.FileListAbsolute.txt @@ -0,0 +1,30 @@ +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\bin\Debug\netstandard2.1\WV2SDK.deps.json +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\bin\Debug\netstandard2.1\WV2SDK.dll +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\bin\Debug\netstandard2.1\WV2SDK.pdb +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.csproj.AssemblyReference.cache +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.AssemblyInfoInputs.cache +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.AssemblyInfo.cs +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.csproj.CoreCompileInputs.cache +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.dll +C:\Users\WangJin\RiderProjects\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.pdb +D:\Sheep-GP\WV2SDK\WV2SDK\bin\Debug\netstandard2.1\WV2SDK.deps.json +D:\Sheep-GP\WV2SDK\WV2SDK\bin\Debug\netstandard2.1\WV2SDK.dll +D:\Sheep-GP\WV2SDK\WV2SDK\bin\Debug\netstandard2.1\WV2SDK.pdb +D:\Sheep-GP\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.csproj.AssemblyReference.cache +D:\Sheep-GP\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.GeneratedMSBuildEditorConfig.editorconfig +D:\Sheep-GP\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.AssemblyInfoInputs.cache +D:\Sheep-GP\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.AssemblyInfo.cs +D:\Sheep-GP\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.csproj.CoreCompileInputs.cache +D:\Sheep-GP\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.dll +D:\Sheep-GP\WV2SDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.pdb +C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\bin\Debug\netstandard2.1\WV2SDK.deps.json +C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\bin\Debug\netstandard2.1\WV2SDK.dll +C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\bin\Debug\netstandard2.1\WV2SDK.pdb +C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.csproj.AssemblyReference.cache +C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.GeneratedMSBuildEditorConfig.editorconfig +C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.AssemblyInfoInputs.cache +C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.AssemblyInfo.cs +C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.csproj.CoreCompileInputs.cache +C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.dll +C:\WorkSpace\Sheep_GP\WVSDK\WV2SDK\obj\Debug\netstandard2.1\WV2SDK.pdb diff --git a/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.dll b/WV2SDK/obj/Debug/netstandard2.1/WV2SDK.dll new file mode 100644 index 0000000000000000000000000000000000000000..95aadacc4a22ed53754e1bec4909a1bfe214adde GIT binary patch literal 166912 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⁡8sRn}#^(Iar5$Yz~#R*v#5XP>9Yrq6=F&5IAI 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套u>BV-4&(JsN=TE6b(QFpfb(Z1)sS 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 + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\97354\.nuget\packages\ + PackageReference + 6.14.0 + + + + + \ No newline at end of file diff --git a/WV2SDK/obj/WV2SDK.csproj.nuget.g.targets b/WV2SDK/obj/WV2SDK.csproj.nuget.g.targets new file mode 100644 index 0000000..35a7576 --- /dev/null +++ b/WV2SDK/obj/WV2SDK.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/WV2SDK/obj/project.assets.json b/WV2SDK/obj/project.assets.json new file mode 100644 index 0000000..f8ca2f9 --- /dev/null +++ b/WV2SDK/obj/project.assets.json @@ -0,0 +1,168 @@ +{ + "version": 3, + "targets": { + ".NETStandard,Version=v2.1": { + "Newtonsoft.Json/13.0.3": { + "type": "package", + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + } + }, + "Unity3D.SDK/2021.1.14.1": { + "type": "package", + "compile": { + "lib/UnityEditor.dll": {}, + "lib/UnityEngine.dll": {} + }, + "runtime": { + "lib/UnityEditor.dll": {}, + "lib/UnityEngine.dll": {} + } + } + } + }, + "libraries": { + "Newtonsoft.Json/13.0.3": { + "sha512": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==", + "type": "package", + "path": "newtonsoft.json/13.0.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.md", + "README.md", + "lib/net20/Newtonsoft.Json.dll", + "lib/net20/Newtonsoft.Json.xml", + "lib/net35/Newtonsoft.Json.dll", + "lib/net35/Newtonsoft.Json.xml", + "lib/net40/Newtonsoft.Json.dll", + "lib/net40/Newtonsoft.Json.xml", + "lib/net45/Newtonsoft.Json.dll", + "lib/net45/Newtonsoft.Json.xml", + "lib/net6.0/Newtonsoft.Json.dll", + "lib/net6.0/Newtonsoft.Json.xml", + "lib/netstandard1.0/Newtonsoft.Json.dll", + "lib/netstandard1.0/Newtonsoft.Json.xml", + "lib/netstandard1.3/Newtonsoft.Json.dll", + "lib/netstandard1.3/Newtonsoft.Json.xml", + "lib/netstandard2.0/Newtonsoft.Json.dll", + "lib/netstandard2.0/Newtonsoft.Json.xml", + "newtonsoft.json.13.0.3.nupkg.sha512", + "newtonsoft.json.nuspec", + "packageIcon.png" + ] + }, + "Unity3D.SDK/2021.1.14.1": { + "sha512": "t5wm+eCp4HvhSiAmH2lASj82QobnZe0uEwZyd+RreN4bRqB6x2kSK4uvu213TQrtMeDi+HB015wWWu2VnKpEIQ==", + "type": "package", + "path": "unity3d.sdk/2021.1.14.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/UnityEditor.dll", + "lib/UnityEditor.xml", + "lib/UnityEngine.dll", + "lib/UnityEngine.xml", + "unity3d.sdk.2021.1.14.1.nupkg.sha512", + "unity3d.sdk.nuspec" + ] + } + }, + "projectFileDependencyGroups": { + ".NETStandard,Version=v2.1": [ + "Newtonsoft.Json >= 13.0.3", + "Unity3D.SDK >= 2021.1.14.1" + ] + }, + "packageFolders": { + "C:\\Users\\97354\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\WorkSpace\\Sheep_GP\\WVSDK\\WV2SDK\\WV2SDK.csproj", + "projectName": "WV2SDK", + "projectPath": "C:\\WorkSpace\\Sheep_GP\\WVSDK\\WV2SDK\\WV2SDK.csproj", + "packagesPath": "C:\\Users\\97354\\.nuget\\packages\\", + "outputPath": "C:\\WorkSpace\\Sheep_GP\\WVSDK\\WV2SDK\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\97354\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "netstandard2.1" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "netstandard2.1": { + "targetAlias": "netstandard2.1", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.300" + }, + "frameworks": { + "netstandard2.1": { + "targetAlias": "netstandard2.1", + "dependencies": { + "Newtonsoft.Json": { + "target": "Package", + "version": "[13.0.3, )" + }, + "Unity3D.SDK": { + "target": "Package", + "version": "[2021.1.14.1, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "NETStandard.Library": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Users\\97354\\.dotnet\\sdk\\9.0.304\\RuntimeIdentifierGraph.json" + } + } + }, + "logs": [ + { + "code": "NU1701", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Unity3D.SDK 2021.1.14.1' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8, .NETFramework,Version=v4.8.1' instead of the project target framework '.NETStandard,Version=v2.1'. This package may not be fully compatible with your project.", + "libraryId": "Unity3D.SDK", + "targetGraphs": [ + ".NETStandard,Version=v2.1" + ] + } + ] +} \ No newline at end of file diff --git a/WV2SDK/obj/project.nuget.cache b/WV2SDK/obj/project.nuget.cache new file mode 100644 index 0000000..d0e3beb --- /dev/null +++ b/WV2SDK/obj/project.nuget.cache @@ -0,0 +1,24 @@ +{ + "version": 2, + "dgSpecHash": "ZGSvfVuq3UQ=", + "success": true, + "projectFilePath": "C:\\WorkSpace\\Sheep_GP\\WVSDK\\WV2SDK\\WV2SDK.csproj", + "expectedPackageFiles": [ + "C:\\Users\\97354\\.nuget\\packages\\newtonsoft.json\\13.0.3\\newtonsoft.json.13.0.3.nupkg.sha512", + "C:\\Users\\97354\\.nuget\\packages\\unity3d.sdk\\2021.1.14.1\\unity3d.sdk.2021.1.14.1.nupkg.sha512" + ], + "logs": [ + { + "code": "NU1701", + "level": "Warning", + "message": "Package 'Unity3D.SDK 2021.1.14.1' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8, .NETFramework,Version=v4.8.1' instead of the project target framework '.NETStandard,Version=v2.1'. This package may not be fully compatible with your project.", + "projectPath": "C:\\WorkSpace\\Sheep_GP\\WVSDK\\WV2SDK\\WV2SDK.csproj", + "warningLevel": 1, + "filePath": "C:\\WorkSpace\\Sheep_GP\\WVSDK\\WV2SDK\\WV2SDK.csproj", + "libraryId": "Unity3D.SDK", + "targetGraphs": [ + ".NETStandard,Version=v2.1" + ] + } + ] +} \ No newline at end of file diff --git a/WV2SDK/obj/project.packagespec.json b/WV2SDK/obj/project.packagespec.json new file mode 100644 index 0000000..1e7b58a --- /dev/null +++ b/WV2SDK/obj/project.packagespec.json @@ -0,0 +1 @@ +"restore":{"projectUniqueName":"C:\\WorkSpace\\Sheep_GP\\WVSDK\\WV2SDK\\WV2SDK.csproj","projectName":"WV2SDK","projectPath":"C:\\WorkSpace\\Sheep_GP\\WVSDK\\WV2SDK\\WV2SDK.csproj","outputPath":"C:\\WorkSpace\\Sheep_GP\\WVSDK\\WV2SDK\\obj\\","projectStyle":"PackageReference","originalTargetFrameworks":["netstandard2.1"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.300"}"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","dependencies":{"Newtonsoft.Json":{"target":"Package","version":"[13.0.3, )"},"Unity3D.SDK":{"target":"Package","version":"[2021.1.14.1, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"NETStandard.Library":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Users\\97354\\.dotnet\\sdk\\9.0.304\\RuntimeIdentifierGraph.json"}} \ No newline at end of file diff --git a/WV2SDK/obj/rider.project.model.nuget.info b/WV2SDK/obj/rider.project.model.nuget.info new file mode 100644 index 0000000..9a9fbc6 --- /dev/null +++ b/WV2SDK/obj/rider.project.model.nuget.info @@ -0,0 +1 @@ +17576605466362920 \ No newline at end of file diff --git a/WV2SDK/obj/rider.project.restore.info b/WV2SDK/obj/rider.project.restore.info new file mode 100644 index 0000000..9a9fbc6 --- /dev/null +++ b/WV2SDK/obj/rider.project.restore.info @@ -0,0 +1 @@ +17576605466362920 \ No newline at end of file diff --git a/gupm.toml b/gupm.toml new file mode 100644 index 0000000..fa5ce4a --- /dev/null +++ b/gupm.toml @@ -0,0 +1,6 @@ +Target = "Assets/SGModule" + +[Submodules] + Common = "v3.0.0" + Net = "v3.0.1" + NetKit = "v1.0.0"