From d1c74eea576fc5fcb9dd2e3d7905e7c2cd0a4cfd Mon Sep 17 00:00:00 2001 From: ci-gitlab Date: Mon, 6 Mar 2023 21:28:41 +0800 Subject: [PATCH] feat:update upm --- CHANGELOG.md | 260 ++++++++++++++++++++++++ CHANGELOG.md.meta | 3 + Documentation.meta | 8 + Documentation/README.md | 257 +++++++++++++++++++++++ Documentation/README.md.meta | 7 + Plugins.meta | 8 + Plugins/TapTap.Bootstrap.deps.json | 233 +++++++++++++++++++++ Plugins/TapTap.Bootstrap.deps.json.meta | 7 + Plugins/TapTap.Bootstrap.dll | Bin 0 -> 35328 bytes Plugins/TapTap.Bootstrap.dll.meta | 33 +++ Plugins/TapTap.Bootstrap.pdb | Bin 0 -> 16292 bytes Plugins/TapTap.Bootstrap.pdb.meta | 7 + README.md | 254 +++++++++++++++++++++++ README.md.meta | 3 + VERSIONNOTE.md | 0 VERSIONNOTE.md.meta | 7 + package.json | 14 ++ package.json.meta | 7 + 18 files changed, 1108 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 CHANGELOG.md.meta create mode 100644 Documentation.meta create mode 100644 Documentation/README.md create mode 100644 Documentation/README.md.meta create mode 100644 Plugins.meta create mode 100644 Plugins/TapTap.Bootstrap.deps.json create mode 100644 Plugins/TapTap.Bootstrap.deps.json.meta create mode 100644 Plugins/TapTap.Bootstrap.dll create mode 100644 Plugins/TapTap.Bootstrap.dll.meta create mode 100644 Plugins/TapTap.Bootstrap.pdb create mode 100644 Plugins/TapTap.Bootstrap.pdb.meta create mode 100644 README.md create mode 100644 README.md.meta create mode 100644 VERSIONNOTE.md create mode 100644 VERSIONNOTE.md.meta create mode 100644 package.json create mode 100644 package.json.meta diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9fea556 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,260 @@ +# ChangeLog +## 3.11.1 +- TapTap.Login v3.11.1 +- TapTap.Common v3.11.1 +- LeanCloud.Realtime v0.10.11 +- LeanCloud.Storage v0.10.11 + +## 3.11.0 + +### Dependencies + +- TapTap.Login v3.11.0 +- TapTap.Common v3.11.0 +- LeanCloud.Realtime v0.10.11 +- LeanCloud.Storage v0.10.11 + +## 3.10.0 + +### New Feature +- 支持排行榜 + +### Dependencies + +- TapTap.Login v3.10.0 +- TapTap.Common v3.10.0 +- LeanCloud.Realtime v0.10.11 +- LeanCloud.Storage v0.10.11 + +## 3.9.0 + +### Dependencies + +- TapTap.Login v3.9.0 +- TapTap.Common v3.9.0 +- LeanCloud.Realtime v0.10.11 +- LeanCloud.Storage v0.10.11 + +## 3.8.0 + +### Dependencies + +- TapTap.Login v3.8.0 +- TapTap.Common v3.8.0 +- LeanCloud.Realtime v0.10.10 +- LeanCloud.Storage v0.10.10 + +## 3.7.1 + +### Dependencies + +- TapTap.Login v3.7.1 +- TapTap.Common v3.7.1 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.7.0 + +### Dependencies + +- TapTap.Login v3.7.0 +- TapTap.Common v3.7.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + + +## 3.6.3 + +### Dependencies + +- TapTap.Login v3.6.3 +- TapTap.Common v3.6.3 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.6.1 + +### Dependencies + +- TapTap.Login v3.6.1 +- TapTap.Common v3.6.1 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.6.0 + +### Dependencies + +- TapTap.Login v3.6.0 +- TapTap.Common v3.6.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.5.0 + +### Dependencies + +- TapTap.Login v3.5.0 +- TapTap.Common v3.5.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.4.0 + +### Dependencies + +- TapTap.Login v3.4.0 +- TapTap.Common v3.4.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.3.0 + +### Dependencies + +- TapTap.Login v3.3.0 +- TapTap.Common v3.3.0 +- LeanCloud.Realtime v0.9.11 +- LeanCloud.Storage v0.9.11 + +## 3.2.0 + +### New Feature + +- 支持云存档 + +### Dependencies + +- TapTap.Login v3.2.0 +- TapTap.Common v3.2.0 +- LeanCloud.Storage v0.9.5 +- LeanCloud.Realtime v0.9.5 + +## 3.1.0 + +### New Feature + +- `TDSUser` 新增好友系统操作 + +### Dependencies + +- TapTap.Login v3.1.0 +- TapTap.Common v3.1.0 +- LeanCloud.Storage v0.9.2 +- LeanCloud.Realtime v0.9.2 + +## 3.0.0 + +TapSDK 3.0 开始,我们在单纯的 TapTap 登录之外,还提供了一个内建账户系统供游戏使用:开发者可以直接用 TapTap OAuth +授权的结果生成一个游戏内的账号(TDSUser),然后用该账号保存更多玩家数据。同时,我们也支持将更多第三方认证登录的结果绑定到这一账号上来(以及后续的解绑操作)。 + +### New Feature + +- 新增 `TDSUser` 用于内建账户系统操作 + +### BreakingChange + +- `TapBootstrap` 接口仅保留 `TapBootstrap.Init(tapConfig)` 接口 + +### Dependencies + +- LeanCloud.Storage v0.8.2 +- TapTap.Login v3.0.0 +- TapTap.Common v3.0.0 + +## 2.1.7 + +### Dependencies + +- TapTap.Common v2.1.7 + +## 2.1.6 + +### Dependencies + +- TapTap.Common v2.1.6 + +## 2.1.5 + +### Dependencies + +- TapTap.Common v2.1.5 + +## 2.1.4 + +### Optimization and fixed bugs + +- 优化多语言相关 + +### Dependencies + +- TapTap.Common v2.1.4 + +## 2.1.3 + +### Feature + +* 新增繁中、日文、韩文、泰文和印尼语多语言配置 + +## 2.1.2 + +### BreakingChange + +* 废弃 OpenUserCenter 接口 + +### Dependencies + +* TapTap.Common v2.1.2 + +## 2.1.1 + +### Feature + +* 新增篝火测试资格校验 + ``` + TapBootstrap.GetTestQualification((bool, error)=>{ }): + ``` +* 通过 TapConfig 进行初始化配置 + * 新增 TapDBConfig 用于 TapDB 初始化配置 + * 新增 ClientSecret 用于 TapSDK 初始化 + ```c# + //建议使用以下 TapConfig 构造方法进行初始化 + var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientSecret("client_secret") + .RegionType(RegionType.CN) + .TapDBConfig(true, "gameChannel", "gameVersion", true) + .ConfigBuilder(); + TapBootstrap.Init(config); + ``` + +### Breaking changes + +* LoginType 删除 Apple、Guest 登陆方式 +* TDS-Info.plist 删除 Apple_SignIn_Enable 配置 +* 废弃 Bind 接口 +* TapConfig 构造方法参数修改 + +### Dependencies + +* TapTap.Common v2.1.1 + +## 2.1.0 + +### Feature + +* 支持性改动用于 TapTap.Friends + +### Dependencies + +* TapTap.Common v2.1.0 + +## 2.0.0 + +### Feature + +* TapTap Bootstrap + +### Dependencies + +* TapTap.Common v2.0.0 \ No newline at end of file diff --git a/CHANGELOG.md.meta b/CHANGELOG.md.meta new file mode 100644 index 0000000..419383c --- /dev/null +++ b/CHANGELOG.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7388165be5344a9682382768c5fce466 +timeCreated: 1616755935 \ No newline at end of file diff --git a/Documentation.meta b/Documentation.meta new file mode 100644 index 0000000..1130a03 --- /dev/null +++ b/Documentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bd03b50332353477c899419b5b455fb0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/README.md b/Documentation/README.md new file mode 100644 index 0000000..2564c0c --- /dev/null +++ b/Documentation/README.md @@ -0,0 +1,257 @@ +# 使用 TapTap.Bootstrap + +## 使用前提 + +使用 TapTap.Bootstrap 前提是必须依赖以下库: +* [TapTap.Common](https://github.com/TapTap/TapCommon-Unity.git) +* [TapTap.Login](https://github.com/TapTap/TapLogin-Unity.git) +* [LeanCloud.Storage](https://github.com/leancloud/csharp-sdk) +* [LeanCloud.RealTime](https://github.com/leancloud/csharp-sdk) + +## 命名空间 + +```c# +using TapTap.Bootstrap; +``` + +## 接口描述 + +## 1.初始化 + +TapBootstrap 会根据 TapConfig 中的 TapDBConfig 配置来进行 TapDB 的自动初始化。 + +### 开启 TapDB +```c# +var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientToken("client_token") + .ServerURL("https://ikggdre2.lc-cn-n1-shared.com") + .RegionType(RegionType.CN) + .TapDBConfig(true,"channel","gameVersion",true) + .Builder(); +``` +### 关闭 TapDB +```c# +var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientToken("client_token") + .ServerURL("https://ikggdre2.lc-cn-n1-shared.com") + .RegionType(RegionType.CN) +//# .TapDBConfig(false,null,null,false) + .EnableTapDB(false) + .Builder(); +``` +### 初始化 +```c# +TapBootstrap.Init(config); +``` + +## 2.账户系统 + +> 登陆成功之后,都会得到一个 `TDSUser` 实例 + +### 使用 TapTap OAuth 授权结果直接登陆/注册账户系统 + +```c# +var tdsUser = await TDSUser.LoginWithTapTap(); +``` + +### 游客登陆 + +```c# +var tdsUser = await TDSUser.LoginAnonymously(); +``` + +### 使用第三方平台授权登录/注册账户 + +```c# +var tdsUser = await TDSUser.LoginWithAuthData(Dictionary authData, string platform, +LCUserAuthDataLoginOption option = null); +``` + +### 绑定第三方平台授权 + +```c# +await TDSUser.AssociateAuthData(Dictionary authData, string platform); +``` + +### 退出登陆 + +```c# +TDSUser.Logout(); +``` + +## 3.好友系统 + +### 申请成为好友 + +```c# +TDSUser tom, jerry; +await tom.ApplyFriendship(jerry); +``` +申请成功的回调中,我们会得到一个 LCFriendshipRequest 的实例,这个实例中包含了两个用户: +- sourceUser,指请求的发起方,上面的例子中就是 `tom`。 +- friend,指请求的目的方,上面的例子中就是 `jerry`。 + +tom 也可以在申请好友的时候,添加更多的属性,例如 tom 希望加 jerry 为好友的时候,也设定一个名为 cat 的圈子,可以这样操作: + +```cs +Dictionary attrs = new Dictionary { + { "group", "cat" } +}; +await tom.ApplyFriendship(jerry, attrs); +``` + +### 获取好友申请列表 +好友申请有三种状态: + +- `pending`,对方没有回应,还处于等待中。 +- `accepted`,对方已经接受,现在双方成为好友。 +- `declined`,对方已经拒绝。 + +好友请求创建之后默认是 `pending` 状态。 + +jerry 这里可以通过 `friendshipRequestQuery` 来查找不同状态的请求。例如 jerry 想看看新的好友请求,可以这样操作: + +```cs +LCQuery query = jerry.GetFriendshipRequestQuery(LCFriendshipRequest.STATUS_PENDING, false, true); +ReadOnlyCollection reqs = await query.Find(); +foreach (LCFriendshipRequest req in reqs) { + Console.WriteLine(req); +} +``` + +### 处理好友申请 + +jerry 对于新的好友请求,可以同意或者拒绝,也可以什么都不做,无视这些请求,甚至直接删除。这些操作我们都是支持的,请看下面的示例: + +```cs +LCFriendshipRequest tomRequest, tuffyRequest, otherRequest; +await jerry.AcceptFriendshipRequest(tomRequest); +await jerry.DeclineFriendshipRequest(tuffyRequest); +await jerry.DeleteFriendshipRequest(otherRequest); +``` + +注意: +* 在 jerry 拒绝了 tom 的好友请求之后,如果 tom 再次请求成为 jerry 的好友,tom 在执行 applyFriendshipInBackground 时会直接得到错误的应答,表明 jerry 不想和 ta 成为好友。 +* jerry 同意了 tuffy 的好友请求之后,它们就成为了好友,之后两个人中任何一人再次调用 applyFriendshipInBackground 申请横位好友时,也会直接得到错误的应答,表明它们已经是好友无需再次申请。 +* jerry 删除陌生人的好友请求后,对方还可以再次发起请求。 + +### 响应好友变化通知 + +TDS 好友模块支持客户端监听好友状态变化,在游戏中实时给玩家提示。好友状态变化的接口包括 + +```cs +public class FriendshipNotification { + public Action OnNewRequestComing { get; set; } + public Action OnRequestAccepted { get; set; } + public Action OnRequestDeclined { get; set; } +} +``` + +其中: +- onNewRequestComing 表示有其他人申请成为当前用户的好友,通过调用 `LCFriendshipRequest#getSourceUser()` 方法可以获得发起方用户信息。 +- onRequestAccepted 表示当前用户的好友申请被对方通过,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 +- onRequestDeclined 表示当前用户的好友申请被对方拒绝,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 + +开发者可以通过 `TDSUser#registerFriendshipNotification` 来注册通知接收器,通过调用 `TDSUser#unregisterFriendshipNotification` 来取消通知接收器。 + +### 获取好友列表 + +调用 `TDSUser#friendshipQuery()` 可以得到查询好友的 `LCQuery` 实例,之后调用 `LCQuery#findInBackground()` 方法就可以得到好友列表。示例如下: + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +``` + +LCFriendship 里面会包含两个用户: + +- `LCFriendship#getLCUser(LCFriendship.ATTR_USER)` 得到的是 jerry 自己; +- `LCFriendship#getLCUser(LCFriendship.ATTR_FOLLOWEE)` 得到的就是另一方的用户信息。 + +### 删除好友 + +成为好友关系的两个用户,之后也可以单方面删除好友。例如 jerry 不想再和 tom 成为好友,那只需要在自己的好友列表中删除包含 tom 的那条 LCFriendship 记录即可: + +```cs +await friendship.Delete(); +``` + +### 查询好友关系 + +我们使用 LCQuery 可以单独查询两个用户是否为好友关系。 + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +query.whereEqualTo("followee", tom); +int count = await query.Count(); +if (count > 0) { + // tom is a friend of jerry. +} else { + // tom isn't a friend of jerry. +} +``` + +这一查询是通过网络发送到服务端执行的,一般情况下,我们推荐开发者在游戏启动时拉取一次当前登录用户的好友列表,然后缓存在本地,以后需要检查另外玩家是否为当前用户的好友时,直接从缓存中查询即可。如果担心好友数据变化,缓存没有得到及时更新,可以调用前面「响应好友变化通知」的方法,对好友数据更新进行监听,这样在绝大部分时候数据同步都是可以保证的。 + +## 4.云存档 + +### 构建云存档元数据 + +```c# +var gameSave = new TapGameSave +{ + Name = "GameSave_Name",// 存档名称 + Summary = "GameSave_Description", // 该字段会作为展示给用户的实际存档名 + ModifiedAt = DateTime.Now.ToLocalTime(), // 原文件修改时间 + PlayedTime = 1000L, // 游戏时长,单位 ms (非必填) + ProgressValue = 100, // 游戏进度 ,单位 int (非必填) + CoverFilePath = pic, // 游戏封面,可以传入一个本地文件路径,SDK 限制为 png/jpeg 格式 + GameFilePath = dll // 存档源文件,可以传入一个本地文件路径 +}; + +``` +### 保存存档 + +保存存档时,会去检查当前`TDSUser`是否已经登录以及元数据。 + +同时 SDK 在上传时会去限制存档本身以及相关联的两个文件( Cover 以及 GameFile )的权限为当前用户本身。 +```c# +await gameSave.Save(); +``` + +### 查询当前用户的所有存档 + +```c# +var collection = await TapGameSave.GetCurrentUserGameSaves(); + +foreach(var gameSave in collection){ + // 存档概览 + var name = gameSave.Summary; + // 原文件修改时间 + var modifiedAt = gameSave.ModifiedAt; + // 游戏时长 + var playedTime = gameSave.PlayedTime; + // 游戏进度 + var progressValue = gameSave.ProgressValue; + // 游戏封面 + var coverFile = gameSave.CoverFile; + // 存档源文件 + var gameFile = gameSave.GameFile; + // 源文件下载地址 + var gameFileUrl = gameFile.Url; +} +``` + +### 查询当前用户存档 + +我们使用 `LCQuery` 来查询当前用户的云存档。 + +SDK 查询封装了一个限定方法用于查询当前`TDSUser`的云存档。 +```c# +TDSUser user = await TDSUser.GetCurrent(); +LCQuery gameSaveQuery = TapGameSave.GetQueryWithUser(user); +// 查询 Name 为 TDSUser_GameSave_Name 的云存档 +gameSaveQuery.WhereEqualTo("name","TDSUser_GameSave_Name"); +var collection = await gameSaveQuery.Find(); +``` \ No newline at end of file diff --git a/Documentation/README.md.meta b/Documentation/README.md.meta new file mode 100644 index 0000000..125a6de --- /dev/null +++ b/Documentation/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 17ed6166c017a4fcda77ff618f2703db +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins.meta b/Plugins.meta new file mode 100644 index 0000000..bbcf194 --- /dev/null +++ b/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc389bcfbbddc4d35a997cbc06799975 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/TapTap.Bootstrap.deps.json b/Plugins/TapTap.Bootstrap.deps.json new file mode 100644 index 0000000..1229ab6 --- /dev/null +++ b/Plugins/TapTap.Bootstrap.deps.json @@ -0,0 +1,233 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "TapTap.Bootstrap/1.0.0": { + "dependencies": { + "NETStandard.Library": "2.0.3", + "TapTap.Common": "1.0.0", + "TapTap.Login": "1.0.0", + "Common": "1.0.0.0", + "LiveQuery": "1.0.0.0", + "Storage": "1.0.0.0", + "Storage.Unity": "1.0.0.0", + "UnityEngine": "0.0.0.0" + }, + "runtime": { + "TapTap.Bootstrap.dll": {} + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "TapTap.Common/1.0.0": { + "runtime": { + "TapTap.Common.dll": {} + } + }, + "TapTap.Login/1.0.0": { + "dependencies": { + "TapTap.Common": "1.0.0" + }, + "runtime": { + "TapTap.Login.dll": {} + } + }, + "Common/1.0.0.0": { + "runtime": { + "Common.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "LiveQuery/1.0.0.0": { + "runtime": { + "LiveQuery.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Storage/1.0.0.0": { + "runtime": { + "Storage.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Storage.Unity/1.0.0.0": { + "runtime": { + "Storage.Unity.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "UnityEngine/0.0.0.0": { + "runtime": { + "UnityEngine.dll": { + "assemblyVersion": "0.0.0.0", + "fileVersion": "0.0.0.0" + } + } + }, + "LC.Newtonsoft.Json/11.0.0.0": { + "runtime": { + "LC.Newtonsoft.Json.dll": { + "assemblyVersion": "11.0.0.0", + "fileVersion": "11.0.1.0" + } + } + }, + "Realtime/1.0.0.0": { + "runtime": { + "Realtime.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "LC.Google.Protobuf/3.14.0.0": { + "runtime": { + "LC.Google.Protobuf.dll": { + "assemblyVersion": "3.14.0.0", + "fileVersion": "3.14.0.0" + } + } + }, + "System.Memory/4.0.1.1": { + "runtime": { + "System.Memory.dll": { + "assemblyVersion": "4.0.1.1", + "fileVersion": "4.6.27617.2" + } + } + }, + "System.Runtime.CompilerServices.Unsafe/4.0.4.1": { + "runtime": { + "System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "4.0.4.1", + "fileVersion": "4.0.0.0" + } + } + }, + "System.Buffers/4.0.2.0": { + "runtime": { + "System.Buffers.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.25519.3" + } + } + }, + "System.Numerics.Vectors/4.1.3.0": { + "runtime": { + "System.Numerics.Vectors.dll": { + "assemblyVersion": "4.1.3.0", + "fileVersion": "4.6.25519.3" + } + } + } + } + }, + "libraries": { + "TapTap.Bootstrap/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "TapTap.Common/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "TapTap.Login/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Common/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "LiveQuery/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Storage/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Storage.Unity/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "UnityEngine/0.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "LC.Newtonsoft.Json/11.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Realtime/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "LC.Google.Protobuf/3.14.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Memory/4.0.1.1": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Runtime.CompilerServices.Unsafe/4.0.4.1": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Buffers/4.0.2.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Numerics.Vectors/4.1.3.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/Plugins/TapTap.Bootstrap.deps.json.meta b/Plugins/TapTap.Bootstrap.deps.json.meta new file mode 100644 index 0000000..92c4277 --- /dev/null +++ b/Plugins/TapTap.Bootstrap.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 31cab863b627d4a509bd0f259bcf6a31 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/TapTap.Bootstrap.dll b/Plugins/TapTap.Bootstrap.dll new file mode 100644 index 0000000000000000000000000000000000000000..07946143352a2453328d8d30181cc9d9a0b6aa4b GIT binary patch literal 35328 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 登陆成功之后,都会得到一个 `TDSUser` 实例 + +### 使用 TapTap OAuth 授权结果直接登陆/注册账户系统 + +```c# +var tdsUser = await TDSUser.LoginWithTapTap(); +``` + +### 游客登陆 + +```c# +var tdsUser = await TDSUser.LoginAnonymously(); +``` + +### 使用第三方平台授权登录/注册账户 + +```c# +var tdsUser = await TDSUser.LoginWithAuthData(Dictionary authData, string platform, +LCUserAuthDataLoginOption option = null); +``` + +### 绑定第三方平台授权 + +```c# +await TDSUser.AssociateAuthData(Dictionary authData, string platform); +``` + +### 退出登陆 + +```c# +TDSUser.Logout(); +``` + +## 3.好友系统 + +### 申请成为好友 + +```c# +TDSUser tom, jerry; +await tom.ApplyFriendship(jerry); +``` +申请成功的回调中,我们会得到一个 LCFriendshipRequest 的实例,这个实例中包含了两个用户: +- sourceUser,指请求的发起方,上面的例子中就是 `tom`。 +- friend,指请求的目的方,上面的例子中就是 `jerry`。 + +tom 也可以在申请好友的时候,添加更多的属性,例如 tom 希望加 jerry 为好友的时候,也设定一个名为 cat 的圈子,可以这样操作: + +```cs +Dictionary attrs = new Dictionary { + { "group", "cat" } +}; +await tom.ApplyFriendship(jerry, attrs); +``` + +### 获取好友申请列表 +好友申请有三种状态: + +- `pending`,对方没有回应,还处于等待中。 +- `accepted`,对方已经接受,现在双方成为好友。 +- `declined`,对方已经拒绝。 + +好友请求创建之后默认是 `pending` 状态。 + +jerry 这里可以通过 `friendshipRequestQuery` 来查找不同状态的请求。例如 jerry 想看看新的好友请求,可以这样操作: + +```cs +LCQuery query = jerry.GetFriendshipRequestQuery(LCFriendshipRequest.STATUS_PENDING, false, true); +ReadOnlyCollection reqs = await query.Find(); +foreach (LCFriendshipRequest req in reqs) { + Console.WriteLine(req); +} +``` + +### 处理好友申请 + +jerry 对于新的好友请求,可以同意或者拒绝,也可以什么都不做,无视这些请求,甚至直接删除。这些操作我们都是支持的,请看下面的示例: + +```cs +LCFriendshipRequest tomRequest, tuffyRequest, otherRequest; +await jerry.AcceptFriendshipRequest(tomRequest); +await jerry.DeclineFriendshipRequest(tuffyRequest); +await jerry.DeleteFriendshipRequest(otherRequest); +``` + +注意: +* 在 jerry 拒绝了 tom 的好友请求之后,如果 tom 再次请求成为 jerry 的好友,tom 在执行 applyFriendshipInBackground 时会直接得到错误的应答,表明 jerry 不想和 ta 成为好友。 +* jerry 同意了 tuffy 的好友请求之后,它们就成为了好友,之后两个人中任何一人再次调用 applyFriendshipInBackground 申请横位好友时,也会直接得到错误的应答,表明它们已经是好友无需再次申请。 +* jerry 删除陌生人的好友请求后,对方还可以再次发起请求。 + +### 响应好友变化通知 + +TDS 好友模块支持客户端监听好友状态变化,在游戏中实时给玩家提示。好友状态变化的接口包括 + +```cs +public class FriendshipNotification { + public Action OnNewRequestComing { get; set; } + public Action OnRequestAccepted { get; set; } + public Action OnRequestDeclined { get; set; } +} +``` + +其中: +- onNewRequestComing 表示有其他人申请成为当前用户的好友,通过调用 `LCFriendshipRequest#getSourceUser()` 方法可以获得发起方用户信息。 +- onRequestAccepted 表示当前用户的好友申请被对方通过,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 +- onRequestDeclined 表示当前用户的好友申请被对方拒绝,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 + +开发者可以通过 `TDSUser#registerFriendshipNotification` 来注册通知接收器,通过调用 `TDSUser#unregisterFriendshipNotification` 来取消通知接收器。 + +### 获取好友列表 + +调用 `TDSUser#friendshipQuery()` 可以得到查询好友的 `LCQuery` 实例,之后调用 `LCQuery#findInBackground()` 方法就可以得到好友列表。示例如下: + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +``` + +LCFriendship 里面会包含两个用户: + +- `LCFriendship#getLCUser(LCFriendship.ATTR_USER)` 得到的是 jerry 自己; +- `LCFriendship#getLCUser(LCFriendship.ATTR_FOLLOWEE)` 得到的就是另一方的用户信息。 + +### 删除好友 + +成为好友关系的两个用户,之后也可以单方面删除好友。例如 jerry 不想再和 tom 成为好友,那只需要在自己的好友列表中删除包含 tom 的那条 LCFriendship 记录即可: + +```cs +await friendship.Delete(); +``` + +### 查询好友关系 + +我们使用 LCQuery 可以单独查询两个用户是否为好友关系。 + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +query.whereEqualTo("followee", tom); +int count = await query.Count(); +if (count > 0) { + // tom is a friend of jerry. +} else { + // tom isn't a friend of jerry. +} +``` + +这一查询是通过网络发送到服务端执行的,一般情况下,我们推荐开发者在游戏启动时拉取一次当前登录用户的好友列表,然后缓存在本地,以后需要检查另外玩家是否为当前用户的好友时,直接从缓存中查询即可。如果担心好友数据变化,缓存没有得到及时更新,可以调用前面「响应好友变化通知」的方法,对好友数据更新进行监听,这样在绝大部分时候数据同步都是可以保证的。 + +## 4.云存档 + +### 构建云存档元数据 + +```c# +var gameSave = new TapGameSave +{ + Name = "GameSave_Name",// 存档名称 + Summary = "GameSave_Description", // 该字段会作为展示给用户的实际存档名 + ModifiedAt = DateTime.Now.ToLocalTime(), // 原文件修改时间 + PlayedTime = 1000L, // 游戏时长,单位 ms (非必填) + ProgressValue = 100, // 游戏进度 ,单位 int (非必填) + CoverFilePath = pic, // 游戏封面,可以传入一个本地文件路径,SDK 限制为 png/jpeg 格式 + GameFilePath = dll // 存档源文件,可以传入一个本地文件路径 +}; + +``` +### 保存存档 + +保存存档时,会去检查当前`TDSUser`是否已经登录以及元数据。 + +同时 SDK 在上传时会去限制存档本身以及相关联的两个文件( Cover 以及 GameFile )的权限为当前用户本身。 +```c# +await gameSave.Save(); +``` + +### 查询当前用户的所有存档 + +```c# +var collection = await TapGameSave.GetCurrentUserGameSaves(); + +foreach(var gameSave in collection){ + // 存档概览 + var name = gameSave.Summary; + // 原文件修改时间 + var modifiedAt = gameSave.ModifiedAt; + // 游戏时长 + var playedTime = gameSave.PlayedTime; + // 游戏进度 + var progressValue = gameSave.ProgressValue; + // 游戏封面 + var coverFile = gameSave.CoverFile; + // 存档源文件 + var gameFile = gameSave.GameFile; + // 源文件下载地址 + var gameFileUrl = gameFile.Url; +} +``` + +### 查询云存档 +云存档只能查询当前用户的所有存档,需要查询该用户的特定存档时,可以增加相应过滤,可参考 [查询条件](https://developer.taptap.com/docs/sdk/storage/guide/objc/#%E6%9F%A5%E8%AF%A2%E6%9D%A1%E4%BB%B6) +```c# +TDSUser user = await TDSUser.GetCurrent(); +LCQuery gameSaveQuery = TapGameSave.GetQueryWithUser(user); +// 查询 Name 为 TDSUser_GameSave_Name 的云存档 +gameSaveQuery.WhereEqualTo("name","TDSUser_GameSave_Name"); +var collection = await gameSaveQuery.Find(); +``` diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..74191cc --- /dev/null +++ b/README.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c5330aab2c6a41699a1601f1af6b27d9 +timeCreated: 1616755935 \ No newline at end of file diff --git a/VERSIONNOTE.md b/VERSIONNOTE.md new file mode 100644 index 0000000..e69de29 diff --git a/VERSIONNOTE.md.meta b/VERSIONNOTE.md.meta new file mode 100644 index 0000000..4bb7039 --- /dev/null +++ b/VERSIONNOTE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d5391b17003874fb2afc3e309a3f63ef +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json new file mode 100644 index 0000000..43cc165 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.taptap.tds.bootstrap", + "displayName": "TapTap Bootstrap", + "description": "TapTap Develop Service", + "version": "3.18.1", + "unity": "2018.3", + "license": "MIT", + "dependencies": { + "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.18.1", + "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.18.1", + "com.leancloud.realtime": "https://github.com/leancloud/csharp-sdk-upm.git#realtime-0.10.14", + "com.leancloud.storage": "https://github.com/leancloud/csharp-sdk-upm.git#storage-0.10.14" + } +} diff --git a/package.json.meta b/package.json.meta new file mode 100644 index 0000000..a42bf59 --- /dev/null +++ b/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e618b9375caf846708cffea428908521 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: