com.taptap.sdk.cloudsave 4.8.0-beta.1 → 4.8.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/Mobile/Editor/NativeDependencies.xml +7 -1
  2. package/Mobile/Runtime/TapCloudSaveBridge.cs +117 -16
  3. package/Runtime/Internal/ITapCloudSaveBridge.cs +7 -3
  4. package/Runtime/Internal/TapCloudSaveInitTask.cs +2 -0
  5. package/Runtime/Internal/TapTapCloudSaveInternal.cs +9 -3
  6. package/Runtime/Public/TapTapCloudSave.cs +4 -2
  7. package/Standalone/Editor/TapCloudSaveStandaloneProcessBuild.cs +26 -0
  8. package/Standalone/Editor/TapCloudSaveStandaloneProcessBuild.cs.meta +11 -0
  9. package/Standalone/Editor/TapSDK.CloudSave.Standalone.Editor.asmdef +17 -0
  10. package/Standalone/Editor/TapSDK.CloudSave.Standalone.Editor.asmdef.meta +7 -0
  11. package/Standalone/Editor.meta +8 -0
  12. package/Standalone/Plugins/x86_64/cloudsave_sdk.dll +0 -0
  13. package/Standalone/Plugins/x86_64/cloudsave_sdk.dll.meta +80 -0
  14. package/Standalone/Plugins/x86_64.meta +8 -0
  15. package/Standalone/Plugins.meta +8 -0
  16. package/Standalone/Runtime/Internal/TapCloudSaveArchiveListResponse.cs +11 -0
  17. package/Standalone/Runtime/Internal/TapCloudSaveArchiveListResponse.cs.meta +11 -0
  18. package/Standalone/Runtime/Internal/TapCloudSaveBaseResponse.cs +29 -0
  19. package/Standalone/Runtime/Internal/TapCloudSaveBaseResponse.cs.meta +11 -0
  20. package/Standalone/Runtime/Internal/TapCloudSaveTracker.cs +101 -0
  21. package/Standalone/Runtime/Internal/TapCloudSaveTracker.cs.meta +11 -0
  22. package/Standalone/Runtime/Internal/TapCloudSaveWrapper.cs +518 -0
  23. package/Standalone/Runtime/Internal/TapCloudSaveWrapper.cs.meta +11 -0
  24. package/Standalone/Runtime/Internal.meta +8 -0
  25. package/Standalone/Runtime/TapCloudSaveResultCode.cs +9 -0
  26. package/Standalone/Runtime/TapCloudSaveResultCode.cs.meta +11 -0
  27. package/Standalone/Runtime/TapCloudSaveStandalone.cs +733 -0
  28. package/Standalone/Runtime/TapCloudSaveStandalone.cs.meta +11 -0
  29. package/Standalone/Runtime.meta +8 -0
  30. package/Standalone/TapSDK.CloudSave.Standalone.Runtime.asmdef +22 -0
  31. package/Standalone/TapSDK.CloudSave.Standalone.Runtime.asmdef.meta +7 -0
  32. package/Standalone.meta +8 -0
  33. package/link.xml.meta +1 -1
  34. package/package.json +10 -10
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 729397b8e788b4d608b9e9a200355798
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,518 @@
1
+ using System;
2
+ using System.Runtime.InteropServices;
3
+ using System.Text;
4
+
5
+ namespace TapSDK.CloudSave.Standalone
6
+ {
7
+ internal class TapCloudSaveWrapper
8
+ {
9
+ #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
10
+ internal const string DllName = "cloudsave_sdk";
11
+ #elif UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
12
+ internal const string DllName = "libcloudsave_sdk";
13
+ #endif
14
+
15
+ /**
16
+ * 初始化接口,只需要调用一次。非线程安全,并发调用可能崩溃。
17
+ *
18
+ * cfg 初始化配置,JSON 格式:
19
+ *
20
+ * TapSDK参数格式
21
+ * {
22
+ * "region": 2,
23
+ * "log_to_console": 1,
24
+ * "log_level": 3,
25
+ * "data_dir": "/tmp",
26
+ * "client_id": "***",
27
+ * "client_token": "***",
28
+ * "ua": "TapSDK-Android/3.28.0",
29
+ * "lang": "zh-CN",
30
+ * "platform": "Android",
31
+ * "device_id": "123456",
32
+ * "sdk_artifact": "Android",
33
+ * "sdk_module_ver": "4.6.0",
34
+ * "sdk_token": {
35
+ * "kid": "***",
36
+ * "key": "***"
37
+ * }
38
+ * }
39
+ *
40
+ *
41
+ * - region 取值:0 国内、1 海外、2 RND、3 海外RND
42
+ * - log_to_console 是否输出到控制台:0 不输出、1 输出。
43
+ * - log_level 取值:1 Trace、2 Debug、3 Info、4 Warn、5 Error、6 完全不输出
44
+ * - data_dir 保存本地缓存和日志文件的目录,不允许为空
45
+ * - client_id 不允许为空
46
+ * - client_token 不允许为空
47
+ * - ua user agent,不允许为空
48
+ * - lang 语言,允许为空
49
+ * - platform 不允许为空,TapSDK专用参数
50
+ * - device_id 设备ID,不允许为空,TapSDK专用参数
51
+ * - sdk_artifact 不允许为空,TapSDK专用参数
52
+ * - sdk_module_ver 不允许为空,TapSDK专用参数
53
+ * - sdk_token 登录态鉴权token,允许为空,TapSDK专用参数
54
+ * - kid mac_key id,不允许为空
55
+ * - key mac密钥,不允许为空
56
+ * - runtime_ver 宿主版本,不允许为空,Tap Miniapp专用参数
57
+ * - access_token 登录态鉴权token,允许为空,Tap Miniapp专用参数
58
+ * - kid mac_key id,不允许为空
59
+ * - key mac密钥,不允许为空
60
+ *
61
+ * 成功返回 0,失败返回 -1
62
+ */
63
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
64
+ internal static extern int TapSdkCloudSaveInitialize(string cfg);
65
+
66
+ /**
67
+ * 用于释放TapSdkCloudSaveCreateArchive、TapSdkCloudSaveGetArchiveList、TapSdkCloudSaveGetArchiveData等函数返回的堆内存
68
+ *
69
+ * @param data 需要释放的内存
70
+ */
71
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
72
+ internal static extern void TapSdkCloudSaveFreeMemory(IntPtr intPtr);
73
+
74
+ /**
75
+ * access token发生变化(比如切换账号)时调用。收到接口报access_denied错误时,SDK使用方需要重新登录,然后调用该接口更新access token
76
+ *
77
+ * @param token 最新的access token,传空指针或"{}"表示用户退出登录。格式如下:
78
+ * {
79
+ * "kid": "***",
80
+ * "key": "***"
81
+ * }
82
+ *
83
+ * @return 成功返回 0,失败(通常是JSON格式错误)返回 -1
84
+ */
85
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
86
+ internal static extern int TapSdkCloudSaveUpdateAccessToken(string token);
87
+
88
+ /**
89
+ * 创建云存档,同步等待服务端返回,然后更新本地存档缓存。不允许并发调用,否则直接抛错
90
+ *
91
+ * @param metadata 存档元信息,JSON格式
92
+ * {
93
+ * "name": "存档名,60字节以内,不允许空,不允许汉字",
94
+ * "summary": "存档描述,500字节以内,不允许空",
95
+ * "extra": "用户自定义信息,1000字节以内,允许空",
96
+ * "playtime": 0
97
+ * }
98
+ * - playtime 秒级
99
+ * @param archiveData 存档二进制数据,不允许空指针
100
+ * @param archiveDataSize saveData的大小(字节),不允许为0
101
+ * @param coverData 封面二进制数据,允许空指针
102
+ * @param coverDataSize saveData的大小(字节),允许为0
103
+ * @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
104
+ * {
105
+ * "X-UA": "***",
106
+ * "miniappId": "***"
107
+ * }
108
+ *
109
+ * @return JSON格式,服务端生成的云存档UUID和FileID,或者错误信息。用完后,调用方需要调用TapSdkCloudSaveFreeMemory来释放内存
110
+ * {
111
+ * "data": {
112
+ * "uuid": "存档UUID",
113
+ * "file_id": "存档文件ID,用于下载文件"
114
+ * },
115
+ * "now": 1748340775,
116
+ * "success": true
117
+ * }
118
+ * @note 对于Tap Miniapp,JSON字段使用驼峰风格。比如上面的返回示例,对于Tap Miniapp,是"fileId"而不是"file_id"。
119
+ */
120
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
121
+ internal static extern IntPtr TapSdkCloudSaveCreateArchive(
122
+ string metadata,
123
+ byte[] archiveData,
124
+ int archiveDataSize,
125
+ byte[] coverData,
126
+ int coverDataSize,
127
+ string extraParams
128
+ );
129
+
130
+ /**
131
+ * 更新云存档,同步等待服务端返回,然后更新本地存档缓存。不允许并发调用,否则直接抛错
132
+ *
133
+ * @param archiveUUID TapSdkCloudSaveCreateArchive()返回的云存档UUID,比如:"1bffaa173dde2e7afb5adf6442971961"。必须先创建云存档成功后,通过云存档UUID来更新
134
+ * @param metadata 存档元信息,JSON格式
135
+ * {
136
+ * "name": "存档名,60字节以内,不允许空,不允许汉字",
137
+ * "summary": "存档描述,500字节以内,不允许空",
138
+ * "extra": "用户自定义信息,1000字节以内,允许空",
139
+ * "playtime": 0
140
+ * }
141
+ * - playtime 秒级
142
+ * @param archiveData 存档二进制数据,不允许空指针
143
+ * @param archiveDataSize saveData的大小(字节),不允许为0
144
+ * @param coverData 封面二进制数据,允许空指针
145
+ * @param coverDataSize saveData的大小(字节),允许为0
146
+ * @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
147
+ * {
148
+ * "X-UA": "***",
149
+ * "miniappId": "***"
150
+ * }
151
+ *
152
+ * @return JSON格式,服务端生成的云存档UUID和FileID,或者错误信息。用完后,调用方需要调用TapSdkCloudSaveFreeMemory来释放内存
153
+ * {
154
+ * "data": {
155
+ * "uuid": "存档UUID",
156
+ * "file_id": "存档文件ID,用于下载文件"
157
+ * },
158
+ * "now": 1748340775,
159
+ * "success": true
160
+ * }
161
+ * @note 对于Tap Miniapp,JSON字段使用驼峰风格。比如上面的返回示例,对于Tap Miniapp,是"fileId"而不是"file_id"。
162
+ */
163
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
164
+ internal static extern IntPtr TapSdkCloudSaveUpdateArchive(
165
+ string archiveUUID,
166
+ string metadata,
167
+ byte[] archiveData,
168
+ int archiveDataSize,
169
+ byte[] coverData,
170
+ int coverDataSize,
171
+ string extraParams
172
+ );
173
+
174
+ /**
175
+ * 发起删除存档请求,同步等待服务端返回,然后删除本地存档缓存。允许并发调用
176
+ *
177
+ * @param archiveUUID TapSdkCloudSaveCreateArchive()/TapSdkCloudSaveGetArchiveList()返回的云存档UUID,比如:"1bffaa173dde2e7afb5adf6442971961"。必须先创建云存档成功后,通过云存档UUID来删除
178
+ * @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
179
+ * {
180
+ * "X-UA": "***",
181
+ * "miniappId": "***"
182
+ * }
183
+ *
184
+ * @return JSON格式,返回成功或者错误信息。用完后,调用方需要调用TapSdkCloudSaveFreeMemory来释放内存
185
+ * {
186
+ * "data": {
187
+ * "uuid": "被删掉的云存档UUID"
188
+ * },
189
+ * "now": 1748487810,
190
+ * "success": true
191
+ * }
192
+ */
193
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
194
+ internal static extern IntPtr TapSdkCloudSaveDeleteArchive(
195
+ string archiveUUID,
196
+ string extraParams
197
+ );
198
+
199
+ /**
200
+ * 获取存档元信息列表,同步等待服务端返回。允许并发调用
201
+ *
202
+ * @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
203
+ * {
204
+ * "X-UA": "***",
205
+ * "miniappId": "***"
206
+ * }
207
+ *
208
+ * @return JSON格式,返回存档元信息列表,或者错误信息。用完后,需要调用TapSdkCloudSaveFreeMemory来释放内存
209
+ * {
210
+ * "data": {
211
+ * "saves": [
212
+ * {
213
+ * "uuid": "738b6c08bdbe459b96607dd10f83d177",
214
+ * "file_id": "738b6c08bdbe459b96607dd10f83d177",
215
+ * "name": "save",
216
+ * "save_size": 184237,
217
+ * "cover_size": 7138,
218
+ * "summary": "i love this game",
219
+ * "extra": "what the hell",
220
+ * "playtime": 0,
221
+ * "created_time": 1748587677,
222
+ * "modified_time": 1748587677
223
+ * }
224
+ * ]
225
+ * },
226
+ * "now": 1748588091,
227
+ * "success": true
228
+ * }
229
+ * - playtime 秒级
230
+ * @note 对于Tap Miniapp,JSON字段使用驼峰风格。比如上面的返回示例,对于Tap Miniapp,是"fileId/saveSize"而不是"file_id/save_size"。
231
+ */
232
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
233
+ internal static extern IntPtr TapSdkCloudSaveGetArchiveList(string extraParams);
234
+
235
+ /**
236
+ * 读取存档文件,优先使用本地缓存,不存在才下载
237
+ *
238
+ * @param archiveUUID TapSdkCloudSaveCreateArchive()/TapSdkCloudSaveGetArchiveList()返回的云存档UUID,必须先创建云存档成功后,才能读取
239
+ * @param archiveFileID TapSdkCloudSaveCreateArchive()/TapSdkCloudSaveGetArchiveList()返回的存档文件FileID,必须先创建云存档成功后,才能读取
240
+ * @param archiveDataSize 出参,实际读取到的存档文件大小。如果读取失败,则其值会是负数
241
+ * @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
242
+ * {
243
+ * "X-UA": "***",
244
+ * "miniappId": "***"
245
+ * }
246
+ *
247
+ * @return 成功时saveSize是实际读取到的存档文件大小,返回存档文件内容;失败时saveSize是负数,返回JSON格式的错误信息,格式如下。用完后,需要调用TapSdkCloudSaveFreeMemory来释放内存
248
+ * {
249
+ * "data": {
250
+ * "code": -1,
251
+ * "msg": "InvalidArgument: BINDING: Key: 'GetSavesRequest.uuid' Error:Field validation for 'uuid' failed on the 'len' tag",
252
+ * "error": "invalid_request",
253
+ * "error_description": "InvalidArgument: BINDING: Key: 'GetSavesRequest.uuid' Error:Field validation for 'uuid' failed on the 'len' tag"
254
+ * },
255
+ * "now": 1748915185,
256
+ * "success": false
257
+ * }
258
+ * @note 对于Tap Miniapp,JSON字段使用驼峰风格。比如上面的返回示例,对于Tap Miniapp,是"errorDescription"而不是"error_description"。
259
+ */
260
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
261
+ internal static extern IntPtr TapSdkCloudSaveGetArchiveData(
262
+ string archiveUUID,
263
+ string archiveFileID,
264
+ out int archiveDataSize,
265
+ string extraParams
266
+ );
267
+
268
+ /**
269
+ * 读取封面文件,优先使用本地缓存,不存在才下载
270
+ *
271
+ * @param archiveUUID TapSdkCloudSaveCreateArchive()/TapSdkCloudSaveGetArchiveList()返回的云存档UUID,必须先创建云存档成功后,才能读取
272
+ * @param archiveFileID TapSdkCloudSaveCreateArchive()/TapSdkCloudSaveGetArchiveList()返回的存档文件FileID,必须先创建云存档成功后,才能读取
273
+ * @param coverSize 出参,实际读取到的封面文件大小。如果读取失败,则其值会是负数
274
+ * @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
275
+ * {
276
+ * "X-UA": "***",
277
+ * "miniappId": "***"
278
+ * }
279
+ *
280
+ * @return 成功时coverSize是实际读取到的封面文件大小,返回cover文件内容;失败时coverSize是负数,返回JSON格式的错误信息,格式如下。用完后,需要调用TapSdkCloudSaveFreeMemory来释放内存
281
+ * {
282
+ * "data": {
283
+ * "code": -1,
284
+ * "msg": "InvalidArgument: BINDING: Key: 'GetSavesRequest.uuid' Error:Field validation for 'uuid' failed on the 'len' tag",
285
+ * "error": "invalid_request",
286
+ * "error_description": "InvalidArgument: BINDING: Key: 'GetSavesRequest.uuid' Error:Field validation for 'uuid' failed on the 'len' tag"
287
+ * },
288
+ * "now": 1748915185,
289
+ * "success": false
290
+ * }
291
+ * @note 对于Tap Miniapp,JSON字段使用驼峰风格。比如上面的返回示例,对于Tap Miniapp,是"errorDescription"而不是"error_description"。
292
+ */
293
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
294
+ internal static extern IntPtr TapSdkCloudSaveGetArchiveCover(
295
+ string archiveUUID,
296
+ string archiveFileID,
297
+ out int coverSize,
298
+ string extraParams
299
+ );
300
+
301
+ /**
302
+ * 设置日志等级
303
+ * - logLevel 日志等级:1 trace、2 debug、3 info、4 warn、5 error、> 5 不打日志。建议调试时设为1,正式版设为3。
304
+ * - logToConsole 是否输出到控制台:0 不输出、1 输出。
305
+ */
306
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
307
+ internal static extern void TapSdkCloudSaveSetLogLevel(int logLevel, int logToConsole);
308
+
309
+ /**
310
+ * 代码版本,如:1.2.5
311
+ *
312
+ * @return SDK版本号,全局静态变量,无需释放内存
313
+ */
314
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
315
+ internal static extern IntPtr TapSdkCloudSaveVersion();
316
+
317
+ /**
318
+ * git commit 版本,如:98f5d81a0fdcab9a755878b3e825c2cb510e5196
319
+ *
320
+ * @return git commit版本,全局静态变量,无需释放内存
321
+ */
322
+ [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
323
+ internal static extern IntPtr TapSdkCloudSaveGitCommit();
324
+
325
+ internal static string CreateArchive(
326
+ string metadata,
327
+ byte[] archiveData,
328
+ int archiveDataSize,
329
+ byte[] coverData,
330
+ int coverDataSize
331
+ )
332
+ {
333
+ IntPtr intPtr = TapSdkCloudSaveCreateArchive(
334
+ metadata,
335
+ archiveData,
336
+ archiveDataSize,
337
+ coverData,
338
+ coverDataSize,
339
+ null
340
+ );
341
+ try
342
+ {
343
+ string result = GetUTF8String(intPtr);
344
+ return result;
345
+ }
346
+ finally
347
+ {
348
+ TapSdkCloudSaveFreeMemory(intPtr);
349
+ }
350
+ }
351
+
352
+ internal static string UpdateArchive(
353
+ string archiveUUID,
354
+ string metadata,
355
+ byte[] archiveData,
356
+ int archiveDataSize,
357
+ byte[] coverData,
358
+ int coverDataSize
359
+ )
360
+ {
361
+ IntPtr intPtr = TapSdkCloudSaveUpdateArchive(
362
+ archiveUUID,
363
+ metadata,
364
+ archiveData,
365
+ archiveDataSize,
366
+ coverData,
367
+ coverDataSize,
368
+ null
369
+ );
370
+ try
371
+ {
372
+ string result = GetUTF8String(intPtr);
373
+ return result;
374
+ }
375
+ finally
376
+ {
377
+ TapSdkCloudSaveFreeMemory(intPtr);
378
+ }
379
+ }
380
+
381
+ internal static string DeleteArchive(string archiveUUID)
382
+ {
383
+ IntPtr intPtr = TapSdkCloudSaveDeleteArchive(archiveUUID, null);
384
+ try
385
+ {
386
+ string result = GetUTF8String(intPtr);
387
+ return result;
388
+ }
389
+ finally
390
+ {
391
+ TapSdkCloudSaveFreeMemory(intPtr);
392
+ }
393
+ }
394
+
395
+ internal static string GetArchiveList()
396
+ {
397
+ IntPtr intPtr = TapSdkCloudSaveGetArchiveList(null);
398
+ try
399
+ {
400
+ string result = GetUTF8String(intPtr);
401
+ return result;
402
+ }
403
+ finally
404
+ {
405
+ TapSdkCloudSaveFreeMemory(intPtr);
406
+ }
407
+ }
408
+
409
+ internal static byte[] GetArchiveData(
410
+ string archiveUUID,
411
+ string archiveFileID,
412
+ out int archiveDataSize
413
+ )
414
+ {
415
+ int dataSize = 0;
416
+ IntPtr intPtr = TapSdkCloudSaveGetArchiveData(
417
+ archiveUUID,
418
+ archiveFileID,
419
+ out dataSize,
420
+ null
421
+ );
422
+ try
423
+ {
424
+ byte[] result;
425
+ if (dataSize >= 0)
426
+ {
427
+ if (dataSize == 0)
428
+ {
429
+ result = new byte[0];
430
+ }
431
+ else
432
+ {
433
+ result = GetOriginByte(intPtr, dataSize);
434
+ }
435
+ }
436
+ else
437
+ {
438
+ result = GetUTF8Byte(intPtr);
439
+ }
440
+ archiveDataSize = dataSize;
441
+ return result;
442
+ }
443
+ finally
444
+ {
445
+ TapSdkCloudSaveFreeMemory(intPtr);
446
+ }
447
+ }
448
+
449
+ internal static byte[] GetArchiveCover(
450
+ string archiveUUID,
451
+ string archiveFileID,
452
+ out int coverSize
453
+ )
454
+ {
455
+ int dataSize;
456
+ byte[] result;
457
+ IntPtr intPtr = TapSdkCloudSaveGetArchiveCover(
458
+ archiveUUID,
459
+ archiveFileID,
460
+ out dataSize,
461
+ null
462
+ );
463
+ try
464
+ {
465
+ coverSize = dataSize;
466
+ if (dataSize >= 0)
467
+ {
468
+ if (dataSize == 0)
469
+ {
470
+ result = new byte[0];
471
+ }
472
+ else
473
+ {
474
+ result = GetOriginByte(intPtr, dataSize);
475
+ }
476
+ }
477
+ else
478
+ {
479
+ result = GetUTF8Byte(intPtr);
480
+ }
481
+ return result;
482
+ }
483
+ finally
484
+ {
485
+ TapSdkCloudSaveFreeMemory(intPtr);
486
+ }
487
+ }
488
+
489
+ private static string GetUTF8String(IntPtr ptr)
490
+ {
491
+ byte[] buffer = GetUTF8Byte(ptr);
492
+ // 3. 按 UTF-8 解码
493
+ return Encoding.UTF8.GetString(buffer);
494
+ }
495
+
496
+ private static byte[] GetUTF8Byte(IntPtr ptr)
497
+ {
498
+ // 1. 获取字符串长度(假设以 null 结尾)
499
+ int len = 0;
500
+ while (Marshal.ReadByte(ptr, len) != 0)
501
+ {
502
+ len++;
503
+ }
504
+
505
+ // 2. 复制字节到托管数组
506
+ byte[] buffer = new byte[len];
507
+ Marshal.Copy(ptr, buffer, 0, len);
508
+ return buffer;
509
+ }
510
+
511
+ private static byte[] GetOriginByte(IntPtr ptr, int length)
512
+ {
513
+ byte[] copyByte = new byte[length];
514
+ Marshal.Copy(ptr, copyByte, 0, length);
515
+ return copyByte;
516
+ }
517
+ }
518
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 5f97467f725bb4495b13a0d6b4bfe20b
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 17fe8d5c8c7c549e1a06550067777842
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -0,0 +1,9 @@
1
+ namespace TapSDK.CloudSave.Standalone
2
+ {
3
+ public class TapCloudSaveResultCode
4
+ {
5
+ public const int NEED_LOGIN = 300001;
6
+
7
+ public const int INIT_FAIL = 300002;
8
+ }
9
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 56ea9297fc1324a5fb9b88076f6a66d0
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant: