# UOS UGC

## 接入说明

1. **Package Manager** 中安装 **Newtonsoft.Json**
2. 导入 unity.ugc.unitypackage

## 使用说明
- UOS官网
  - 开通 CDN 服务
- UOS配置
  - 在菜单栏 UOS -> UGC -> Settings, 设置 uos app id 和 uos app secret
- 用到的 namespace
  - using Unity.Ugc; 
  - using Unity.Ugc.Common; 
  - using Unity.Ugc.Model;

## 接口
- 初始化SDK - UgcSDK.Init()
  - 在初始化时调用，用于配置项目用到的uos app id 和 secret
- 登录UGC - UgcSDK.Login( provider, providerApp, playerId, playerToken )
  - 玩家登录账号后调用，用于获取 uos ugc 的认证token
```
await UgcSDK.Login(IdProvider.Hykb, "5091", "abc", ""); 
```
- 创建mod - UgcSDK.CreateMod( request )
```
  await UgcSDK.CreateMod( new CreateModRequest() {
      Name = "Demo",
      Author = "Unity",
      Description = "First"
  })
  
```
- 上传mod文件 - UploadMod( modId, file )
```
  // 上传mod需要modId，所以需要先调用CreateMod()方法
  // 返回值为上传失败的文件
  // data为 byte[] 类型
  await UgcSDK.UploadMod(modId, new LocalFile(filename, data))
```
- 上传封面/缩略图等资源 - UploadResource( modId, file )
```
  // 返回值为下载链接
  // data为 byte[] 类型
  await UgcSDK.UploadResource(modId, new LocalFile(filename, data))
```
- 更新mod属性 - UgcSDK.UpdateMod()
```
  // 更新mod的属性（全量更新）
  await UgcSDK.UpdateMod(modId, new UpdateModRequest()
      {
          Name = "Demo",
          Description = "First",
          Cover = url, // 封面链接，url为UploadResource的返回值，
          Gallery = new List<string>() { url1, url2 }, // 简介的缩略图频链接，url1, url2为UploadResource的返回值
          Properties = new Dictionary<string, string>() { { "Map", "Sea" }, { "Mode", "Online" } } // 自定义属性
      });
```
- 提交当前mod状态至审核 - SubmitVersion(modId, request)
```
 // 提交后进入等候审核阶段
  await UgcSDK.SubmitVersion(_modId, new SubmitVersionRequest()
      {
          Version = "1.0.0",
          VersionDesc = "First Version"
      });
```
- 删除mod - DeleteMod(modId)
```
  await UgcSDK.DeleteMod(modId);
```
- 列出所有已发布的mod - ListPublishedMods(page, perPage)
```
  // 返回mod仅包含可公开字段
  await UgcSDK.ListPublishedMods(1, 10) // 列出第1页的mod，每页显示10个
```
- 列出所有自己的mod - ListOwnedMods(page, perPage)
```
  // 返回mod包含所有字段
  await UgcSDK.ListOwnedMods(1, 10) // 列出第1页的mod，每页显示10个
```
- 按条件查询mod - SearchPublishedMods(request)
```
  // 返回mod仅包含可公开字段
  await UgcSDK.SearchPublishedMods(new SearchModRequest()
      {
          Name = "De", // 根据mod的name和description字段进行模糊搜索
          Page = 1, // 页码
          PerPage = 10, // 每页显示数量
          SortKey = SortKey.SubscriptionCount, // 返回结果的排序依据，默认是更新时间, 可填SortKey.SubscriptionCount / SortKey.LikeCount
          SortOrder = SortOrder.Desc, // 排序顺序，默认Desc，可填SortOrder.Desc / SortOrder.Asc
          Properties = new Dictionary<string, string>() { { "Map", "Island" } } // 根据属性匹配mod
      })
```
- 列出mod当前的资源 - ListEntries(modId)
```
  // 返回mod当前还未审核通过的资源列表
  await UgcSDK.ListEntries(modId)
```
- 列出mod已发布版本的资源 - ListVersionEntries(modId, versionId)
```
  // versionId请参考PublishedMod的VersionId字段
  await UgcSDK.ListVersionEntries(modId，versionId)
```
- 订阅mod - SubscribeMod(modId)
```
  await UgcSDK.SubscribeMod(modId，versionId)
```
- 取消订阅mod - UnsubscribeMod(modId)
```
  await UgcSDK.UnsubscribeMod(modId，versionId)
```
- 点赞mod - LikeMod(modId)
```
  await UgcSDK.LikeMod(modId，versionId)
```
- 取消点赞mod - UnlikeMod(modId)
```
  await UgcSDK.UnlikeMod(modId，versionId)
```
- 举报mod - ReportMod(modId, reason)
```
  await UgcSDK.ReportMod(modId，reason)
```
- 列出已订阅mod - ListSubscribedMods()
```
  // 返回mod仅包含可公开字段
  await UgcSDK.ListSubscribedMods（)
```
- 列出mod的flags(是否订阅、点赞、举报过) - GetModFlags(modId)
```
  // 用于判断是否订阅 / 点赞过指定mod
  await UgcSDK.GetModFlags(modId)
```
- 列出mod的flags统计数据(订阅数、点赞数) - GetModFlagsCount(modId)
```
  // 用于获取mod的订阅数 / 点赞数
  await UgcSDK.GetModFlagsCount(modId)
```
- 登出 - Logout()
```
  UgcSDK.Logout()
```
所有接口都可能会抛出 UgcException 类型的异常
```
  {
      Code: 1,
      ErrorMessage: ""
  }
```
## 服务端API
- Basic Auth & Uos App Id & Uos App Service Secret
- 列出所有Mods
```
GET https://a-dev.unity.cn/api/v1/mods/basic/
返回值可参考ModList.cs
接受query参数 inspect_status 用于筛选不同审核状态的 mod
(可填值有not_start, ongoing, success, failed)
```
- 审核mod
```
POST https://a-dev.unity.cn/api/v1/mods/basic/{modId}/inspect/
{
  "passed": true
}
{
  "passed": false,
  "info": "" // 审核未通过的原因
}
```
