From 7540b719eb63821ae11807a493454bf0cf4289c0 Mon Sep 17 00:00:00 2001 From: ci-gitlab Date: Fri, 27 Oct 2023 21:00:04 +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..b3084f247962e88ab2e4b88c4ba6f80d0f4db214 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..c615d86 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.taptap.tds.bootstrap", + "displayName": "TapTap Bootstrap", + "description": "TapTap Develop Service", + "version": "3.16.0", + "unity": "2018.3", + "license": "MIT", + "dependencies": { + "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.16.0", + "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.16.0", + "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: