no message
This commit is contained in:
parent
9dab32e6c7
commit
24205eed75
|
@ -43,7 +43,9 @@
|
|||
<ItemGroup>
|
||||
<None Include="Assets\Plugins\UniTask\package.json" />
|
||||
<Folder Include="Assets\Plugins" />
|
||||
<Folder Include="Assets\Plugins\Newtonsoft" />
|
||||
<Folder Include="Assets\Plugins\UniTask" />
|
||||
<None Include="Assets\Plugins\Newtonsoft\Newtonsoft.Json.xml" />
|
||||
<Reference Include="UnityEngine">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\Managed\UnityEngine\UnityEngine.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -59,14 +59,19 @@
|
|||
<Compile Include="Assets\Scripts\TMPTextFont.cs" />
|
||||
<Compile Include="Assets\Scripts\Apis.cs" />
|
||||
<Compile Include="Assets\Scripts\Manager\AchievementManager.cs" />
|
||||
<Compile Include="Assets\Scripts\Component\AutoResizeImage.cs" />
|
||||
<Compile Include="Assets\Scripts\Component\BackpackComponent.cs" />
|
||||
<Compile Include="Assets\Scripts\SignHelper.cs" />
|
||||
<Compile Include="Assets\UnityWebSocket\Demo\UnityWebSocketDemo.cs" />
|
||||
<Compile Include="Assets\Scripts\Manager\BackpackManager.cs" />
|
||||
<Compile Include="Assets\Scripts\test.cs" />
|
||||
<Compile Include="Assets\Scripts\WXInputFieldAdapter.cs" />
|
||||
<Compile Include="Assets\Scripts\Network\WebRequestManager.cs" />
|
||||
<Compile Include="Assets\Scripts\Dto\SignData.cs" />
|
||||
<Compile Include="Assets\Scripts\Manager\ClockInManager.cs" />
|
||||
<Compile Include="Assets\Scripts\LogGUI.cs" />
|
||||
<Compile Include="Assets\Scripts\Component\MyFriendComponent.cs" />
|
||||
<Compile Include="Assets\Scripts\SignUtil.cs" />
|
||||
<Compile Include="Assets\Scripts\MessageHandler.cs" />
|
||||
<Compile Include="Assets\Scripts\Manager\RankingListManager.cs" />
|
||||
<Compile Include="Assets\Scripts\UI\UIManager.cs" />
|
||||
|
@ -77,6 +82,7 @@
|
|||
<Folder Include="Assets" />
|
||||
<None Include="Assets\TextMesh Pro\Shaders\TMPro.cginc" />
|
||||
<Folder Include="Assets\Scripts\Component" />
|
||||
<Folder Include="Assets\Scripts\Test" />
|
||||
<None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Mobile Overlay.shader" />
|
||||
<Folder Include="Assets\TextMesh Pro\Sprites" />
|
||||
<None Include="Assets\WX-WASM-SDK-V2\package.json" />
|
||||
|
@ -86,6 +92,7 @@
|
|||
<None Include="Assets\TextMesh Pro\Shaders\TMP_Bitmap.shader" />
|
||||
<Folder Include="Assets\Scripts" />
|
||||
<Folder Include="Assets\Images\邮件" />
|
||||
<Folder Include="Assets\Images\好友聊天" />
|
||||
<Folder Include="Assets\WebGLTemplates" />
|
||||
<Folder Include="Assets\Resources" />
|
||||
<Folder Include="Assets\TextMesh Pro\Resources\Fonts & Materials" />
|
||||
|
@ -444,6 +451,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="netstandard">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\NetStandard\ref\2.1.0\netstandard.dll</HintPath>
|
||||
</Reference>
|
||||
|
@ -810,6 +820,9 @@
|
|||
<Reference Include="System.Xml.Serialization">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\NetStandard\compat\2.1.0\shims\netfx\System.Xml.Serialization.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Unity.VSCode.Editor">
|
||||
<HintPath>D:\Unity Project\wxgame\Library\ScriptAssemblies\Unity.VSCode.Editor.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Unity.EditorCoroutines.Editor">
|
||||
<HintPath>D:\Unity Project\wxgame\Library\ScriptAssemblies\Unity.EditorCoroutines.Editor.dll</HintPath>
|
||||
</Reference>
|
||||
|
@ -915,19 +928,12 @@
|
|||
<Reference Include="Unity.ScriptableBuildPipeline.Editor">
|
||||
<HintPath>D:\Unity Project\wxgame\Library\ScriptAssemblies\Unity.ScriptableBuildPipeline.Editor.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Unity.VSCode.Editor">
|
||||
<HintPath>D:\Unity Project\wxgame\Library\ScriptAssemblies\Unity.VSCode.Editor.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="UniTask.Addressables.csproj">
|
||||
<Project>{8e936137-c2aa-16dd-9a04-e60eb294a22e}</Project>
|
||||
<Name>UniTask.Addressables</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="MotionFramework.csproj">
|
||||
<Project>{9bf79365-0607-2e84-109a-ea7b42dcd380}</Project>
|
||||
<Name>MotionFramework</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="UniTask.Linq.csproj">
|
||||
<Project>{80a4df7d-4390-85e9-997d-aa317ac69dd0}</Project>
|
||||
<Name>UniTask.Linq</Name>
|
||||
|
@ -960,6 +966,10 @@
|
|||
<Project>{c7e04630-b12f-3b8e-469f-a61c1aaec9fb}</Project>
|
||||
<Name>UniTask.DOTween</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="MotionFramework.csproj">
|
||||
<Project>{9bf79365-0607-2e84-109a-ea7b42dcd380}</Project>
|
||||
<Name>MotionFramework</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
|
|
File diff suppressed because one or more lines are too long
Binary file not shown.
Before Width: | Height: | Size: 946 B |
|
@ -1,140 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: fb6c8be3835157649814f44d9a06b44a
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 12
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 0
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Server
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -49,7 +49,7 @@ TextureImporter:
|
|||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 5, y: 5, z: 5, w: 5}
|
||||
spriteBorder: {x: 13, y: 13, z: 13, w: 13}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 275 B |
|
@ -1,140 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 421df53d1386b564993b306f13d18845
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 12
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 0
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Server
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
Before Width: | Height: | Size: 918 B |
|
@ -1,140 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 3fed243012b5ab8468e1d834e9c7126a
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 12
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 0
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 0
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 2, y: 2, z: 2, w: 2}
|
||||
spriteGenerateFallbackPhysicsShape: 0
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Server
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 1537655665
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -6,7 +6,7 @@ TextureImporter:
|
|||
serializedVersion: 12
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
|
@ -37,24 +37,24 @@ TextureImporter:
|
|||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
spriteMeshType: 0
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteBorder: {x: 13, y: 13, z: 13, w: 13}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
|
@ -125,8 +125,8 @@ TextureImporter:
|
|||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 1537655665
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1011 B |
|
@ -1,140 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 14e511787b2c0f447b9c823d13fb095e
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 12
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 0
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Server
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 763faaf86c85d9c4986c92feb0d5a40d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
|
@ -0,0 +1,33 @@
|
|||
fileFormatVersion: 2
|
||||
guid: ff062620015e06b4d8813aa5755e1cd9
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6d16eaf773d8a2845a8202c9d8cd1f5e
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 4ea0423060bbdfe45a30fe0d0ef64b45
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -377,7 +377,7 @@ GameObject:
|
|||
- component: {fileID: 2596978972198282381}
|
||||
- component: {fileID: 8472475537306409392}
|
||||
m_Layer: 5
|
||||
m_Name: Button (Legacy)
|
||||
m_Name: "\u804A\u5929\u6309\u94AE"
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -5,6 +5,8 @@
|
|||
private static string baseApiUrl = "https://game.api.njfengwei.cn/uapi";
|
||||
private static string Token = string.Empty;
|
||||
private static string Code = string.Empty;
|
||||
private static string AppKey = "App1234Key";
|
||||
private static string AppSecret = "App1234Secret";
|
||||
|
||||
/// <summary>
|
||||
/// 设置Token
|
||||
|
@ -42,13 +44,49 @@
|
|||
return Code;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置AppKey
|
||||
/// </summary>
|
||||
/// <param name="appKey">应用密钥</param>
|
||||
public static void SetAppKey(string appKey)
|
||||
{
|
||||
AppKey = appKey;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取AppKey
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string GetAppKey()
|
||||
{
|
||||
return AppKey;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置AppSecret
|
||||
/// </summary>
|
||||
/// <param name="appSecret">应用密钥</param>
|
||||
public static void SetAppSecret(string appSecret)
|
||||
{
|
||||
AppSecret = appSecret;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取AppSecret
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string GetAppSecret()
|
||||
{
|
||||
return AppSecret;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取测试的code
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string GetGameCodeTest()
|
||||
{
|
||||
return $"{baseApiUrl}/Auth/getGameCodeTest?apipost_id=395e2022f2f05b";
|
||||
return $"{baseApiUrl}/Auth/getGameCodeTest";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -106,5 +144,23 @@
|
|||
{
|
||||
return $"{baseApiUrl}/Friend/checkFriend";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取7日签到数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string GetMyDates()
|
||||
{
|
||||
return $"{baseApiUrl}/My/getMyDates";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 今日打卡
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string GetSignToday()
|
||||
{
|
||||
return $"{baseApiUrl}/My/signToday";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,296 @@
|
|||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using TMPro;
|
||||
|
||||
namespace DefaultNamespace.Component
|
||||
{
|
||||
/// <summary>
|
||||
/// 自动调整Image高度的组件
|
||||
/// 监听子对象中的TMP_Text组件,根据文本高度自动调整Image的高度
|
||||
/// </summary>
|
||||
public class AutoResizeImage : MonoBehaviour
|
||||
{
|
||||
[Header("UI组件引用")]
|
||||
[SerializeField] private Image targetImage; // 目标Image组件
|
||||
[SerializeField] private TMP_Text targetText; // 目标TMP_Text组件
|
||||
|
||||
[Header("高度调整设置")]
|
||||
[SerializeField] private float topPadding = 10f; // 顶部边距
|
||||
[SerializeField] private float bottomPadding = 10f; // 底部边距
|
||||
[SerializeField] private float minHeight = 50f; // 最小高度
|
||||
[SerializeField] private bool enableDebugLog = true; // 是否启用调试日志
|
||||
|
||||
[Header("更新设置")]
|
||||
[SerializeField] private bool updateOnStart = true; // 启动时是否更新
|
||||
[SerializeField] private bool updateOnTextChange = true; // 文本变化时是否更新
|
||||
|
||||
// 私有字段
|
||||
private RectTransform imageRectTransform; // Image的RectTransform引用
|
||||
private RectTransform textRectTransform; // Text的RectTransform引用
|
||||
private float lastTextHeight = -1f; // 上次的文本高度,用于避免重复更新
|
||||
|
||||
/// <summary>
|
||||
/// 初始化组件
|
||||
/// </summary>
|
||||
private void Awake()
|
||||
{
|
||||
InitializeComponents();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 组件启用时的处理
|
||||
/// </summary>
|
||||
private void OnEnable()
|
||||
{
|
||||
RegisterTextEvents();
|
||||
|
||||
if (updateOnStart)
|
||||
{
|
||||
// 延迟一帧更新,确保所有组件都已初始化
|
||||
Invoke(nameof(UpdateImageHeight), 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 组件禁用时的处理
|
||||
/// </summary>
|
||||
private void OnDisable()
|
||||
{
|
||||
UnregisterTextEvents();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化组件引用
|
||||
/// </summary>
|
||||
private void InitializeComponents()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 获取Image组件
|
||||
if (targetImage == null)
|
||||
{
|
||||
targetImage = GetComponent<Image>();
|
||||
if (targetImage == null)
|
||||
{
|
||||
LogDebug("未找到Image组件,请手动指定或确保脚本挂载在Image对象上");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
imageRectTransform = targetImage.GetComponent<RectTransform>();
|
||||
if (imageRectTransform == null)
|
||||
{
|
||||
LogDebug("Image组件没有RectTransform,无法调整高度");
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取TMP_Text组件
|
||||
if (targetText == null)
|
||||
{
|
||||
targetText = GetComponentInChildren<TMP_Text>();
|
||||
if (targetText == null)
|
||||
{
|
||||
LogDebug("未找到TMP_Text组件,请手动指定或确保子对象中有TMP_Text组件");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
textRectTransform = targetText.GetComponent<RectTransform>();
|
||||
if (textRectTransform == null)
|
||||
{
|
||||
LogDebug("TMP_Text组件没有RectTransform,无法获取高度");
|
||||
return;
|
||||
}
|
||||
|
||||
LogDebug("组件初始化完成");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogDebug($"初始化组件时发生异常: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 注册文本变化事件
|
||||
/// </summary>
|
||||
private void RegisterTextEvents()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (targetText != null && updateOnTextChange)
|
||||
{
|
||||
// 监听文本变化事件
|
||||
targetText.RegisterDirtyVerticesCallback(OnTextChanged);
|
||||
LogDebug("文本变化事件已注册");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogDebug($"注册文本事件时发生异常: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取消注册文本变化事件
|
||||
/// </summary>
|
||||
private void UnregisterTextEvents()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (targetText != null)
|
||||
{
|
||||
targetText.UnregisterDirtyVerticesCallback(OnTextChanged);
|
||||
LogDebug("文本变化事件已取消注册");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogDebug($"取消注册文本事件时发生异常: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 文本变化时的回调
|
||||
/// </summary>
|
||||
private void OnTextChanged()
|
||||
{
|
||||
if (updateOnTextChange)
|
||||
{
|
||||
UpdateImageHeight();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新Image高度
|
||||
/// </summary>
|
||||
public void UpdateImageHeight()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (imageRectTransform == null || textRectTransform == null)
|
||||
{
|
||||
LogDebug("RectTransform引用为空,无法更新高度");
|
||||
return;
|
||||
}
|
||||
|
||||
// 强制更新文本布局
|
||||
Canvas.ForceUpdateCanvases();
|
||||
|
||||
// 获取文本的实际高度
|
||||
float textHeight = GetTextHeight();
|
||||
|
||||
// 检查是否需要更新
|
||||
if (Mathf.Abs(textHeight - lastTextHeight) < 0.1f)
|
||||
{
|
||||
LogDebug($"文本高度未变化 ({textHeight:F2}),跳过更新");
|
||||
return;
|
||||
}
|
||||
|
||||
// 计算新的Image高度
|
||||
float newHeight = textHeight + topPadding + bottomPadding;
|
||||
newHeight = Mathf.Max(newHeight, minHeight);
|
||||
|
||||
// 更新Image高度
|
||||
Vector2 sizeDelta = imageRectTransform.sizeDelta;
|
||||
sizeDelta.y = newHeight;
|
||||
imageRectTransform.sizeDelta = sizeDelta;
|
||||
|
||||
lastTextHeight = textHeight;
|
||||
|
||||
LogDebug($"Image高度已更新: {newHeight:F2} (文本高度: {textHeight:F2}, 边距: {topPadding + bottomPadding:F2})");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogDebug($"更新Image高度时发生异常: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取文本的实际高度
|
||||
/// </summary>
|
||||
/// <returns>文本高度</returns>
|
||||
private float GetTextHeight()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (targetText == null)
|
||||
{
|
||||
LogDebug("TMP_Text组件为空");
|
||||
return 0f;
|
||||
}
|
||||
|
||||
// 强制重新计算文本布局
|
||||
targetText.ForceMeshUpdate();
|
||||
|
||||
// 获取文本的实际高度
|
||||
float textHeight = targetText.preferredHeight;
|
||||
|
||||
LogDebug($"获取到文本高度: {textHeight:F2}");
|
||||
return textHeight;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogDebug($"获取文本高度时发生异常: {ex.Message}");
|
||||
return 0f;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 记录调试日志
|
||||
/// </summary>
|
||||
/// <param name="message">日志消息</param>
|
||||
private void LogDebug(string message)
|
||||
{
|
||||
if (enableDebugLog)
|
||||
{
|
||||
Debug.Log($"[AutoResizeImage] {message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 手动设置目标组件(供外部调用)
|
||||
/// </summary>
|
||||
/// <param name="image">目标Image组件</param>
|
||||
/// <param name="text">目标TMP_Text组件</param>
|
||||
public void SetTargetComponents(Image image, TMP_Text text)
|
||||
{
|
||||
targetImage = image;
|
||||
targetText = text;
|
||||
InitializeComponents();
|
||||
LogDebug("目标组件已手动设置");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置边距参数
|
||||
/// </summary>
|
||||
/// <param name="top">顶部边距</param>
|
||||
/// <param name="bottom">底部边距</param>
|
||||
public void SetPadding(float top, float bottom)
|
||||
{
|
||||
topPadding = top;
|
||||
bottomPadding = bottom;
|
||||
LogDebug($"边距已设置: 顶部={top}, 底部={bottom}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置最小高度
|
||||
/// </summary>
|
||||
/// <param name="minHeight">最小高度</param>
|
||||
public void SetMinHeight(float minHeight)
|
||||
{
|
||||
this.minHeight = minHeight;
|
||||
LogDebug($"最小高度已设置: {minHeight}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 启用或禁用调试日志
|
||||
/// </summary>
|
||||
/// <param name="enable">是否启用</param>
|
||||
public void SetDebugLog(bool enable)
|
||||
{
|
||||
enableDebugLog = enable;
|
||||
LogDebug($"调试日志已{(enable ? "启用" : "禁用")}");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: d4e606e7be4ceb5429c5511068d01ac6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -1,24 +1,94 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using DefaultNamespace;
|
||||
using Newtonsoft.Json;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using WXGame.Network;
|
||||
|
||||
/// <summary>
|
||||
/// 签到
|
||||
/// </summary>
|
||||
public class CheckInComponent : MonoBehaviour
|
||||
{
|
||||
public Button closeButton;
|
||||
public Button closeButton;
|
||||
public Button claimButton;
|
||||
public Transform[] checkInDays;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
claimButton.onClick.AddListener(delegate { SignToday(); });
|
||||
closeButton.onClick.AddListener(CloseWindow);
|
||||
}
|
||||
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
closeButton.onClick.AddListener(CloseWindow);
|
||||
}
|
||||
private void Start()
|
||||
{
|
||||
GetMydates();
|
||||
}
|
||||
|
||||
private void CloseWindow()
|
||||
{
|
||||
UIManager.Instance.HideUI("签到");
|
||||
}
|
||||
}
|
||||
private void CloseWindow()
|
||||
{
|
||||
UIManager.Instance.HideUI("签到");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 今日打卡
|
||||
/// </summary>
|
||||
private async UniTask SignToday()
|
||||
{
|
||||
try
|
||||
{
|
||||
var result = await WebRequestManager.Instance.PostRequestAsync(
|
||||
url: Apis.GetSignToday()
|
||||
);
|
||||
|
||||
Debug.Log(result.ResponseText);
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogError($"GET请求失败: {ex.Message}");
|
||||
throw; // 重新抛出异常,让调用者知道失败
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取7日签到数据
|
||||
/// </summary>
|
||||
private async UniTask GetMydates()
|
||||
{
|
||||
var result = await WebRequestManager.Instance.PostRequestAsync(
|
||||
url: Apis.GetMyDates()
|
||||
);
|
||||
|
||||
Debug.Log(result.ResponseText);
|
||||
SignData signData = JsonConvert.DeserializeObject<SignData>(result.ResponseText);
|
||||
bool isSignToday = false;
|
||||
if (signData != null && signData.code == 0)
|
||||
{
|
||||
for (int i = 0; i < signData.data.data.Count; i++)
|
||||
{
|
||||
checkInDays[i].Find("币").GetComponent<TMP_Text>().text = signData.data.data[i].nums.ToString();
|
||||
|
||||
if (!isSignToday)
|
||||
{
|
||||
if (signData.data.data[i].status == 0)
|
||||
{
|
||||
checkInDays[i].Find("可领取").gameObject.SetActive(true);
|
||||
isSignToday = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
checkInDays[i].Find("已领取").gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
public class SignDataItem
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public int day { get; set; }
|
||||
/// <summary>
|
||||
/// 第一天
|
||||
/// </summary>
|
||||
public string name { get; set; }
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string date { get; set; }
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public int status { get; set; }
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string image { get; set; }
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public int nums { get; set; }
|
||||
}
|
||||
|
||||
public class SignDataData
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public int can { get; set; }
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public List <SignDataItem > data { get; set; }
|
||||
}
|
||||
|
||||
public class SignData
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public int code { get; set; }
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string msg { get; set; }
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public SignDataData data { get; set; }
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 385ea63250924d43bea9d23cb701a56a
|
||||
timeCreated: 1758070731
|
|
@ -11,7 +11,6 @@ using UnityEngine.SceneManagement;
|
|||
|
||||
public class GameLauncher : MonoBehaviour
|
||||
{
|
||||
|
||||
void Awake()
|
||||
{
|
||||
#if !UNITY_EDITOR
|
||||
|
@ -25,17 +24,19 @@ public class GameLauncher : MonoBehaviour
|
|||
// 初始化框架
|
||||
MotionEngine.Initialize(this, HandleMotionFrameworkLog);
|
||||
}
|
||||
|
||||
|
||||
void Start()
|
||||
{
|
||||
// 创建游戏模块
|
||||
CreateGameModules();
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
// 更新框架
|
||||
MotionEngine.Update();
|
||||
}
|
||||
|
||||
void OnGUI()
|
||||
{
|
||||
// 绘制控制台
|
||||
|
@ -55,17 +56,10 @@ public class GameLauncher : MonoBehaviour
|
|||
|
||||
SceneManager.LoadScene("GameMain");
|
||||
Debug.Log("=== 初始化流程完成 ===");
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//用户数据
|
||||
MotionEngine.CreateModule<UserDataNetworkManager>();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -79,10 +73,12 @@ public class GameLauncher : MonoBehaviour
|
|||
try
|
||||
{
|
||||
// 使用异步方式发送GET请求
|
||||
var result = await WebRequestManager.Instance.GetRequestAsync(
|
||||
var result = await WebRequestManager.Instance.PostRequestAsync(
|
||||
url: Apis.GetGameCodeTest(),
|
||||
headers: null, // 使用默认请求头
|
||||
timeout: 10f // 10秒超时
|
||||
signParams: new Dictionary<string, string>()
|
||||
{
|
||||
{ "apipost_id", "395e2022f2f05b" },
|
||||
}
|
||||
);
|
||||
|
||||
Debug.Log($"GET请求成功!");
|
||||
|
@ -120,15 +116,13 @@ public class GameLauncher : MonoBehaviour
|
|||
|
||||
try
|
||||
{
|
||||
// 构建POST请求参数(urlencoded格式)
|
||||
string postData = $"code={code}";
|
||||
|
||||
Debug.Log(postData);
|
||||
|
||||
// 使用异步方式发送POST请求
|
||||
var result = await WebRequestManager.Instance.PostRequestAsync(
|
||||
url: Apis.GetAccessToken(),
|
||||
data: postData
|
||||
signParams: new Dictionary<string, string>()
|
||||
{
|
||||
{ "code", code },
|
||||
}
|
||||
);
|
||||
|
||||
Debug.Log($"AccessToken请求成功!");
|
||||
|
@ -157,7 +151,7 @@ public class GameLauncher : MonoBehaviour
|
|||
|
||||
Debug.Log("--- 获取AccessToken测试结束 ---");
|
||||
}
|
||||
|
||||
|
||||
private void HandleMotionFrameworkLog(ELogLevel logLevel, string log)
|
||||
{
|
||||
if (logLevel == ELogLevel.Log)
|
||||
|
@ -181,7 +175,6 @@ public class GameLauncher : MonoBehaviour
|
|||
throw new NotImplementedException($"{logLevel}");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public class ClockInManager : MonoBehaviour
|
||||
{
|
||||
void Start()
|
||||
{
|
||||
this.GetComponent<Button>().onClick.AddListener(OpenAchievementPage);
|
||||
}
|
||||
|
||||
private void OpenAchievementPage()
|
||||
{
|
||||
UIManager.Instance.ShowPage("签到");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: a805052046a671048897d74a6f2132f8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -5,6 +5,7 @@ using UnityEngine;
|
|||
using UnityEngine.Networking;
|
||||
using DefaultNamespace;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace WXGame.Network
|
||||
{
|
||||
|
@ -15,7 +16,9 @@ namespace WXGame.Network
|
|||
public class WebRequestManager : MonoBehaviour
|
||||
{
|
||||
#region 单例模式
|
||||
|
||||
private static WebRequestManager _instance;
|
||||
|
||||
public static WebRequestManager Instance
|
||||
{
|
||||
get
|
||||
|
@ -24,58 +27,65 @@ namespace WXGame.Network
|
|||
{
|
||||
// 查找场景中是否已存在实例
|
||||
_instance = FindObjectOfType<WebRequestManager>();
|
||||
|
||||
|
||||
if (_instance == null)
|
||||
{
|
||||
// 创建新的GameObject并添加组件
|
||||
GameObject go = new GameObject("WebRequestManager");
|
||||
_instance = go.AddComponent<WebRequestManager>();
|
||||
DontDestroyOnLoad(go); // 保持跨场景存在
|
||||
|
||||
|
||||
Debug.Log("WebRequestManager: 创建新的WebRequestManager实例");
|
||||
}
|
||||
}
|
||||
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 配置参数
|
||||
[Header("网络请求配置")]
|
||||
[SerializeField] private float defaultTimeout = 30f; // 默认超时时间(秒)
|
||||
|
||||
[Header("网络请求配置")] [SerializeField] private float defaultTimeout = 30f; // 默认超时时间(秒)
|
||||
[SerializeField] private int maxRetryCount = 3; // 最大重试次数
|
||||
[SerializeField] private float retryDelay = 2f; // 重试延迟时间(秒)
|
||||
[SerializeField] private int maxConcurrentRequests = 5; // 最大并发请求数
|
||||
|
||||
[Header("调试设置")]
|
||||
[SerializeField] private bool enableLogging = true; // 是否启用日志
|
||||
|
||||
[Header("调试设置")] [SerializeField] private bool enableLogging = true; // 是否启用日志
|
||||
[SerializeField] private bool enableVerboseLogging = false; // 是否启用详细日志
|
||||
|
||||
#endregion
|
||||
|
||||
#region 私有字段
|
||||
|
||||
private Queue<WebRequestTask> requestQueue = new Queue<WebRequestTask>(); // 请求队列
|
||||
private List<WebRequestTask> activeRequests = new List<WebRequestTask>(); // 活跃请求列表
|
||||
private Dictionary<string, string> defaultHeaders = new Dictionary<string, string>(); // 默认请求头
|
||||
|
||||
#endregion
|
||||
|
||||
#region 事件定义
|
||||
|
||||
/// <summary>
|
||||
/// 请求完成事件
|
||||
/// </summary>
|
||||
public event Action<WebRequestResult> OnRequestCompleted;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 请求失败事件
|
||||
/// </summary>
|
||||
public event Action<WebRequestResult> OnRequestFailed;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 网络错误事件
|
||||
/// </summary>
|
||||
public event Action<string> OnNetworkError;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Unity生命周期
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
// 确保单例模式正确实现
|
||||
|
@ -101,9 +111,11 @@ namespace WXGame.Network
|
|||
Debug.Log("WebRequestManager: 实例已销毁");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 初始化方法
|
||||
|
||||
/// <summary>
|
||||
/// 初始化管理器
|
||||
/// </summary>
|
||||
|
@ -111,7 +123,7 @@ namespace WXGame.Network
|
|||
{
|
||||
// 设置默认请求头(不设置Content-Type,让每个请求自己决定)
|
||||
defaultHeaders["Accept"] = "application/json";
|
||||
|
||||
|
||||
LogMessage("WebRequestManager初始化完成", LogType.Log);
|
||||
}
|
||||
|
||||
|
@ -127,7 +139,7 @@ namespace WXGame.Network
|
|||
LogMessage("设置默认请求头失败:键不能为空", LogType.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
defaultHeaders[key] = value;
|
||||
LogMessage($"设置默认请求头: {key} = {value}", LogType.Log);
|
||||
}
|
||||
|
@ -144,6 +156,7 @@ namespace WXGame.Network
|
|||
#endregion
|
||||
|
||||
#region 日志方法
|
||||
|
||||
/// <summary>
|
||||
/// 记录日志消息
|
||||
/// </summary>
|
||||
|
@ -152,7 +165,7 @@ namespace WXGame.Network
|
|||
private void LogMessage(string message, LogType logType = LogType.Log)
|
||||
{
|
||||
if (!enableLogging) return;
|
||||
|
||||
|
||||
string prefix = "[WebRequestManager] ";
|
||||
switch (logType)
|
||||
{
|
||||
|
@ -179,19 +192,59 @@ namespace WXGame.Network
|
|||
LogMessage($"[详细] {message}", LogType.Log);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 辅助方法
|
||||
|
||||
/// <summary>
|
||||
/// 转换参数值为字符串
|
||||
/// </summary>
|
||||
/// <param name="value">参数值</param>
|
||||
/// <returns>字符串值</returns>
|
||||
private string ConvertParameterValue(object value)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
// 处理数组类型
|
||||
if (value.GetType().IsArray)
|
||||
{
|
||||
return JsonUtility.ToJson(value);
|
||||
}
|
||||
|
||||
// 处理列表类型
|
||||
if (value is System.Collections.IList)
|
||||
{
|
||||
return JsonUtility.ToJson(value);
|
||||
}
|
||||
|
||||
// 处理其他对象类型
|
||||
if (value.GetType().IsClass && value.GetType() != typeof(string))
|
||||
{
|
||||
return JsonUtility.ToJson(value);
|
||||
}
|
||||
|
||||
// 处理基本类型
|
||||
return value.ToString();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 公共接口方法
|
||||
|
||||
/// <summary>
|
||||
/// 发送GET请求(协程方式)
|
||||
/// </summary>
|
||||
/// <param name="url">请求URL</param>
|
||||
/// <param name="headers">自定义请求头</param>
|
||||
/// <param name="timeout">超时时间</param>
|
||||
/// <param name="onComplete">完成回调</param>
|
||||
/// <param name="onError">错误回调</param>
|
||||
public void GetRequest(string url, Dictionary<string, string> headers = null,
|
||||
float timeout = -1, Action<WebRequestResult> onComplete = null, Action<string> onError = null)
|
||||
/// <param name="enableSign">是否启用sign签名</param>
|
||||
/// <param name="signParams">签名参数(当enableSign为true时使用)</param>
|
||||
public void GetRequest(string url, Action<WebRequestResult> onComplete = null, Action<string> onError = null,
|
||||
bool enableSign = false, Dictionary<string, string> signParams = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(url))
|
||||
{
|
||||
|
@ -201,7 +254,7 @@ namespace WXGame.Network
|
|||
}
|
||||
|
||||
// 获取token并添加到请求头
|
||||
var requestHeaders = headers ?? new Dictionary<string, string>();
|
||||
var requestHeaders = new Dictionary<string, string>();
|
||||
string token = Apis.GetToken();
|
||||
if (!string.IsNullOrEmpty(token))
|
||||
{
|
||||
|
@ -209,12 +262,69 @@ namespace WXGame.Network
|
|||
LogMessage($"GET请求添加token: {token.Substring(0, Mathf.Min(10, token.Length))}...", LogType.Log);
|
||||
}
|
||||
|
||||
// 处理sign签名
|
||||
if (enableSign && signParams != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 写死的appkey和appSecret
|
||||
string appKey = "38kisezhasfgxhh98b";
|
||||
string appSecret = "2d6wy8hm8rxbi4xt8dghovggdoodqs57";
|
||||
|
||||
// 创建完整的参数字典
|
||||
var fullParams = new Dictionary<string, string>(signParams);
|
||||
|
||||
// 添加固定的appkey
|
||||
fullParams["appkey"] = appKey;
|
||||
|
||||
// 添加时间戳
|
||||
fullParams["timestamp"] = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
|
||||
|
||||
// 生成sign签名(使用SignUtil,与test.cs保持一致)
|
||||
string sign = SignUtil.GetSign(fullParams, appSecret);
|
||||
if (!string.IsNullOrEmpty(sign))
|
||||
{
|
||||
fullParams["sign"] = sign;
|
||||
LogMessage($"GET请求生成sign: {sign}", LogType.Log);
|
||||
LogMessage($"GET请求签名原文: {SignUtil.LastPlainText}", LogType.Log);
|
||||
|
||||
// 将fullParams转换为URL查询参数
|
||||
var queryParams = new List<string>();
|
||||
foreach (var kvp in fullParams)
|
||||
{
|
||||
queryParams.Add($"{UnityWebRequest.EscapeURL(kvp.Key)}={UnityWebRequest.EscapeURL(kvp.Value)}");
|
||||
}
|
||||
|
||||
// 构建完整的URL
|
||||
string queryString = string.Join("&", queryParams);
|
||||
if (url.Contains("?"))
|
||||
{
|
||||
url += "&" + queryString;
|
||||
}
|
||||
else
|
||||
{
|
||||
url += "?" + queryString;
|
||||
}
|
||||
|
||||
LogMessage($"GET请求完整URL: {url}", LogType.Log);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogMessage("GET请求sign生成失败", LogType.Warning);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogMessage($"GET请求sign生成异常: {ex.Message}", LogType.Error);
|
||||
}
|
||||
}
|
||||
|
||||
var task = new WebRequestTask
|
||||
{
|
||||
Url = url,
|
||||
Method = "GET",
|
||||
Headers = requestHeaders,
|
||||
Timeout = timeout > 0 ? timeout : defaultTimeout,
|
||||
Timeout = defaultTimeout,
|
||||
OnComplete = onComplete,
|
||||
OnError = onError
|
||||
};
|
||||
|
@ -223,18 +333,15 @@ namespace WXGame.Network
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送POST请求(自动处理token,默认使用urlencoded格式)
|
||||
/// 发送POST请求(自动处理token,使用JSON格式)
|
||||
/// </summary>
|
||||
/// <param name="url">请求URL</param>
|
||||
/// <param name="data">请求数据</param>
|
||||
/// <param name="contentType">内容类型</param>
|
||||
/// <param name="headers">自定义请求头</param>
|
||||
/// <param name="timeout">超时时间</param>
|
||||
/// <param name="onComplete">完成回调</param>
|
||||
/// <param name="onError">错误回调</param>
|
||||
public void PostRequest(string url, string data, string contentType = "application/x-www-form-urlencoded",
|
||||
Dictionary<string, string> headers = null, float timeout = -1,
|
||||
Action<WebRequestResult> onComplete = null, Action<string> onError = null)
|
||||
/// <param name="enableSign">是否启用sign签名</param>
|
||||
/// <param name="signParams">签名参数(当enableSign为true时使用)</param>
|
||||
public void PostRequest(string url, Action<WebRequestResult> onComplete = null, Action<string> onError = null,
|
||||
bool enableSign = true, Dictionary<string, string> signParams = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(url))
|
||||
{
|
||||
|
@ -244,7 +351,7 @@ namespace WXGame.Network
|
|||
}
|
||||
|
||||
// 获取token并添加到请求头
|
||||
var requestHeaders = headers ?? new Dictionary<string, string>();
|
||||
var requestHeaders = new Dictionary<string, string>();
|
||||
string token = Apis.GetToken();
|
||||
if (!string.IsNullOrEmpty(token))
|
||||
{
|
||||
|
@ -252,19 +359,85 @@ namespace WXGame.Network
|
|||
LogMessage($"POST请求添加token: {token.Substring(0, Mathf.Min(10, token.Length))}...", LogType.Log);
|
||||
}
|
||||
|
||||
var task = new WebRequestTask
|
||||
// 处理sign签名
|
||||
if (enableSign)
|
||||
{
|
||||
Url = url,
|
||||
Method = "POST",
|
||||
Data = data,
|
||||
ContentType = contentType,
|
||||
Headers = requestHeaders,
|
||||
Timeout = timeout > 0 ? timeout : defaultTimeout,
|
||||
OnComplete = onComplete,
|
||||
OnError = onError
|
||||
};
|
||||
try
|
||||
{
|
||||
// 写死的appkey和appSecret
|
||||
string appKey = "38kisezhasfgxhh98b";
|
||||
string appSecret = "2d6wy8hm8rxbi4xt8dghovggdoodqs57";
|
||||
Dictionary<string, string> fullParams = null;
|
||||
// 创建完整的参数字典
|
||||
if (signParams != null)
|
||||
fullParams = new Dictionary<string, string>(signParams);
|
||||
else
|
||||
{
|
||||
fullParams = new Dictionary<string, string>();
|
||||
}
|
||||
|
||||
EnqueueRequest(task);
|
||||
// 添加固定的appkey
|
||||
fullParams["appkey"] = appKey;
|
||||
|
||||
// 添加时间戳
|
||||
fullParams["timestamp"] = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
|
||||
|
||||
// 生成sign签名(使用SignUtil,与test.cs保持一致)
|
||||
string sign = SignUtil.GetSign(fullParams, appSecret);
|
||||
if (!string.IsNullOrEmpty(sign))
|
||||
{
|
||||
fullParams["sign"] = sign;
|
||||
LogMessage($"POST请求生成sign: {sign}", LogType.Log);
|
||||
LogMessage($"POST请求签名原文: {SignUtil.LastPlainText}", LogType.Log);
|
||||
|
||||
// 序列化为JSON(使用Newtonsoft.Json,与test.cs保持一致)
|
||||
string data = JsonConvert.SerializeObject(fullParams);
|
||||
string contentType = "application/json"; // 强制使用JSON格式
|
||||
|
||||
LogMessage($"POST请求最终JSON数据: {data}", LogType.Log);
|
||||
|
||||
|
||||
var task1 = new WebRequestTask
|
||||
{
|
||||
Url = url,
|
||||
Method = "POST",
|
||||
Data = data,
|
||||
ContentType = "application/json",
|
||||
Headers = requestHeaders,
|
||||
Timeout = defaultTimeout,
|
||||
OnComplete = onComplete,
|
||||
OnError = onError
|
||||
};
|
||||
|
||||
EnqueueRequest(task1);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogMessage("POST请求sign生成失败", LogType.Warning);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogMessage($"POST请求sign生成异常: {ex.Message}", LogType.Error);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log(JsonConvert.SerializeObject(signParams));
|
||||
var task = new WebRequestTask
|
||||
{
|
||||
Url = url,
|
||||
Method = "POST",
|
||||
Data = enableSign && signParams != null ? JsonConvert.SerializeObject(signParams) : "",
|
||||
ContentType = "application/json",
|
||||
Headers = requestHeaders,
|
||||
Timeout = defaultTimeout,
|
||||
OnComplete = onComplete,
|
||||
OnError = onError
|
||||
};
|
||||
|
||||
EnqueueRequest(task);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -279,7 +452,8 @@ namespace WXGame.Network
|
|||
public void PostJsonRequest(string url, string jsonData, Dictionary<string, string> headers = null,
|
||||
float timeout = -1, Action<WebRequestResult> onComplete = null, Action<string> onError = null)
|
||||
{
|
||||
PostRequest(url, jsonData, "application/json", headers, timeout, onComplete, onError);
|
||||
// 直接使用UnityWebRequest发送,因为这是旧的方法
|
||||
StartCoroutine(PostJsonCoroutine(url, jsonData, headers, timeout, onComplete, onError));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -302,43 +476,154 @@ namespace WXGame.Network
|
|||
{
|
||||
formList.Add($"{UnityWebRequest.EscapeURL(kvp.Key)}={UnityWebRequest.EscapeURL(kvp.Value)}");
|
||||
}
|
||||
|
||||
formString = string.Join("&", formList);
|
||||
}
|
||||
|
||||
PostRequest(url, formString, "application/x-www-form-urlencoded", headers, timeout, onComplete, onError);
|
||||
// 直接使用UnityWebRequest发送,因为这是旧的方法
|
||||
StartCoroutine(PostFormCoroutine(url, formString, headers, timeout, onComplete, onError));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 协程方法(用于旧方法)
|
||||
|
||||
/// <summary>
|
||||
/// POST JSON请求协程
|
||||
/// </summary>
|
||||
private IEnumerator PostJsonCoroutine(string url, string jsonData, Dictionary<string, string> headers,
|
||||
float timeout, Action<WebRequestResult> onComplete, Action<string> onError)
|
||||
{
|
||||
var request = new UnityWebRequest(url, "POST");
|
||||
request.uploadHandler = new UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(jsonData));
|
||||
request.downloadHandler = new DownloadHandlerBuffer();
|
||||
request.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
|
||||
|
||||
// 添加自定义请求头
|
||||
if (headers != null)
|
||||
{
|
||||
foreach (var header in headers)
|
||||
{
|
||||
request.SetRequestHeader(header.Key, header.Value);
|
||||
}
|
||||
}
|
||||
|
||||
// 添加token
|
||||
string token = Apis.GetToken();
|
||||
if (!string.IsNullOrEmpty(token))
|
||||
{
|
||||
request.SetRequestHeader("token", token);
|
||||
}
|
||||
|
||||
// 设置超时
|
||||
if (timeout > 0)
|
||||
{
|
||||
request.timeout = (int)timeout;
|
||||
}
|
||||
|
||||
yield return request.SendWebRequest();
|
||||
|
||||
var result = new WebRequestResult
|
||||
{
|
||||
Url = url,
|
||||
ResponseCode = request.responseCode,
|
||||
ResponseText = request.downloadHandler.text,
|
||||
IsSuccess = request.result == UnityWebRequest.Result.Success
|
||||
};
|
||||
|
||||
if (request.result != UnityWebRequest.Result.Success)
|
||||
{
|
||||
LogMessage($"POST JSON请求失败: {request.error}", LogType.Error);
|
||||
onError?.Invoke(request.error);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogMessage($"POST JSON请求成功: {request.responseCode}", LogType.Log);
|
||||
onComplete?.Invoke(result);
|
||||
}
|
||||
|
||||
request.Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// POST表单请求协程
|
||||
/// </summary>
|
||||
private IEnumerator PostFormCoroutine(string url, string formData, Dictionary<string, string> headers,
|
||||
float timeout, Action<WebRequestResult> onComplete, Action<string> onError)
|
||||
{
|
||||
var request = new UnityWebRequest(url, "POST");
|
||||
request.uploadHandler = new UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(formData));
|
||||
request.downloadHandler = new DownloadHandlerBuffer();
|
||||
request.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
||||
|
||||
// 添加自定义请求头
|
||||
if (headers != null)
|
||||
{
|
||||
foreach (var header in headers)
|
||||
{
|
||||
request.SetRequestHeader(header.Key, header.Value);
|
||||
}
|
||||
}
|
||||
|
||||
// 添加token
|
||||
string token = Apis.GetToken();
|
||||
if (!string.IsNullOrEmpty(token))
|
||||
{
|
||||
request.SetRequestHeader("token", token);
|
||||
}
|
||||
|
||||
// 设置超时
|
||||
if (timeout > 0)
|
||||
{
|
||||
request.timeout = (int)timeout;
|
||||
}
|
||||
|
||||
yield return request.SendWebRequest();
|
||||
|
||||
var result = new WebRequestResult
|
||||
{
|
||||
Url = url,
|
||||
ResponseCode = request.responseCode,
|
||||
ResponseText = request.downloadHandler.text,
|
||||
IsSuccess = request.result == UnityWebRequest.Result.Success
|
||||
};
|
||||
|
||||
if (request.result != UnityWebRequest.Result.Success)
|
||||
{
|
||||
LogMessage($"POST表单请求失败: {request.error}", LogType.Error);
|
||||
onError?.Invoke(request.error);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogMessage($"POST表单请求成功: {request.responseCode}", LogType.Log);
|
||||
onComplete?.Invoke(result);
|
||||
}
|
||||
|
||||
request.Dispose();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 异步方法(UniTask)
|
||||
|
||||
/// <summary>
|
||||
/// 发送GET请求(异步方式,返回UniTask)
|
||||
/// </summary>
|
||||
/// <param name="url">请求URL</param>
|
||||
/// <param name="headers">自定义请求头</param>
|
||||
/// <param name="timeout">超时时间</param>
|
||||
/// <param name="enableSign">是否启用sign签名</param>
|
||||
/// <param name="signParams">签名参数(当enableSign为true时使用)</param>
|
||||
/// <returns>UniTask<WebRequestResult></returns>
|
||||
public async UniTask<WebRequestResult> GetRequestAsync(string url, Dictionary<string, string> headers = null, float timeout = -1)
|
||||
public async UniTask<WebRequestResult> GetRequestAsync(string url, bool enableSign = false, Dictionary<string, string> signParams = null)
|
||||
{
|
||||
var completionSource = new UniTaskCompletionSource<WebRequestResult>();
|
||||
|
||||
// 获取token并添加到请求头
|
||||
var requestHeaders = headers ?? new Dictionary<string, string>();
|
||||
string token = Apis.GetToken();
|
||||
if (!string.IsNullOrEmpty(token))
|
||||
{
|
||||
requestHeaders["token"] = token;
|
||||
LogMessage($"GET异步请求添加token: {token.Substring(0, Mathf.Min(10, token.Length))}...", LogType.Log);
|
||||
}
|
||||
|
||||
GetRequest(url, requestHeaders, timeout,
|
||||
onComplete: (result) => {
|
||||
completionSource.TrySetResult(result);
|
||||
},
|
||||
onError: (error) => {
|
||||
completionSource.TrySetException(new System.Exception(error));
|
||||
}
|
||||
|
||||
GetRequest(url,
|
||||
onComplete: (result) => { completionSource.TrySetResult(result); },
|
||||
onError: (error) => { completionSource.TrySetException(new System.Exception(error)); },
|
||||
enableSign: enableSign,
|
||||
signParams: signParams
|
||||
);
|
||||
|
||||
|
||||
return await completionSource.Task;
|
||||
}
|
||||
|
||||
|
@ -346,34 +631,20 @@ namespace WXGame.Network
|
|||
/// 发送POST请求(异步方式,返回UniTask)
|
||||
/// </summary>
|
||||
/// <param name="url">请求URL</param>
|
||||
/// <param name="data">请求数据</param>
|
||||
/// <param name="contentType">内容类型</param>
|
||||
/// <param name="headers">自定义请求头</param>
|
||||
/// <param name="timeout">超时时间</param>
|
||||
/// <param name="enableSign">是否启用sign签名</param>
|
||||
/// <param name="signParams">签名参数(当enableSign为true时使用)</param>
|
||||
/// <returns>UniTask<WebRequestResult></returns>
|
||||
public async UniTask<WebRequestResult> PostRequestAsync(string url, string data, string contentType = "application/x-www-form-urlencoded",
|
||||
Dictionary<string, string> headers = null, float timeout = -1)
|
||||
public async UniTask<WebRequestResult> PostRequestAsync(string url, Dictionary<string, string> signParams = null)
|
||||
{
|
||||
var completionSource = new UniTaskCompletionSource<WebRequestResult>();
|
||||
|
||||
// 获取token并添加到请求头
|
||||
var requestHeaders = headers ?? new Dictionary<string, string>();
|
||||
string token = Apis.GetToken();
|
||||
if (!string.IsNullOrEmpty(token))
|
||||
{
|
||||
requestHeaders["token"] = token;
|
||||
LogMessage($"POST异步请求添加token: {token}...", LogType.Log);
|
||||
}
|
||||
|
||||
PostRequest(url, data, contentType, requestHeaders, timeout,
|
||||
onComplete: (result) => {
|
||||
completionSource.TrySetResult(result);
|
||||
},
|
||||
onError: (error) => {
|
||||
completionSource.TrySetException(new System.Exception(error));
|
||||
}
|
||||
|
||||
PostRequest(url,
|
||||
onComplete: (result) => { completionSource.TrySetResult(result); },
|
||||
onError: (error) => { completionSource.TrySetException(new System.Exception(error)); },
|
||||
|
||||
signParams: signParams
|
||||
);
|
||||
|
||||
|
||||
return await completionSource.Task;
|
||||
}
|
||||
|
||||
|
@ -388,16 +659,12 @@ namespace WXGame.Network
|
|||
public async UniTask<WebRequestResult> PostJsonRequestAsync(string url, string jsonData, Dictionary<string, string> headers = null, float timeout = -1)
|
||||
{
|
||||
var completionSource = new UniTaskCompletionSource<WebRequestResult>();
|
||||
|
||||
|
||||
PostJsonRequest(url, jsonData, headers, timeout,
|
||||
onComplete: (result) => {
|
||||
completionSource.TrySetResult(result);
|
||||
},
|
||||
onError: (error) => {
|
||||
completionSource.TrySetException(new System.Exception(error));
|
||||
}
|
||||
onComplete: (result) => { completionSource.TrySetResult(result); },
|
||||
onError: (error) => { completionSource.TrySetException(new System.Exception(error)); }
|
||||
);
|
||||
|
||||
|
||||
return await completionSource.Task;
|
||||
}
|
||||
|
||||
|
@ -412,21 +679,19 @@ namespace WXGame.Network
|
|||
public async UniTask<WebRequestResult> PostFormRequestAsync(string url, Dictionary<string, string> formData, Dictionary<string, string> headers = null, float timeout = -1)
|
||||
{
|
||||
var completionSource = new UniTaskCompletionSource<WebRequestResult>();
|
||||
|
||||
|
||||
PostFormRequest(url, formData, headers, timeout,
|
||||
onComplete: (result) => {
|
||||
completionSource.TrySetResult(result);
|
||||
},
|
||||
onError: (error) => {
|
||||
completionSource.TrySetException(new System.Exception(error));
|
||||
}
|
||||
onComplete: (result) => { completionSource.TrySetResult(result); },
|
||||
onError: (error) => { completionSource.TrySetException(new System.Exception(error)); }
|
||||
);
|
||||
|
||||
|
||||
return await completionSource.Task;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 请求队列管理
|
||||
|
||||
/// <summary>
|
||||
/// 将请求加入队列
|
||||
/// </summary>
|
||||
|
@ -435,7 +700,7 @@ namespace WXGame.Network
|
|||
{
|
||||
requestQueue.Enqueue(task);
|
||||
LogVerbose($"请求已加入队列: {task.Method} {task.Url}");
|
||||
|
||||
|
||||
// 尝试处理队列中的请求
|
||||
ProcessQueue();
|
||||
}
|
||||
|
@ -461,15 +726,15 @@ namespace WXGame.Network
|
|||
private IEnumerator ExecuteRequest(WebRequestTask task)
|
||||
{
|
||||
LogMessage($"开始执行请求: {task.Method} {task.Url}", LogType.Log);
|
||||
|
||||
|
||||
using (UnityWebRequest request = CreateUnityWebRequest(task))
|
||||
{
|
||||
// 设置超时
|
||||
request.timeout = (int)task.Timeout;
|
||||
|
||||
|
||||
// 发送请求
|
||||
var operation = request.SendWebRequest();
|
||||
|
||||
|
||||
// 等待请求完成或超时
|
||||
float startTime = Time.time;
|
||||
while (!operation.isDone)
|
||||
|
@ -482,19 +747,20 @@ namespace WXGame.Network
|
|||
HandleRequestError(task, "请求超时");
|
||||
break;
|
||||
}
|
||||
|
||||
yield return null;
|
||||
}
|
||||
|
||||
|
||||
// 处理请求结果
|
||||
if (operation.isDone)
|
||||
{
|
||||
HandleRequestResult(task, request);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 从活跃请求列表中移除
|
||||
activeRequests.Remove(task);
|
||||
|
||||
|
||||
// 继续处理队列
|
||||
ProcessQueue();
|
||||
}
|
||||
|
@ -507,7 +773,7 @@ namespace WXGame.Network
|
|||
private UnityWebRequest CreateUnityWebRequest(WebRequestTask task)
|
||||
{
|
||||
UnityWebRequest request;
|
||||
|
||||
|
||||
switch (task.Method.ToUpper())
|
||||
{
|
||||
case "GET":
|
||||
|
@ -516,7 +782,7 @@ namespace WXGame.Network
|
|||
case "POST":
|
||||
// 使用UnityWebRequest.Post发送字符串数据
|
||||
request = new UnityWebRequest(task.Url, "POST");
|
||||
|
||||
|
||||
// 设置请求数据
|
||||
if (!string.IsNullOrEmpty(task.Data))
|
||||
{
|
||||
|
@ -524,7 +790,7 @@ namespace WXGame.Network
|
|||
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
|
||||
LogMessage($"POST请求数据: {task.Data}", LogType.Log);
|
||||
}
|
||||
|
||||
|
||||
// 设置Content-Type
|
||||
if (!string.IsNullOrEmpty(task.ContentType))
|
||||
{
|
||||
|
@ -537,26 +803,26 @@ namespace WXGame.Network
|
|||
request.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
||||
LogMessage("使用默认Content-Type: application/x-www-form-urlencoded", LogType.Log);
|
||||
}
|
||||
|
||||
|
||||
// 设置下载处理器
|
||||
request.downloadHandler = new DownloadHandlerBuffer();
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentException($"不支持的HTTP方法: {task.Method}");
|
||||
}
|
||||
|
||||
|
||||
// 设置默认请求头
|
||||
foreach (var header in defaultHeaders)
|
||||
{
|
||||
request.SetRequestHeader(header.Key, header.Value);
|
||||
}
|
||||
|
||||
|
||||
// 设置自定义请求头
|
||||
foreach (var header in task.Headers)
|
||||
{
|
||||
request.SetRequestHeader(header.Key, header.Value);
|
||||
}
|
||||
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
|
@ -577,7 +843,7 @@ namespace WXGame.Network
|
|||
IsSuccess = request.result == UnityWebRequest.Result.Success,
|
||||
ErrorMessage = request.error
|
||||
};
|
||||
|
||||
|
||||
if (result.IsSuccess)
|
||||
{
|
||||
LogMessage($"请求成功: {task.Method} {task.Url} (状态码: {result.ResponseCode})", LogType.Log);
|
||||
|
@ -603,7 +869,7 @@ namespace WXGame.Network
|
|||
{
|
||||
task.RetryCount++;
|
||||
LogMessage($"准备重试请求 ({task.RetryCount}/{maxRetryCount}): {task.Method} {task.Url}", LogType.Warning);
|
||||
|
||||
|
||||
// 延迟重试
|
||||
StartCoroutine(DelayedRetry(task));
|
||||
}
|
||||
|
@ -631,24 +897,27 @@ namespace WXGame.Network
|
|||
yield return new WaitForSeconds(retryDelay);
|
||||
EnqueueRequest(task);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 公共工具方法
|
||||
|
||||
/// <summary>
|
||||
/// 取消所有请求
|
||||
/// </summary>
|
||||
public void CancelAllRequests()
|
||||
{
|
||||
LogMessage("取消所有请求", LogType.Warning);
|
||||
|
||||
|
||||
// 清空队列
|
||||
requestQueue.Clear();
|
||||
|
||||
|
||||
// 停止所有活跃请求
|
||||
foreach (var task in activeRequests)
|
||||
{
|
||||
task.OnError?.Invoke("请求被取消");
|
||||
}
|
||||
|
||||
activeRequests.Clear();
|
||||
}
|
||||
|
||||
|
@ -669,6 +938,7 @@ namespace WXGame.Network
|
|||
{
|
||||
return requestQueue.Count;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
@ -703,4 +973,4 @@ namespace WXGame.Network
|
|||
public bool IsSuccess; // 是否成功
|
||||
public string ErrorMessage; // 错误信息
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
public class SignHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// 生成 sign
|
||||
/// </summary>
|
||||
/// <param name="parameters">请求参数字典(包含所有参数,但要去掉 sign)</param>
|
||||
/// <param name="secret">AppSecret</param>
|
||||
/// <returns>MD5 sign</returns>
|
||||
public static string GetSign(Dictionary<string, object> parameters, string secret)
|
||||
{
|
||||
// 1. 移除 sign
|
||||
if (parameters.ContainsKey("sign"))
|
||||
{
|
||||
parameters.Remove("sign");
|
||||
}
|
||||
|
||||
// 2. 按照 key ASCII 排序
|
||||
var sorted = parameters.OrderBy(p => p.Key, StringComparer.Ordinal);
|
||||
|
||||
// 3. 拼接成字符串 key+value
|
||||
StringBuilder sb = new StringBuilder();
|
||||
foreach (var kv in sorted)
|
||||
{
|
||||
string valueStr;
|
||||
if (kv.Value is Array || kv.Value is List<object>)
|
||||
{
|
||||
// 数组需要转成 JSON 字符串
|
||||
valueStr = JsonUtility.ToJson(kv.Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
valueStr = kv.Value.ToString();
|
||||
}
|
||||
sb.Append(kv.Key).Append(valueStr);
|
||||
}
|
||||
|
||||
// 4. 拼接 secret
|
||||
sb.Append(secret);
|
||||
|
||||
// 5. 做 MD5 加密
|
||||
using (MD5 md5 = MD5.Create())
|
||||
{
|
||||
byte[] inputBytes = Encoding.UTF8.GetBytes(sb.ToString());
|
||||
byte[] hashBytes = md5.ComputeHash(inputBytes);
|
||||
|
||||
// 转换成 32 位小写 hex
|
||||
return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
fileFormatVersion: 2
|
||||
guid: b6dbd56d9ed74aaa85e577029e635146
|
||||
timeCreated: 1758088610
|
|
@ -0,0 +1,93 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
public static class SignUtil
|
||||
{
|
||||
public static string LastPlainText { get; private set; } = "";
|
||||
public static string GetSign(Dictionary<string, string> parameters, string secret)
|
||||
{
|
||||
// 排序并拼接
|
||||
var sorted = new SortedDictionary<string, string>(parameters, StringComparer.Ordinal);
|
||||
sorted.Remove("sign"); // sign 不参与
|
||||
StringBuilder sb = new StringBuilder();
|
||||
foreach (var kv in sorted)
|
||||
sb.Append(kv.Key).Append(kv.Value);
|
||||
sb.Append(secret);
|
||||
|
||||
// MD5 小写
|
||||
using var md5 = System.Security.Cryptography.MD5.Create();
|
||||
byte[] input = Encoding.UTF8.GetBytes(sb.ToString());
|
||||
byte[] hash = md5.ComputeHash(input);
|
||||
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
|
||||
}
|
||||
public static string GetSign(IDictionary<string, object> parameters, string secret)
|
||||
{
|
||||
// 拷贝并排除 sign
|
||||
var dict = parameters
|
||||
.Where(kv => !string.Equals(kv.Key, "sign", StringComparison.Ordinal))
|
||||
.ToDictionary(kv => kv.Key, kv => kv.Value);
|
||||
|
||||
// 按 key ASCII 排序(等同 PHP 的 ksort)
|
||||
var ordered = dict.OrderBy(k => k.Key, StringComparer.Ordinal);
|
||||
|
||||
// 拼接 key + value
|
||||
var sb = new StringBuilder();
|
||||
foreach (var kv in ordered)
|
||||
{
|
||||
string v = ToFlatString(kv.Value);
|
||||
sb.Append(kv.Key).Append(v);
|
||||
}
|
||||
|
||||
// // 追加 AppSecret
|
||||
sb.Append(secret);
|
||||
|
||||
// 记录签名原文,便于排错
|
||||
LastPlainText = sb.ToString();
|
||||
|
||||
|
||||
Debug.Log(LastPlainText);
|
||||
|
||||
|
||||
// MD5 小写32位
|
||||
using var md5 = MD5.Create();
|
||||
var bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(LastPlainText));
|
||||
return BitConverter.ToString(bytes).Replace("-", "").ToLowerInvariant();
|
||||
}
|
||||
|
||||
// 将值转成“紧凑字符串”,数组按紧凑 JSON(无空格)序列化
|
||||
private static string ToFlatString(object val)
|
||||
{
|
||||
if (val == null) return "";
|
||||
switch (val)
|
||||
{
|
||||
case string s: return s;
|
||||
case bool b: return b ? "true" : "false";
|
||||
case Array a: return JsonArrayCompact(a);
|
||||
case IList<object> l: return JsonArrayCompact(l.ToArray());
|
||||
default:
|
||||
if (val is IFormattable f)
|
||||
return f.ToString(null, System.Globalization.CultureInfo.InvariantCulture);
|
||||
return val.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
private static string JsonArrayCompact(Array arr)
|
||||
{
|
||||
var parts = new List<string>(arr.Length);
|
||||
foreach (var x in arr)
|
||||
{
|
||||
if (x == null) { parts.Add("null"); continue; }
|
||||
if (x is string s) parts.Add($"\"{Escape(s)}\"");
|
||||
else if (x is bool b) parts.Add(b ? "true" : "false");
|
||||
else if (x is IFormattable f) parts.Add(f.ToString(null, System.Globalization.CultureInfo.InvariantCulture));
|
||||
else parts.Add($"\"{Escape(x.ToString())}\"");
|
||||
}
|
||||
return "[" + string.Join(",", parts) + "]";
|
||||
}
|
||||
|
||||
private static string Escape(string s) => s.Replace("\\", "\\\\").Replace("\"", "\\\"");
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
fileFormatVersion: 2
|
||||
guid: de9a088476084e508783b43d2341227b
|
||||
timeCreated: 1758089973
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 90ca52710e6f36147935d8735efa0850
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -2,6 +2,7 @@
|
|||
using WXGame.Network;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using MotionFramework;
|
||||
|
||||
namespace DefaultNamespace
|
||||
|
@ -29,7 +30,10 @@ namespace DefaultNamespace
|
|||
// 使用异步方式发送POST请求
|
||||
var result = await WebRequestManager.Instance.PostRequestAsync(
|
||||
url: Apis.GetMyFriend(),
|
||||
data: postData
|
||||
signParams: new Dictionary<string, string>()
|
||||
{
|
||||
{ "page", "1" },
|
||||
}
|
||||
);
|
||||
|
||||
Debug.Log($"好友列表请求成功!状态码: {result.ResponseCode}");
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Newtonsoft.Json;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
using WXGame.Network;
|
||||
using DefaultNamespace;
|
||||
|
||||
/// <summary>
|
||||
/// 网络请求测试类 - 展示WebRequestManager的各种功能用法
|
||||
|
@ -9,71 +14,229 @@ using WXGame.Network;
|
|||
/// </summary>
|
||||
public class test : MonoBehaviour
|
||||
{
|
||||
[Header("测试配置")]
|
||||
[SerializeField] private string baseApiUrl = "https://game.api.njfengwei.cn/uapi";
|
||||
[SerializeField] private string testToken = "your_test_token_here";
|
||||
[SerializeField] private bool enableDetailedLogging = true;
|
||||
// ====== 配置区(按你实际情况改)======
|
||||
[Header("接口根地址+路径")]
|
||||
public string baseUrl = "https://game.api.njfengwei.cn/uapi";
|
||||
public string endpoint = "/Friend/addFriend"; // 让对接人给出真实路径
|
||||
|
||||
// Start is called before the first frame update
|
||||
void Start()
|
||||
[Header("鉴权/签名配置")]
|
||||
[SerializeField]private string appKey = "38kisezhasfgxhh98b";
|
||||
[SerializeField]private string appSecret = "2d6wy8hm8rxbi4xt8dghovggdoodqs57"; // 仅用于本地签名,绝对不要随请求发送
|
||||
[SerializeField]private string tokenHeaderName = "token"; // 若对方要求把 token 放 header,这里写 header 名称
|
||||
[SerializeField]private string tokenValue = "ff6b2c9b0f5d615fc6b4bc50dd3737d9a49747b98eb52f685c15fa692638e09f"; // 如果没有就留空
|
||||
|
||||
// 示例:脚本启动后发一次请求
|
||||
private void Start()
|
||||
{
|
||||
Debug.Log("=== 开始网络请求测试 ===");
|
||||
// 设置配置
|
||||
Apis.SetAppKey(appKey);
|
||||
Apis.SetAppSecret(appSecret);
|
||||
Apis.SetToken(tokenValue);
|
||||
|
||||
// 延迟执行测试,确保WebRequestManager已初始化
|
||||
StartCoroutine(RunAllTests());
|
||||
// 业务参数(这些将进 body 并参与签名;sign 除外)
|
||||
var body = new Dictionary<string, string>
|
||||
{
|
||||
// 只需要传业务参数,appkey、timestamp、sign会自动添加
|
||||
};
|
||||
|
||||
// 使用WebRequestManager发送请求
|
||||
PostJsonWithWebRequestManager(body);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 运行所有测试案例
|
||||
/// 使用WebRequestManager发送POST请求
|
||||
/// </summary>
|
||||
private IEnumerator RunAllTests()
|
||||
void PostJsonWithWebRequestManager(Dictionary<string, string> body)
|
||||
{
|
||||
yield return new WaitForSeconds(1f); // 等待WebRequestManager初始化
|
||||
// 构建完整URL
|
||||
string url = baseUrl.TrimEnd('/') + "/" + endpoint.TrimStart('/');
|
||||
|
||||
Debug.Log("1. 开始基础GET请求测试");
|
||||
TestBasicGetRequest();
|
||||
|
||||
|
||||
Debug.Log("=== 所有测试完成 ===");
|
||||
}
|
||||
Debug.Log($"[url] {url}");
|
||||
Debug.Log($"[业务参数] {JsonConvert.SerializeObject(body)}");
|
||||
Debug.Log($"[token] {tokenValue}");
|
||||
|
||||
/// <summary>
|
||||
/// 测试基础GET请求
|
||||
/// 展示如何使用WebRequestManager发送GET请求并处理响应
|
||||
/// </summary>
|
||||
private void TestBasicGetRequest()
|
||||
{
|
||||
Debug.Log("--- 基础GET请求测试开始 ---");
|
||||
|
||||
string testUrl = $"{baseApiUrl}/Auth/getGameCodeTest?apipost_id=395e2022f2f05b";
|
||||
|
||||
// 使用WebRequestManager发送GET请求
|
||||
WebRequestManager.Instance.GetRequest(
|
||||
url: testUrl,
|
||||
headers: null, // 使用默认请求头
|
||||
timeout: 10f, // 10秒超时
|
||||
// 使用WebRequestManager发送POST请求,启用sign签名
|
||||
WebRequestManager.Instance.PostRequest(
|
||||
url: url,
|
||||
enableSign: true,
|
||||
signParams: body,
|
||||
onComplete: (result) => {
|
||||
Debug.Log($"GET请求成功!");
|
||||
Debug.Log($"状态码: {result.ResponseCode}");
|
||||
Debug.Log($"HTTP {result.ResponseCode}");
|
||||
Debug.Log($"响应内容: {result.ResponseText}");
|
||||
},
|
||||
onError: (error) => {
|
||||
Debug.LogError($"请求失败: {error}");
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 原始方法(保留作为参考)
|
||||
/// </summary>
|
||||
IEnumerator PostJson(Dictionary<string, object> body)
|
||||
{
|
||||
// 1) 生成 sign(等价 PHP 的 getSign)
|
||||
string sign = SignUtil.GetSign(body, appSecret);
|
||||
body["sign"] = sign;
|
||||
|
||||
// 2) 序列化 JSON(等价 PHP 的 json_encode)
|
||||
string json = JsonConvert.SerializeObject(body);
|
||||
|
||||
// 调试信息:方便对照后端
|
||||
Debug.Log($"[加密前] {SignUtil.LastPlainText}");
|
||||
Debug.Log($"[加密后] {sign}");
|
||||
Debug.Log($"[填入Body] {json}");
|
||||
Debug.Log($"[token] {tokenValue}");
|
||||
|
||||
// 3) 发送 POST(JSON)(等价 PHP 的 http_post_json)
|
||||
string url = baseUrl.TrimEnd('/') + "/" + endpoint.TrimStart('/');
|
||||
|
||||
Debug.Log($"[url] {url}");
|
||||
var req = new UnityWebRequest(url, "POST");
|
||||
req.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(json));
|
||||
req.downloadHandler = new DownloadHandlerBuffer();
|
||||
req.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
|
||||
|
||||
// 若对方要求把 token 放在 Header,这里加;否则把 token 放 body 并参与签名
|
||||
if (!string.IsNullOrEmpty(tokenValue))
|
||||
req.SetRequestHeader(tokenHeaderName, tokenValue);
|
||||
|
||||
yield return req.SendWebRequest();
|
||||
|
||||
// 4) 结果
|
||||
if (req.result != UnityWebRequest.Result.Success)
|
||||
{
|
||||
Debug.LogError($"HTTP {req.responseCode} | {req.error}\n{req.downloadHandler.text}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log($"HTTP {req.responseCode}\n{req.downloadHandler.text}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 把字典转成 key=value&key2=value2
|
||||
/// </summary>
|
||||
private static string ToFormUrlEncoded(Dictionary<string, object> body)
|
||||
{
|
||||
var list = new List<string>();
|
||||
foreach (var kv in body)
|
||||
{
|
||||
string key = UnityWebRequest.EscapeURL(kv.Key);
|
||||
string val = UnityWebRequest.EscapeURL(kv.Value.ToString());
|
||||
list.Add($"{key}={val}");
|
||||
}
|
||||
return string.Join("&", list);
|
||||
}
|
||||
// Unix 时间戳(秒)
|
||||
private static long GetUnixTimeSeconds()
|
||||
{
|
||||
var now = DateTimeOffset.UtcNow;
|
||||
return now.ToUnixTimeSeconds();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试GET请求with sign
|
||||
/// </summary>
|
||||
[ContextMenu("测试GET请求with sign")]
|
||||
public void TestGetRequestWithSign()
|
||||
{
|
||||
// 设置配置
|
||||
Apis.SetAppKey(appKey);
|
||||
Apis.SetAppSecret(appSecret);
|
||||
Apis.SetToken(tokenValue);
|
||||
|
||||
// 业务参数
|
||||
var signParams = new Dictionary<string, string>
|
||||
{
|
||||
// 只需要传业务参数,appkey、timestamp、sign会自动添加
|
||||
};
|
||||
|
||||
string url = baseUrl.TrimEnd('/') + "/" + endpoint.TrimStart('/');
|
||||
|
||||
WebRequestManager.Instance.GetRequest(
|
||||
url: url,
|
||||
enableSign: true,
|
||||
signParams: signParams,
|
||||
onComplete: (result) => {
|
||||
Debug.Log($"GET请求成功: {result.ResponseCode}");
|
||||
Debug.Log($"响应内容: {result.ResponseText}");
|
||||
Debug.Log($"请求URL: {result.Url}");
|
||||
|
||||
if (enableDetailedLogging)
|
||||
{
|
||||
Debug.Log($"响应头: {result.ResponseHeaders}");
|
||||
}
|
||||
},
|
||||
onError: (error) => {
|
||||
Debug.LogError($"GET请求失败: {error}");
|
||||
}
|
||||
);
|
||||
|
||||
Debug.Log("--- 基础GET请求测试结束 ---");
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
|
||||
/// <summary>
|
||||
/// 测试异步POST请求with sign
|
||||
/// </summary>
|
||||
[ContextMenu("测试异步POST请求with sign")]
|
||||
public async void TestAsyncPostRequestWithSign()
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
// 设置配置
|
||||
Apis.SetAppKey(appKey);
|
||||
Apis.SetAppSecret(appSecret);
|
||||
Apis.SetToken(tokenValue);
|
||||
|
||||
// 业务参数
|
||||
var signParams = new Dictionary<string, string>
|
||||
{
|
||||
// 只需要传业务参数,appkey、timestamp、sign会自动添加
|
||||
};
|
||||
|
||||
string url = baseUrl.TrimEnd('/') + "/" + endpoint.TrimStart('/');
|
||||
|
||||
var result = await WebRequestManager.Instance.PostRequestAsync(
|
||||
url: url,
|
||||
signParams: signParams
|
||||
);
|
||||
|
||||
Debug.Log($"异步POST请求成功: {result.ResponseCode}");
|
||||
Debug.Log($"响应内容: {result.ResponseText}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"异步POST请求失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试异步GET请求with sign
|
||||
/// </summary>
|
||||
[ContextMenu("测试异步GET请求with sign")]
|
||||
public async void TestAsyncGetRequestWithSign()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 设置配置
|
||||
Apis.SetAppKey(appKey);
|
||||
Apis.SetAppSecret(appSecret);
|
||||
Apis.SetToken(tokenValue);
|
||||
|
||||
// 业务参数
|
||||
var signParams = new Dictionary<string, string>
|
||||
{
|
||||
// 只需要传业务参数,appkey、timestamp、sign会自动添加
|
||||
};
|
||||
|
||||
string url = baseUrl.TrimEnd('/') + "/" + endpoint.TrimStart('/');
|
||||
|
||||
var result = await WebRequestManager.Instance.GetRequestAsync(
|
||||
url: url,
|
||||
enableSign: true,
|
||||
signParams: signParams
|
||||
);
|
||||
|
||||
Debug.Log($"异步GET请求成功: {result.ResponseCode}");
|
||||
Debug.Log($"响应内容: {result.ResponseText}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"异步GET请求失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,8 +78,8 @@
|
|||
<Compile Include="Assets\MotionFramework\Scripts\Runtime\Engine\Core\MainThreadSyncContext.cs" />
|
||||
<Compile Include="Assets\MotionFramework\Scripts\Runtime\Engine\Core\ModuleSingleton.cs" />
|
||||
<Compile Include="Assets\MotionFramework\Scripts\Runtime\Engine\Engine.Reference\IReference.cs" />
|
||||
<Compile Include="Assets\MotionFramework\Scripts\Runtime\Engine\Engine.Network\WebRequest\WebGetRequest.cs" />
|
||||
<Compile Include="Assets\MotionFramework\Scripts\Runtime\Engine\Engine.Network\WebRequest\WebRequestBase.cs" />
|
||||
<Compile Include="Assets\MotionFramework\Scripts\Runtime\Engine\Engine.Network\WebRequest\WebGetRequest.cs" />
|
||||
<Compile Include="Assets\MotionFramework\Scripts\Runtime\Engine\Engine.Console\IConsoleWindow.cs" />
|
||||
<Compile Include="Assets\MotionFramework\Scripts\Runtime\Engine\Engine.Network\Socket\TcpClient.cs" />
|
||||
<Compile Include="Assets\MotionFramework\Scripts\Runtime\Engine\Engine.IO\StringOperate.cs" />
|
||||
|
@ -420,6 +420,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="netstandard">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\NetStandard\ref\2.1.0\netstandard.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -345,6 +345,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="netstandard">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\NetStandard\ref\2.1.0\netstandard.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -345,6 +345,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="netstandard">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\NetStandard\ref\2.1.0\netstandard.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -362,6 +362,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="nunit.framework">
|
||||
<HintPath>D:\Unity Project\wxgame\Library\PackageCache\com.unity.ext.nunit@1.0.6\net35\unity-custom\nunit.framework.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -418,6 +418,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="netstandard">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\NetStandard\ref\2.1.0\netstandard.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -346,6 +346,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="netstandard">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\NetStandard\ref\2.1.0\netstandard.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -80,8 +80,8 @@
|
|||
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\UnityEqualityComparer.cs" />
|
||||
<Compile Include="Assets\Plugins\UniTask\Runtime\ExceptionExtensions.cs" />
|
||||
<Compile Include="Assets\Plugins\UniTask\Runtime\CancellationTokenSourceExtensions.cs" />
|
||||
<Compile Include="Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.cs" />
|
||||
<Compile Include="Assets\Plugins\UniTask\Runtime\Triggers\MonoBehaviourMessagesTriggers.cs" />
|
||||
<Compile Include="Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.cs" />
|
||||
<Compile Include="Assets\Plugins\UniTask\Runtime\TriggerEvent.cs" />
|
||||
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.WhenEach.cs" />
|
||||
<Compile Include="Assets\Plugins\UniTask\Runtime\PlayerLoopHelper.cs" />
|
||||
|
@ -424,6 +424,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="netstandard">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\NetStandard\ref\2.1.0\netstandard.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -360,6 +360,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="nunit.framework">
|
||||
<HintPath>D:\Unity Project\wxgame\Library\PackageCache\com.unity.ext.nunit@1.0.6\net35\unity-custom\nunit.framework.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -361,6 +361,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="netstandard">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\NetStandard\ref\2.1.0\netstandard.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -30,10 +30,10 @@ EditorUserSettings:
|
|||
value: 50530d5352040b0a555f5a7316720a44154f4e7a7e7b7160797c4e63e0b86239
|
||||
flags: 0
|
||||
RecentlyUsedSceneGuid-8:
|
||||
value: 57030c0306005902585854704471094442154a2b7f7d24352b794462b0b73069
|
||||
value: 5a5757560101590a5d0c0e24427b5d44434e4c7a7b7a23677f2b4565b7b5353a
|
||||
flags: 0
|
||||
RecentlyUsedSceneGuid-9:
|
||||
value: 5a5757560101590a5d0c0e24427b5d44434e4c7a7b7a23677f2b4565b7b5353a
|
||||
value: 57030c0306005902585854704471094442154a2b7f7d24352b794462b0b73069
|
||||
flags: 0
|
||||
vcSharedLogLevel:
|
||||
value: 0d5e400f0650
|
||||
|
|
|
@ -121,7 +121,7 @@ MonoBehaviour:
|
|||
m_MinSize: {x: 400, y: 100}
|
||||
m_MaxSize: {x: 32384, y: 16192}
|
||||
vertical: 0
|
||||
controlID: 30328
|
||||
controlID: 23
|
||||
--- !u!114 &6
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
|
@ -193,12 +193,12 @@ MonoBehaviour:
|
|||
serializedVersion: 2
|
||||
x: 1142
|
||||
y: 0
|
||||
width: 313
|
||||
width: 306
|
||||
height: 939
|
||||
m_MinSize: {x: 100, y: 100}
|
||||
m_MaxSize: {x: 8096, y: 16192}
|
||||
vertical: 1
|
||||
controlID: 30351
|
||||
controlID: 46
|
||||
--- !u!114 &9
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 52
|
||||
|
@ -216,10 +216,10 @@ MonoBehaviour:
|
|||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 313
|
||||
height: 499
|
||||
m_MinSize: {x: 201, y: 221}
|
||||
m_MaxSize: {x: 4001, y: 4021}
|
||||
width: 306
|
||||
height: 306
|
||||
m_MinSize: {x: 200, y: 200}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_ActualView: {fileID: 14}
|
||||
m_Panes:
|
||||
- {fileID: 14}
|
||||
|
@ -241,9 +241,9 @@ MonoBehaviour:
|
|||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 499
|
||||
width: 313
|
||||
height: 440
|
||||
y: 306
|
||||
width: 306
|
||||
height: 633
|
||||
m_MinSize: {x: 232, y: 271}
|
||||
m_MaxSize: {x: 10002, y: 10021}
|
||||
m_ActualView: {fileID: 15}
|
||||
|
@ -266,12 +266,12 @@ MonoBehaviour:
|
|||
m_Children: []
|
||||
m_Position:
|
||||
serializedVersion: 2
|
||||
x: 1455
|
||||
x: 1448
|
||||
y: 0
|
||||
width: 465
|
||||
width: 472
|
||||
height: 939
|
||||
m_MinSize: {x: 276, y: 71}
|
||||
m_MaxSize: {x: 4001, y: 4021}
|
||||
m_MinSize: {x: 275, y: 50}
|
||||
m_MaxSize: {x: 4000, y: 4000}
|
||||
m_ActualView: {fileID: 16}
|
||||
m_Panes:
|
||||
- {fileID: 16}
|
||||
|
@ -709,7 +709,7 @@ MonoBehaviour:
|
|||
sizeOverriden: 0
|
||||
m_OverlaysVisible: 1
|
||||
m_WindowGUID: a5ab22af36121fe46b2155f93d3579fd
|
||||
m_Gizmos: 0
|
||||
m_Gizmos: 1
|
||||
m_OverrideSceneCullingMask: 6917529027641081856
|
||||
m_SceneIsLit: 1
|
||||
m_SceneLighting: 1
|
||||
|
@ -718,9 +718,9 @@ MonoBehaviour:
|
|||
m_PlayAudio: 0
|
||||
m_AudioPlay: 0
|
||||
m_Position:
|
||||
m_Target: {x: 167.86415, y: 476.24854, z: -2.7092276}
|
||||
m_Target: {x: 171.9879, y: 506.04272, z: -2.0295398}
|
||||
speed: 2
|
||||
m_Value: {x: 173.60417, y: 478.0294, z: -2.6034894}
|
||||
m_Value: {x: 171.9879, y: 506.04272, z: -2.0295398}
|
||||
m_RenderMode: 0
|
||||
m_CameraMode:
|
||||
drawMode: 0
|
||||
|
@ -770,9 +770,9 @@ MonoBehaviour:
|
|||
speed: 2
|
||||
m_Value: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_Size:
|
||||
m_Target: 245.54547
|
||||
m_Target: 226.24767
|
||||
speed: 2
|
||||
m_Value: 234.97174
|
||||
m_Value: 226.24767
|
||||
m_Ortho:
|
||||
m_Target: 1
|
||||
speed: 2
|
||||
|
@ -819,8 +819,8 @@ MonoBehaviour:
|
|||
serializedVersion: 2
|
||||
x: 1142
|
||||
y: 73
|
||||
width: 311
|
||||
height: 478
|
||||
width: 304
|
||||
height: 285
|
||||
m_SerializedDataModeController:
|
||||
m_DataMode: 0
|
||||
m_PreferredDataMode: 0
|
||||
|
@ -833,24 +833,24 @@ MonoBehaviour:
|
|||
m_OverlaysVisible: 1
|
||||
m_SceneHierarchy:
|
||||
m_TreeViewState:
|
||||
scrollPos: {x: 0, y: 311}
|
||||
m_SelectedIDs: bc3efeff
|
||||
m_LastClickedID: -115012
|
||||
m_ExpandedIDs: e29cfdffce12feffbc3efeffbe3efeffc03efeffe43efeffec3efeff5c5dfeff2261feff748bfeff9e91feff1e96feffd897feff92a0feff72b4feff10befeffdec6feffb6c7feff72d0feffb6d0feff22dafeffe2dafeff54e7feff6805ffffd20effff0c12ffff6420ffff322affff1e4dffffe675ffff10f5ffff2efbffffd86200002863000020640000bc0401000e050100380601006408010010140100ec2401003e2501006626010070260100
|
||||
scrollPos: {x: 0, y: 300}
|
||||
m_SelectedIDs: a4630000
|
||||
m_LastClickedID: 25508
|
||||
m_ExpandedIDs: 22fbffff62630000ac630000c46300000a640000746400004c650000ba650000d6650000dc650000e2650000
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
m_OriginalName:
|
||||
m_Name: Text (TMP)
|
||||
m_OriginalName: Text (TMP)
|
||||
m_EditFieldRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 0
|
||||
height: 0
|
||||
m_UserData: 0
|
||||
m_UserData: -9124
|
||||
m_IsWaitingForDelay: 0
|
||||
m_IsRenaming: 0
|
||||
m_OriginalEventType: 11
|
||||
m_OriginalEventType: 0
|
||||
m_IsRenamingFilename: 0
|
||||
m_ClientGUIView: {fileID: 9}
|
||||
m_SearchString:
|
||||
|
@ -881,9 +881,9 @@ MonoBehaviour:
|
|||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 1142
|
||||
y: 572
|
||||
width: 311
|
||||
height: 419
|
||||
y: 379
|
||||
width: 304
|
||||
height: 612
|
||||
m_SerializedDataModeController:
|
||||
m_DataMode: 0
|
||||
m_PreferredDataMode: 0
|
||||
|
@ -905,7 +905,7 @@ MonoBehaviour:
|
|||
m_SkipHidden: 0
|
||||
m_SearchArea: 1
|
||||
m_Folders:
|
||||
- Assets/Fonts
|
||||
- Assets/Resources/Item
|
||||
m_Globs: []
|
||||
m_OriginalText:
|
||||
m_ImportLogFlags: 0
|
||||
|
@ -921,7 +921,7 @@ MonoBehaviour:
|
|||
scrollPos: {x: 0, y: 0}
|
||||
m_SelectedIDs: 24630000
|
||||
m_LastClickedID: 25380
|
||||
m_ExpandedIDs: ffffffff0000000084650000186600002e660000ca690000e86c0000ea6c0000ec6c0000ee6c0000f06c0000f26c0000f46c0000f66c0000f86c0000fa6c0000fc6c0000fe6c0000006d0000026d0000046d0000066d0000086d00000a6d00000c6d00000e6d0000106d0000126d0000146d0000166d0000186d00001a6d00001c6d00001e6d0000206d0000226d0000246d0000266d0000286d00002a6d00002c6d00002e6d0000306d0000326d0000346d0000366d0000386d00003a6d00003c6d00003e6d0000406d0000426d0000446d0000466d00004a6d00004c6d00004e6d0000506d0000546d0000566d0000c86d0000cc6d0000d66d0000d86d00007871000014ed0000bc0201002a2b01005e8a010022af0100
|
||||
m_ExpandedIDs: 00000000186700007867000002680000186800005a6c0000206d000000710000027100000471000006710000087100000a7100000c7100000e71000010710000127100001471000016710000187100001a7100001c7100001e71000020710000227100002471000026710000287100002a7100002c7100002e71000030710000327100003471000036710000387100003a7100003c7100003e71000040710000427100004471000046710000487100004a7100004c7100004e71000050710000527100005471000056710000587100005a7100005c7100005e71000060710000627100006471000066710000687100006a7100006c7100006e71000070710000727100007471000076710000787100007a7100007c710000
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
|
@ -946,10 +946,10 @@ MonoBehaviour:
|
|||
m_Icon: {fileID: 0}
|
||||
m_ResourceFile:
|
||||
m_AssetTreeState:
|
||||
scrollPos: {x: 0, y: 180}
|
||||
scrollPos: {x: 0, y: 0}
|
||||
m_SelectedIDs:
|
||||
m_LastClickedID: 0
|
||||
m_ExpandedIDs: ffffffff0000000084650000186600002e660000ca690000e86c0000ea6c0000ec6c0000ee6c0000f06c0000f26c0000f46c0000f66c0000f86c0000fa6c0000fc6c0000fe6c0000006d0000026d0000046d0000066d0000086d00000a6d00000c6d00000e6d0000106d0000126d0000146d0000166d0000186d00001a6d00001c6d00001e6d0000206d0000226d0000246d0000266d0000286d00002a6d00002c6d00002e6d0000306d0000326d0000346d0000366d0000386d00003a6d00003c6d00003e6d0000406d0000426d0000446d0000466d00004a6d00004c6d00004e6d0000506d0000546d0000566d0000c86d0000ca6d0000cc6d0000d66d0000d86d00007871000014ed0000bc0201002a2b01005e8a010022af0100
|
||||
m_ExpandedIDs: ffffffff00000000186700007867000002680000186800005a6c0000206d000000710000027100000471000006710000087100000a7100000c7100000e71000010710000127100001471000016710000187100001a7100001c7100001e71000020710000227100002471000026710000287100002a7100002c7100002e71000030710000327100003471000036710000387100003a7100003c7100003e71000040710000427100004471000046710000487100004a7100004c7100004e71000050710000527100005471000056710000587100005a7100005c7100005e71000060710000627100006471000066710000687100006a7100006c7100006e71000070710000727100007471000076710000787100007a7100007c71000000720000
|
||||
m_RenameOverlay:
|
||||
m_UserAcceptedRename: 0
|
||||
m_Name:
|
||||
|
@ -1025,9 +1025,9 @@ MonoBehaviour:
|
|||
m_Tooltip:
|
||||
m_Pos:
|
||||
serializedVersion: 2
|
||||
x: 1455
|
||||
x: 1448
|
||||
y: 73
|
||||
width: 464
|
||||
width: 471
|
||||
height: 918
|
||||
m_SerializedDataModeController:
|
||||
m_DataMode: 0
|
||||
|
@ -1046,7 +1046,7 @@ MonoBehaviour:
|
|||
m_ControlHash: -371814159
|
||||
m_PrefName: Preview_InspectorPreview
|
||||
m_LastInspectedObjectInstanceID: -1
|
||||
m_LastVerticalScrollValue: 299
|
||||
m_LastVerticalScrollValue: 0
|
||||
m_GlobalObjectId:
|
||||
m_InspectorMode: 0
|
||||
m_LockTracker:
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASetupCoroutine_002Ecs_002Fl_003AC_0021_003FUsers_003Fadmin_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F30adf90198bc4c4b83910c6fb1877998174000_003F30_003F4b1929fb_003FSetupCoroutine_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
|
|
@ -399,6 +399,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="netstandard">
|
||||
<HintPath>D:\UnityEditor\2022.3.14f1\Editor\Data\NetStandard\ref\2.1.0\netstandard.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -398,6 +398,9 @@
|
|||
<Reference Include="wx-perf">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\WX-WASM-SDK-V2\Runtime\Plugins\wx-perf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>D:\Unity Project\wxgame\Assets\Plugins\Newtonsoft\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="nunit.framework">
|
||||
<HintPath>D:\Unity Project\wxgame\Library\PackageCache\com.unity.ext.nunit@1.0.6\net35\unity-custom\nunit.framework.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
|
@ -0,0 +1,171 @@
|
|||
# 上下文
|
||||
文件名:sign_generation_task.md
|
||||
创建于:2025-01-27 10:30:00
|
||||
创建者:AI Assistant
|
||||
关联协议:RIPER-5 + Multidimensional + Agent Protocol (Conditional Interactive Step Review Enhanced)
|
||||
|
||||
# 任务描述
|
||||
为Unity微信小游戏项目添加sign签名生成功能,根据提供的PHP示例实现C#版本的sign生成方法。接口请求需要增加sign参数,按照以下规则生成:
|
||||
1. 将参数去除sign进行ASCII排序
|
||||
2. 拼接成字符串(key+value格式)
|
||||
3. 在字符串后面加上AppSecret
|
||||
4. 进行MD5加密
|
||||
|
||||
# 项目概述
|
||||
Unity微信小游戏项目,使用WebRequestManager进行HTTP请求管理,已有token认证机制。需要集成sign签名验证机制以增强接口安全性。
|
||||
|
||||
---
|
||||
*以下部分由 AI 在协议执行过程中维护*
|
||||
---
|
||||
|
||||
# 分析 (由 RESEARCH 模式填充)
|
||||
通过代码分析发现:
|
||||
|
||||
1. **现有网络架构**:
|
||||
- WebRequestManager.cs:负责HTTP请求管理,支持GET/POST请求
|
||||
- Apis.cs:管理API接口地址和token
|
||||
- 已有token认证机制,通过请求头传递
|
||||
|
||||
2. **MD5加密支持**:
|
||||
- MotionFramework.Utility.HashUtility.StringMD5():提供MD5加密功能
|
||||
- 支持字符串MD5加密,符合sign生成需求
|
||||
|
||||
3. **请求参数处理**:
|
||||
- 当前支持urlencoded和JSON格式
|
||||
- PostFormRequest方法处理表单数据
|
||||
- 需要扩展支持sign参数自动生成
|
||||
|
||||
4. **配置管理**:
|
||||
- Apis.cs管理基础配置
|
||||
- 需要添加AppKey和AppSecret配置
|
||||
|
||||
5. **接口调用模式**:
|
||||
- 使用异步UniTask模式
|
||||
- 支持回调函数和异常处理
|
||||
- 需要保持现有调用方式兼容性
|
||||
|
||||
# 提议的解决方案 (由 INNOVATE 模式填充)
|
||||
基于研究分析,采用混合方案实现sign生成功能:
|
||||
|
||||
**方案选择**:混合方案(推荐)
|
||||
- 创建SignUtility工具类处理签名逻辑
|
||||
- 在WebRequestManager中添加可选的sign支持
|
||||
- 保持向后兼容,新接口可选择启用sign
|
||||
- 优点:灵活性高,兼容性好
|
||||
|
||||
**技术实现**:
|
||||
- 参数排序:使用SortedDictionary确保ASCII排序
|
||||
- 数组处理:JSON序列化数组参数
|
||||
- MD5加密:使用现有HashUtility.StringMD5
|
||||
- 配置管理:在Apis.cs中添加AppKey/AppSecret
|
||||
- 错误处理:完善的异常处理机制
|
||||
|
||||
# 实施计划 (由 PLAN 模式生成)
|
||||
基于创新阶段的分析,采用混合方案来实现sign生成功能。
|
||||
|
||||
**架构设计**:
|
||||
1. 创建SignUtility工具类,专门处理签名生成逻辑
|
||||
2. 扩展Apis.cs,添加AppKey和AppSecret配置管理
|
||||
3. 修改WebRequestManager,添加可选的sign支持
|
||||
4. 保持向后兼容,现有接口调用不受影响
|
||||
|
||||
**详细实施规范**:
|
||||
|
||||
**文件修改计划**:
|
||||
- `Assets/Scripts/Utility/SignUtility.cs` (新建)
|
||||
- `Assets/Scripts/Apis.cs` (扩展)
|
||||
- `Assets/Scripts/Network/WebRequestManager.cs` (扩展)
|
||||
- `Assets/Scripts/Test/SignUtilityTest.cs` (新建)
|
||||
|
||||
**SignUtility类设计**:
|
||||
- 静态方法:GenerateSign(Dictionary<string, object> parameters, string appSecret)
|
||||
- 支持参数排序、数组处理、MD5加密
|
||||
- 完善的错误处理和日志记录
|
||||
|
||||
**Apis.cs扩展**:
|
||||
- 添加AppKey和AppSecret静态属性
|
||||
- 添加设置和获取方法
|
||||
- 保持现有接口不变
|
||||
|
||||
**WebRequestManager扩展**:
|
||||
- 添加enableSign参数到请求方法
|
||||
- 自动生成sign参数并添加到请求中
|
||||
- 保持现有方法签名兼容
|
||||
|
||||
实施检查清单:
|
||||
1. [创建SignUtility工具类,实现sign生成核心逻辑, review:true]
|
||||
2. [扩展Apis.cs,添加AppKey和AppSecret配置管理, review:true]
|
||||
3. [修改WebRequestManager,添加sign支持到GET请求方法, review:true]
|
||||
4. [修改WebRequestManager,添加sign支持到POST请求方法, review:true]
|
||||
5. [添加异步方法的sign支持, review:true]
|
||||
6. [创建测试用例验证sign生成正确性, review:true]
|
||||
7. [更新任务进度文档, review:false]
|
||||
|
||||
# 当前执行步骤 (由 EXECUTE 模式在开始执行某步骤时更新)
|
||||
|
||||
# 任务进度 (由 EXECUTE 模式在每步完成后,以及在交互式审查迭代中追加)
|
||||
|
||||
* 2025-01-27 10:35:00
|
||||
* 步骤:1. [创建SignUtility工具类,实现sign生成核心逻辑 (完成, 审查需求: review:true)]
|
||||
* 修改:创建了 Assets/Scripts/Utility/SignUtility.cs 文件,实现了完整的sign生成功能
|
||||
* 更改摘要:实现了SignUtility静态工具类,包含GenerateSign方法(支持object和string参数)、参数排序、数组处理、MD5加密、签名验证等功能,添加了完善的错误处理和日志记录
|
||||
* 原因:执行计划步骤 1 的实施
|
||||
* 阻碍:无
|
||||
* 状态:已完成
|
||||
* 用户确认状态:成功
|
||||
|
||||
* 2025-01-27 10:40:00
|
||||
* 步骤:2. [扩展Apis.cs,添加AppKey和AppSecret配置管理 (完成, 审查需求: review:true)]
|
||||
* 修改:扩展了 Assets/Scripts/Apis.cs 文件,添加了AppKey和AppSecret的静态属性和相关方法
|
||||
* 更改摘要:添加了SetAppKey/GetAppKey和SetAppSecret/GetAppSecret方法,保持现有接口不变,为sign生成提供配置支持
|
||||
* 原因:执行计划步骤 2 的实施
|
||||
* 阻碍:无
|
||||
* 状态:已完成
|
||||
* 用户确认状态:成功
|
||||
|
||||
* 2025-01-27 10:45:00
|
||||
* 步骤:3. [修改WebRequestManager,添加sign支持到GET请求方法 (完成, 审查需求: review:true)]
|
||||
* 修改:修改了 Assets/Scripts/Network/WebRequestManager.cs 文件,为GetRequest方法添加了sign支持
|
||||
* 更改摘要:添加了enableSign和signParams参数,自动生成sign签名并添加到请求中,支持AppKey和时间戳自动添加
|
||||
* 原因:执行计划步骤 3 的实施
|
||||
* 阻碍:无
|
||||
* 状态:已完成
|
||||
* 用户确认状态:成功
|
||||
|
||||
* 2025-01-27 10:50:00
|
||||
* 步骤:4. [修改WebRequestManager,添加sign支持到POST请求方法 (完成, 审查需求: review:true)]
|
||||
* 修改:修改了 Assets/Scripts/Network/WebRequestManager.cs 文件,为PostRequest方法添加了sign支持
|
||||
* 更改摘要:添加了enableSign和signParams参数,支持urlencoded和JSON两种格式的sign参数添加,自动生成sign签名
|
||||
* 原因:执行计划步骤 4 的实施
|
||||
* 阻碍:无
|
||||
* 状态:已完成
|
||||
* 用户确认状态:成功
|
||||
|
||||
* 2025-01-27 10:55:00
|
||||
* 步骤:5. [添加异步方法的sign支持 (完成, 审查需求: review:true)]
|
||||
* 修改:修改了 Assets/Scripts/Network/WebRequestManager.cs 文件,为GetRequestAsync和PostRequestAsync方法添加了sign支持
|
||||
* 更改摘要:为异步方法添加了enableSign和signParams参数,保持与同步方法的一致性
|
||||
* 原因:执行计划步骤 5 的实施
|
||||
* 阻碍:无
|
||||
* 状态:已完成
|
||||
* 用户确认状态:成功
|
||||
|
||||
* 2025-01-27 11:00:00
|
||||
* 步骤:6. [创建测试用例验证sign生成正确性 (完成, 审查需求: review:true)]
|
||||
* 修改:创建了 Assets/Scripts/Test/SignUtilityTest.cs 文件,实现了完整的测试用例
|
||||
* 更改摘要:实现了SignUtilityTest类,包含基本sign生成、数组处理、签名验证、空参数、null参数、PHP示例一致性等测试用例,提供Inspector界面测试
|
||||
* 原因:执行计划步骤 6 的实施
|
||||
* 阻碍:无
|
||||
* 状态:已完成
|
||||
* 用户确认状态:成功
|
||||
|
||||
* 2025-01-27 11:05:00
|
||||
* 步骤:7. [更新任务进度文档 (完成, 审查需求: review:false)]
|
||||
* 修改:更新了 sign_generation_task.md 文件,完善了所有阶段的文档记录
|
||||
* 更改摘要:补充了提议的解决方案和实施计划的详细内容,记录了所有执行步骤的完成情况
|
||||
* 原因:执行计划步骤 7 的实施
|
||||
* 阻碍:无
|
||||
* 状态:已完成
|
||||
* 用户确认状态:成功
|
||||
|
||||
# 最终审查 (由 REVIEW 模式填充)
|
Loading…
Reference in New Issue