From 504d5c98f66cccd5693d04a1d0f9cafa806a8954 Mon Sep 17 00:00:00 2001 From: ci-gitlab Date: Thu, 25 May 2023 16:51:54 +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 + Editor.meta | 8 + Editor/TapBootstrapProcessBuild.cs | 20 ++ Editor/TapBootstrapProcessBuild.cs.meta | 11 + Plugins.meta | 8 + Plugins/TapTap.Bootstrap.deps.json | 233 +++++++++++++++++++++ Plugins/TapTap.Bootstrap.deps.json.meta | 7 + Plugins/TapTap.Bootstrap.dll | Bin 0 -> 30208 bytes Plugins/TapTap.Bootstrap.dll.meta | 33 +++ Plugins/TapTap.Bootstrap.pdb | Bin 0 -> 14436 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 + 21 files changed, 1147 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 Editor.meta create mode 100644 Editor/TapBootstrapProcessBuild.cs create mode 100644 Editor/TapBootstrapProcessBuild.cs.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/Editor.meta b/Editor.meta new file mode 100644 index 0000000..53d66be --- /dev/null +++ b/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 92ca05cc6fb3247f79cddb7f5ef08c2a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/TapBootstrapProcessBuild.cs b/Editor/TapBootstrapProcessBuild.cs new file mode 100644 index 0000000..a73f2c7 --- /dev/null +++ b/Editor/TapBootstrapProcessBuild.cs @@ -0,0 +1,20 @@ +using System; +using UnityEditor.Build.Reporting; +using TapTap.Common.Editor; + +namespace TapTap.Bootstrap.Editor { + public class TapBootstrapProcessBuild : SDKLinkProcessBuild { + public override int callbackOrder => 0; + + public override string LinkPath => "TapTap/Bootstrap/link.xml"; + + public override LinkedAssembly[] LinkedAssemblies => new LinkedAssembly[] { + new LinkedAssembly { Fullname = "TapTap.Bootstrap" }, + }; + + public override Func IsTargetPlatform => (report) => { + return BuildTargetUtils.IsSupportMobile(report.summary.platform) || + BuildTargetUtils.IsSupportStandalone(report.summary.platform); + }; + } +} diff --git a/Editor/TapBootstrapProcessBuild.cs.meta b/Editor/TapBootstrapProcessBuild.cs.meta new file mode 100644 index 0000000..6bafa2e --- /dev/null +++ b/Editor/TapBootstrapProcessBuild.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 395365d4e25e54d7cb6a461aa19b50c0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + 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..f6bbcc20b5a9759295bd7a43c8f599247e961152 GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/Plugins/TapTap.Bootstrap.dll.meta b/Plugins/TapTap.Bootstrap.dll.meta new file mode 100644 index 0000000..6dcd382 --- /dev/null +++ b/Plugins/TapTap.Bootstrap.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 03acb073a9f88474581401ef1020c1c4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/TapTap.Bootstrap.pdb b/Plugins/TapTap.Bootstrap.pdb new file mode 100644 index 0000000000000000000000000000000000000000..f2aaafed634317fc04bfc8a68278bf16b154b3c5 GIT binary patch literal 14436 zcmaJ|2S8I-_rD1tgb}t(6_8nku$MT1gb}uYfMTm52@nYhCIO`t4JhteTlXiZb?-fE zwXL?*);e3YD%e)7pR11l_xV}J|J?W9g-4)`o_F5w-gE9f_nvddd+(A`n3=*s9E5*1 zK>3ms@A?Q)IF*3-XcFAi0{P}E%5mC5pcf$MI~k!4Awq7T>RV{gsWg>(od41mAs%qw z5rybA+*7*gBcu{YQ`77YNJS1N8xtK`C0$+6DYL@IQgS0WRWjP$GwmYJoQb-wyl;@E5>2TrLXba?l{) z8-O1M{tCFz3~GlT4?XM8L-tI1_<4rk@ZzK2fQESUkpw6Ur~qgr&{&{KAPrC* z&?KO#K(m1s0WAY+1-j&o%f>%GY6pDJ+X9*SSRgAP2Ou{fFQ5RRP@rg_L?0|KKu3H8 z=>LFT1DOpFAS)mTAU7Z{pa7syplF~(pcEh}P(Dxz&<8+DAT^L4=tH0;pqW4muq*%e zCqPR&^95)%$nOIB66i9}U7(jh<=91?KQ0#zB7sanKV;=Rst4 zjbk$wwg6poWYL+Q0GQ9hc&u2kun4dvU@lXhHDD|FN3a86YZiuS0LEhXd?5?td|MU{ z1#HK{j)3i180R~%FwS>mVchXfER6G=Ss2^b#{|2uFt*2)h1~$VnP7Jou7Z3I7RK|A zCkw{`?#seqfcvp9?!W#ljN69?yBX8J*gxJZEP#7F7}@!FU=WP+aR3vH^>M%wjPr3H z5sdS301}Mz1Cg*3x3DlD?xz3+K|Y_cFCFlE;30ysOt1+aXo5pbaHt6uncy%J9BzUm zOmL(Ljxxc~COF0f$C}_c6C7`X6HM?R6P##*2bKpVH|&A z7RLUPuy7vWR2IhiX)KKO(^(kjXRt7iUnvXY@-tZ&>u0g>dw{c9*b{IL3%dZ$WnsL| z=9%Dp7TyZ^!vPCeL6_FJ@tEe+jJeB;O2hDGOHv9tHCs$&Up* z8n7i(KgMGLTQL~7N5;YyfXhv=f`wfnU&+G%g=w2$JU4yLU>hj^W59>q-0yx0Q%6r#e9DG$%j zOH42%QELXQtRRisk2k^vaOI*iI00P;;xM^2REh_cg2lOLDO}CadbsjYJX~RKLZ##Q zG=tXTU9AeP*fY2sJO_|_EW<@#QCIpN@5as0B`O8?pcxhCT=bZ_e+O3{wZrGaJb`m} zQYoo$HHVRjZ8!>7T#tr8nk*v;8C6O6qNLxNmDK|(Js6wSw!&RqJ zY80qer>#(_l}M#g8H!~3>Y|2PCDJMNwOWl{iDb1ZRHs+!^2*2I#5%PB-x)v-$>eIJ zSL*dDt)@s@t<*sNcw|uMM}Rnz*XeXhje)wy`rV4xcOpF+U#HYHXb~Nj%AU$WY#&UG_j_YUbkBl=2PX)gz^1ttqv?}<2d9L=lm;E(*? z)v@C6_VLIZcYxkpU8j?2coVd`YQ8~Mt5;MDX%-n;2fg0FFOt<3O0w*LrD(MVy+KD| zfmCBq>NGMnPYP1bomm)RPl@DuVHo0A2p!!6MWUhU+1_7mbzWk9!>T-d3o0E_d$as{ zZs=O^h=k<)!85098ZflRt4LCqt&}O0x)iNUrzntVs^KxdP^qg|$(1I>85er*Jl!~Y zyLq%Iz&CpF4(CTZXHD39C~IoViYwLAj#|CF(%)Xnwixtny38@Qdp9M-Ex11|aDDXJ z?<4+is%WvY`l{pO(4r*Wxe+&4iLbubt-al~oBDgZ`g~v0a^0D~=isn1WBc|`wh2zx zhdmRN?DxEJxp11l+KFAaw5C>VQo?BOrcI4w6C(~>{L^ml>Fe(Y3ICk@g}uGSzvd1y z^PXb1jb7~DhuG~bS*oef z_FCq3@6z;l^<^D~1BU%(aP!Uxji%E#Ah*iWWV&meKit>1w zQWh5z8y_DLSsoD^Cy$F%#zsbVHiK1S6jCTFR2n5JDo7Tmh7_b`rzRJshG72}CFe?# z3nc9O$T8t;7%?V%OkTm5^n%pnqSS)!IT3%G6Zy9}QGc5g{kJ(Wf14BgH#yJUwDkRnxlXIsRv1JjDos?RC|?IYH-NI9Q9NRIZ4~SRkogR|C#}nO zrLTO~|Mr7vQ5`jUxmKrEl`~>buo&z^1tQt8f?t;(h7S>2*B$wENWRf!y zUEE%?lyfe{xaG-{fj=?N76s*f9RKYa7oNB9`DL85UCM( z9bsf$PO87dCRVj5w`}X@mHzppR}oV4Z%!0{v~AjgteH;_cg+2y7u~{I zrCcRbt3FgJOq7E!x%3~qD=2yWv7fw)=lK{rm1|(f16!6HtwO1Wh62=s=Q|^dIR5Is z%}?^x)3P_6boqMX?%RUi^}9DV%=c=+T@;_abz8!bV%EK~@k-R!2aWaIW!EfT^*w*s$jCmEdRNDrKkzY3 zxv=wKI*yd^`ozD#iFciv(bWHLfYNX1fzA>%daatoDG~m|Cgbv`ilaFPuIul-RgQG% z6xI>R!%Vxrojz`1`8Vq1?Hhs@?fv*@8zYH#tk?@(Lz@)6dFHJ9XU3-F7^^l&5G~FA_*uWPC*uk}=%s*somLLpZj+j$2OmuR!`VA?f&ULXI^MteWiN`bC6HGa zL2HQ%NTqMKwyf{aOqH$~=kU^P#j=lk(Jg}MqC}^HsGthKn{YfdO^k3pn|Nd4V0BvC zg}hw5BmX5cj)c|WMOv-e)b_q>H_v+cN}jc}booagzWkr2xB9W!h1A;3)cFn5#ZA&t>vnBTy2>ch{&6 zgs{NdP16cfj%oOxjg*N$n=P?AbH#Bgqb<#&W?Fc%#7ayH&oG{?{B^_lr;CqD=Rdj; z@`Rr-zIPowo|v5OqkrS>dDlE&jZWP)ac%yUA+jHPS0AOS#U+?jy;U-(dU$A}Wb2ol z9rqHO*L3O9br2H+?+cx*tB>WaozjQ*WM>fR6lhitv(7TD+Qrob$!|$g7nI%~v{ZYP zOcC8xBs$n~u%-v1{Pm!9%|BfVN?GH+lV|hMhSn~-SoQUYGopQhJJ+B+^D<|H)8Hu~ z2L~qfs$C*8$l(#1=@6pYw$T5Fz5C=jhtJGgdHT%hWnHRLnEho2rGo54=nndUX>EL@ zxj(PZwVY{ZFN{6=ULehWwT*m2=9-*m`X<#Fzpeuwg*GgFp(>kI($C$ZE zaAR2J($6A2?sTj;%xJ^@f4qt0e^&Qx++A=ved>TdGtSkg4`oZHPK3=p709G5r2N*; zGTzJbT9mVGSNiOZI!+W@3%~n-4VK!ZqEEz0im1gqQa2Qjn>@Dukd&=LZDeKTol$$9 z>4d%up1-(v>j&wU$?rRd?NN|TSgw-n^d2yR14{OoO({K{d2Ho!t6j#8OPIp3V1~g^ z%b0S3k-p1&w~D{LJ$VKvrDO4i{3|T!TzGsgP(lRMv35#C&s_4t@oZ{a-s-(KmmN%; zp32r!8t~f?9O1eeda9!1hUk`U=%{(u7Lv5MBxuZ-cb^opbo09=ULt+unfft*=kv_j z$1GMH$;)bIOPg-sFEXuK)Ed@z`3z;|!L#Ediu`T$EFI?c5%D6?aJ@I@1oyzw+#|g9 znZCK%7g!pFO4t^6?Z7WFb&NXyGJQ9{HgoNNRAbf-;4NosXyw)L)XsGEWkw;n;mmAj zj{@;Zs|Udqq0gtY6iSrk8PuzruKl=)vRB3qseOW3&g`?1i$;e1(bQeJkf~6thSz>1 zAV|Gm=t}>vc+r-+a?F8w|NU3xnch`t7hPd&{UQ0n`MqxrWPE1xaKYz$1~?L(x*EJ? zCoLl(w}sR3;^>AO>9Y+TCujV%(1MYMw~6pe=Od) z1$kY(llZ8!!Y(cPE{B@B$Ye~^H(JTW5pxRC7OZNjmw)89pocoWQ)4Q<%9xscI_H}# zadg@dZTs7~E7y=2h3qcy6Aw(oI_7PlUR12o*U8jklTreI;-5G8#HSzFy4U?!oU4q~ z-EEI@4OiKQ(9XQ%h#zI%l0^?BW~$d^)@7;R(&NX9) z@7s;1+s~5)npgq0Q_r;Q36t8W!o&XAVc+wg)~?BJo%vhZfZ)b{CKYy9O`~RA*vykr zdV?|htDN5tWLD3~T_`?vA^F3RWOLHH0h#*FEgR97d~lIt_rJ8vd5x#`%-(p4Jihd< z-(yhSWUM$mWBcu#8&5Olt72-WonQISrIgl?rIV!z%+-1-v)K@097Wb(<+m=GAz0t=Zx1g~xCG=g)QZ;ihGQ5gNIwR!02z8>6?k zO}Sb7NnpyX%UhdW5(oA0Bh@WR`Y0k(B~ktMMa$a{t~^LyK4#XB-%YT2+gT;`rGs8> zU_oWH$QZJ}tzRfK&(8T`MyX`dv^fEc7Jl{>ne;ZP=uO3Qr)9QNCCv-Zwrp6lm^`|6 zSLrd&5$)I8UJPE>rp{X09(AL#bQ|dzO1nT=S*MoidTuI-a^3Qu7FV}CNSj$uw%%#t z_w$LhRj|Qj#l`Q$ql!K2&A%zn{dD%JDXv4B$a-4TDV_&!ebm%;oaq*#=@@+NjdDrwWG1G<^_{mF9CKmRzAFfFwqo+ zE$p}Sml;`Yf7I+O-m1vzsR?iL$udl;%bH>SbmPFPoR*j0THYHr=_pZxZ+&`rrNnv) zCIPnp#+TWvM1DD~8ILl4&Uoy}XcWuTb;_c;+RhCWgz0&6loN{MccA@)Yuz z-ZOG<@2NT%7a~sHS9xn*%laYvn1bOQwn96BxQ2Qs4NHZ#H0=BBA=0eX;}uSKo!^~j zgu5nEN)VRsk48@!pXryW99Ha!6ECZuh2CtxNH*bE zn%)F;+m(YV?s5Ok*w^|hvuxn?HyNMt7Fh><^tgkqQlmCeBHPxYDL7j_wD{~quFZtGD8&;enedQ?A7Ghua4yH{9=dY zBHkMN9^$5LB8t;blw=i5-I`=H=l9=tr(6hM<=}t!_oj_$(^n#I4sx>@opw4ZEo*P; zv*8mq9lpoNW@{@|>1v~IPAV<)mgp(_dl z^Pnv;_Li8rI6C)dY+~ENdbY7-vZZ-0%pGeg!?UL&RV7sRZ%&&fr_Bj!#U(pCIb-JT zMln}+XFd;3>h-6PhZn_?{AlD)v0=d!>o<^MuHkfE48@!WQEbpKiVcxCM?ukEQlSuu zP?9woz)cpy$+9$SGcTI?QVsVDq}f24h0!dEW^pu2q}ec;Mv=S*oZ@4AC={S@oDxo_I2)e}%}@kRi6bemNJL^|VA9;4abLTZ!qDY)3;X`gHju{9cGvvz^2$2iEbK!!M;V_vG zzkx|{!zls$@isWTa9iA)f?&dd6VTQWE*$tfi!P_pACT;*0aeafSC9SMT8v%874)<0 zl(XTiTirR%@sY56YoQy8=fa`3EPR3K${tRLMI}2pgSl{kY$!w_B!p!_LNHEFcvT$1^Ni>dHuO?e9prPAanp9+A02Sp$(JHx>p27fyh_Zwbzs;E88QA>uX$LCe8y9OPspHAkL2eCjO^ zNqKPMEt!XN-0|oDUEx`naPh&!79b_mWyUKIhTzkXV3rl~pCSa!BIJNOJqr0*qk-J_ z!H5x530zzPJ|~CpQQ=IWs&#O|XY#7#_|zbrv9m%UN?b-Ua-++Lw1(31_}GsYxR)%^ zd-!6-g|mcCI1QR0K=wRvHJs_QM^4zq1MnUEaRVIKgAeFnd{@=@6z*`KaqiH92%vEu z_@FVEZ-&yNg#D;oqJfV|q6DCPATf9 z@Wy-e2kXEBGn7_`2W4?ryQx-$Lbe2GqL&vD464RGJsb}fST4J@IS6EufIjr>EH>J> z6b}&7asxqXDA1&#-f#s29Fd#xOBnoK)R-&7@fOU($0f^9Fuwu2)`rJJ#zV-~1CBW& zZ^k*;Dl`lTAJm+@11{g;n?B&7aG=TdfI5HpC~lW!dB!H}HSFkNEPT+j(4?F2P((36I5dpYR>SoGb>}?*8082@ z<0hdw4qWKATzoo|4nxYg5D*e$`RU1E4~~2oOrglTDHOWSf+sNNBncW^I1(P{!*bmR zMF_A^nKh4#`a1F4;4edP*9GArMHPt8y5bYL#+i^pk5NxQxPeSFG{|^V2!ph=%gdC` zV93XR31^%g>`z3!o5o-ZxB@N;!VwBb@;#~e=w?3lI1FlJoC{{7Kri>G0N~JSJ{ssK z 登陆成功之后,都会得到一个 `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..52d0018 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.taptap.tds.bootstrap", + "displayName": "TapTap Bootstrap", + "description": "TapTap Develop Service", + "version": "3.18.7", + "unity": "2018.3", + "license": "MIT", + "dependencies": { + "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.18.7", + "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.18.7", + "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: