From b53bacaecbc99d1da36fb8e64103baa34c260667 Mon Sep 17 00:00:00 2001 From: ci-gitlab Date: Mon, 9 May 2022 18:07:56 +0800 Subject: [PATCH] feat:update upm --- CHANGELOG.md | 225 +++++++++++++++++++++ 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 -> 28672 bytes Plugins/TapTap.Bootstrap.dll.meta | 33 +++ Plugins/TapTap.Bootstrap.pdb | Bin 0 -> 14096 bytes Plugins/TapTap.Bootstrap.pdb.meta | 7 + README.md | 254 +++++++++++++++++++++++ README.md.meta | 3 + VERSIONNOTE.md | 6 + VERSIONNOTE.md.meta | 7 + package.json | 14 ++ package.json.meta | 7 + 18 files changed, 1079 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..2cdf2bb --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,225 @@ +# ChangeLog + +## 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..60ef1e7eaf24bcd302f02a6b6b1f2266e31a2a33 GIT binary patch literal 28672 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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..c488c9f --- /dev/null +++ b/VERSIONNOTE.md @@ -0,0 +1,6 @@ +### Dependencies + +- TapTap.Login v3.8.0 +- TapTap.Common v3.8.0 +- LeanCloud.Realtime v0.10.10 +- LeanCloud.Storage v0.10.10 \ No newline at end of file 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..3adef7a --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.taptap.tds.bootstrap", + "displayName": "TapTap Bootstrap", + "description": "TapTap Develop Service", + "version": "3.8.0", + "unity": "2018.3", + "license": "MIT", + "dependencies": { + "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.8.0", + "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.8.0", + "com.leancloud.realtime": "https://github.com/leancloud/csharp-sdk-upm.git#realtime-0.10.0", + "com.leancloud.storage": "https://github.com/leancloud/csharp-sdk-upm.git#storage-0.10.0" + } +} 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: