From e757e0a535782fee4ece3a69d976b1140b24a5e7 Mon Sep 17 00:00:00 2001 From: ci-gitlab Date: Mon, 17 Oct 2022 20:12:52 +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 -> 33792 bytes Plugins/TapTap.Bootstrap.dll.meta | 33 +++ Plugins/TapTap.Bootstrap.pdb | Bin 0 -> 15568 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..6b4b6a02f2eb1b59b414506cedeed4a7a1a25cfb GIT binary patch literal 33792 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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..7002978 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.taptap.tds.bootstrap", + "displayName": "TapTap Bootstrap", + "description": "TapTap Develop Service", + "version": "3.16.1", + "unity": "2018.3", + "license": "MIT", + "dependencies": { + "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.16.1", + "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.16.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: