主题
GameCore.UserCloudData
BatchTransactionBuilder 仅服务端
命名空间 GameCore.UserCloudData
csharp
public sealed class BatchTransactionBuilder批量用户事务构建器
方法
ForUser 仅服务端
csharp
public BatchTransactionBuilder ForUser(long userId, Action<TransactionBuilder> builderAction)为指定用户添加操作
userId— 用户IDbuilderAction— 构建器操作
返回: 当前批量构建器实例
ForAllUsers 仅服务端
csharp
public BatchTransactionBuilder ForAllUsers(Action<TransactionBuilder> builderAction)为所有用户执行相同的操作
builderAction— 构建器操作
返回: 当前批量构建器实例
ExecuteAllAsync 仅服务端
csharp
public Task<Dictionary<long, UserCloudDataResult>> ExecuteAllAsync(string description = "Batch transaction")执行所有用户的事务
description— 事务描述
返回: 每个用户的执行结果
ExecuteSingleCommitAsync 仅服务端
csharp
public Task<UserCloudDataResult> ExecuteSingleCommitAsync(string description = "Batch transaction")将所有用户已添加的操作合并为一次事务提交。
description— 事务描述
返回: 整体事务执行结果。任一操作失败时,后端会回滚整个提交。
备注
与 String) 不同,该方法只发送一次 commit,适用于需要跨用户原子性的场景。
CloudData 仅服务端
命名空间 GameCore.UserCloudData
csharp
public static class CloudData云数据API的简化别名,用于更简洁的调用
备注
该类提供了 CloudDataApi 的简化别名,用户可以选择使用 CloudData 而不是 CloudDataApi。
属性
IsReady 仅服务端
csharp
public static bool IsReady { get; }方法
WaitUntilReadyAsync 仅服务端
csharp
public static Task WaitUntilReadyAsync()QueryUserDataAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IUserDataBatchQueryResult>>> QueryUserDataAsync(long[] userIds, IEnumerable<VarChar180> keys)QueryPlayersDataAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IUserDataBatchQueryResult>>> QueryPlayersDataAsync(Player[] players, IEnumerable<VarChar180> keys)QueryCurrencyAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserData<IUserCurrencyRecord>>> QueryCurrencyAsync(long[] userIds, IEnumerable<VarChar180> keys)QueryPlayersCurrencyAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserData<IUserCurrencyRecord>>> QueryPlayersCurrencyAsync(Player[] players, IEnumerable<VarChar180> keys)QueryCappedDataAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserData<IUserCappedDataRecord>>> QueryCappedDataAsync(long[] userIds, IEnumerable<VarChar180> keys)QueryPlayersCappedDataAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserData<IUserCappedDataRecord>>> QueryPlayersCappedDataAsync(Player[] players, IEnumerable<VarChar180> keys)QueryUserNameBatchAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserNames>> QueryUserNameBatchAsync(long[] userIds)QueryPlayersUserNameBatchAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserNames>> QueryPlayersUserNameBatchAsync(Player[] players)QueryUserListItemsAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IListItemRecord>>> QueryUserListItemsAsync(long userId, VarChar180 key, int? maxCount = null)QueryPlayerListItemsAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IListItemRecord>>> QueryPlayerListItemsAsync(Player player, VarChar180 key, int? maxCount = null)ScanUserListItemsAsync 仅服务端
csharp
public static Task<UserCloudDataResult<ListItemScanBatch>> ScanUserListItemsAsync(long userId, VarChar180 key, int batchSize, long? beforeItemUuid = null)ScanPlayerListItemsAsync 仅服务端
csharp
public static Task<UserCloudDataResult<ListItemScanBatch>> ScanPlayerListItemsAsync(Player player, VarChar180 key, int batchSize, long? beforeItemUuid = null)FindListItemByIdAsync 仅服务端
csharp
public static Task<UserCloudDataResult<RecordFoundStatus<IListItemRecord>>> FindListItemByIdAsync(long listItemUuid)CheckNameClaimedStatusAsync 仅服务端
csharp
public static Task<UserCloudDataResult<NameClaimStatus>> CheckNameClaimedStatusAsync(VarChar180 key, VarChar180 name)SearchClaimedNamesAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<INameRecord>>> SearchClaimedNamesAsync(VarChar180 key, VarChar180 partialName)ForUser 仅服务端
csharp
public static TransactionBuilder ForUser(long userId)ForPlayer 仅服务端
csharp
public static TransactionBuilder ForPlayer(Player player)ForUser 仅服务端
csharp
public static TransactionBuilder ForUser(User user)ForUsers 仅服务端
csharp
public static BatchTransactionBuilder ForUsers(params long[] userIds)ForPlayers 仅服务端
csharp
public static BatchTransactionBuilder ForPlayers(params Player[] players)ExecuteTransactionAsync 仅服务端
csharp
public static Task<UserCloudDataResult> ExecuteTransactionAsync(IEnumerable<TransactionOperation> operations, VarChar255 description)CloudDataApi 仅服务端
命名空间 GameCore.UserCloudData
csharp
public static class CloudDataApi云数据统一访问入口,提供查询和事务操作的一致API
备注
该类作为云数据系统的主要入口点,解决了查询和修改操作分离的不一致问题。 所有云数据操作都可以从此类开始,提供统一的用户体验。 底层委托给 CloudDataOperations 和 TransactionBuilder 实现。 Key 命名约定:云数据 key 会按调用方传入的大小写原样传递给底层服务,但 ScoreArchive 表结构未强制二进制排序规则,实际落库比较可能随 MySQL collation 变成大小写不敏感。不要依赖大小写区分不同 key,建议统一使用小写 ASCII、下划线分隔的 key。 查询结果中的 key 会保留数据库返回的原始大小写;UserData1` 等本地辅助方法和批量查询返回字典使用大小写不敏感比较,便于兼容数据库侧的 key 命中语义。 重要概念区分: Player.Id: 当局游戏的槽位编号(0,1,2...),仅在当前游戏会话有意义 User.UserId: 平台用户的全局唯一标识,云数据应使用此ID确保持久性
属性
IsReady 仅服务端
csharp
public static bool IsReady { get; }获取云数据服务是否已经初始化完成。
备注
在该值为 false 时调用查询或事务接口会返回 ServiceNotInitialized。 游戏逻辑可以在启动阶段先检查此属性,或使用 WaitUntilReadyAsync 等待服务可用。
方法
WaitUntilReadyAsync 仅服务端
csharp
public static Task WaitUntilReadyAsync()等待云数据服务初始化完成。
返回: 服务已经初始化时立即完成;否则在云数据服务被标记为初始化完成后完成。
备注
该方法只表示服务入口可用,不代表玩家 UserId 已经可用。 需要读写玩家云数据时,仍应确保目标玩家已经连入并拥有有效的 UserId。
QueryUserDataAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IUserDataBatchQueryResult>>> QueryUserDataAsync(long[] userIds, IEnumerable<VarChar180> keys)异步批量查询指定用户的通用数据
userIds— 要查询的用户ID数组,不能为null或空keys— 要检索的数据键集合,每个键不超过180个UTF-8字符,不能为null或空
返回: 包含查询结果的任务。成功时返回 IUserDataBatchQueryResult 集合, 失败时返回相应的错误代码。
备注
委托给 VarChar180}) 实现。
QueryPlayersDataAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IUserDataBatchQueryResult>>> QueryPlayersDataAsync(Player[] players, IEnumerable<VarChar180> keys)异步批量查询指定玩家的通用数据(便利方法)
players— 要查询的玩家数组,自动提取UserId进行查询keys— 要检索的数据键集合,每个键不超过180个UTF-8字符,不能为null或空
返回: 包含查询结果的任务。成功时返回 IUserDataBatchQueryResult 集合, 失败时返回相应的错误代码。
备注
这是便利方法,会自动从Player对象提取对应的UserId进行查询。 只有连接的真人玩家会被包含在查询中,AI玩家会被过滤掉。
QueryCurrencyAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserData<IUserCurrencyRecord>>> QueryCurrencyAsync(long[] userIds, IEnumerable<VarChar180> keys)异步批量查询指定用户的货币数据
userIds— 要查询的用户ID数组,不能为null或空keys— 要检索的货币键集合,每个键不超过180个UTF-8字符,不能为null或空
返回: 包含查询结果的任务。成功时返回 UserData1`, 失败时返回相应的错误代码。
备注
委托给 VarChar180}) 实现。
QueryPlayersCurrencyAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserData<IUserCurrencyRecord>>> QueryPlayersCurrencyAsync(Player[] players, IEnumerable<VarChar180> keys)异步批量查询指定玩家的货币数据(便利方法)
players— 要查询的玩家数组,自动提取UserId进行查询keys— 要检索的货币键集合,每个键不超过180个UTF-8字符,不能为null或空
返回: 包含查询结果的任务。成功时返回 UserData1`, 失败时返回相应的错误代码。
QueryCappedDataAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserData<IUserCappedDataRecord>>> QueryCappedDataAsync(long[] userIds, IEnumerable<VarChar180> keys)异步批量查询指定用户的有上限数据
userIds— 要查询的用户ID数组,不能为null或空keys— 要检索的数据键集合,每个键不超过180个UTF-8字符,不能为null或空
返回: 包含查询结果的任务。成功时返回 UserData1`, 失败时返回相应的错误代码。
备注
委托给 VarChar180}) 实现。
QueryUserNameBatchAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserNames>> QueryUserNameBatchAsync(long[] userIds)异步批量查询指定用户的平台用户名数据
userIds— 要查询的用户ID数组,不能为null或空
返回: 包含用户名称查询结果的任务。成功时返回 UserNames 对象, 失败时返回相应的错误代码。结果可能为空但不会为null。
备注
委托给 Int64[]) 实现。 该方法支持批量查询多个用户的平台用户名信息。
QueryPlayersUserNameBatchAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserNames>> QueryPlayersUserNameBatchAsync(Player[] players)异步批量查询指定玩家的平台用户名数据(便利方法)
players— 要查询的玩家数组,自动提取UserId进行查询
返回: 包含用户名称查询结果的任务。成功时返回 UserNames 对象, 失败时返回相应的错误代码。
备注
这是便利方法,会自动从Player对象提取对应的UserId进行查询。 只有连接的真人玩家会被包含在查询中,AI玩家会被过滤掉。
QueryPlayersCappedDataAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserData<IUserCappedDataRecord>>> QueryPlayersCappedDataAsync(Player[] players, IEnumerable<VarChar180> keys)异步批量查询指定玩家的有上限数据(便利方法)
players— 要查询的玩家数组,自动提取UserId进行查询keys— 要检索的数据键集合,每个键不超过180个UTF-8字符,不能为null或空
返回: 包含查询结果的任务。成功时返回 UserData1`, 失败时返回相应的错误代码。
QueryUserListItemsAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IListItemRecord>>> QueryUserListItemsAsync(long userId, VarChar180 key, int? maxCount = null)异步查询指定用户的列表项数据
userId— 用户ID,必须大于0key— 列表键,不超过180个UTF-8字符,不能为空maxCount— 最大返回数量,如果指定则返回最新的指定数量的项目,null表示返回所有项目
返回: 包含列表项记录的任务。成功时返回 IListItemRecord 集合, 失败时返回相应的错误代码。
备注
委托给 Int32}) 实现。
QueryPlayerListItemsAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IListItemRecord>>> QueryPlayerListItemsAsync(Player player, VarChar180 key, int? maxCount = null)异步查询指定玩家的列表项数据(便利方法)
player— 玩家对象,自动提取UserId进行查询key— 列表键,不超过180个UTF-8字符,不能为空maxCount— 最大返回数量,如果指定则返回最新的指定数量的项目,null表示返回所有项目
返回: 包含列表项记录的任务。成功时返回 IListItemRecord 集合, 失败时返回相应的错误代码。
ScanUserListItemsAsync 仅服务端
csharp
public static Task<UserCloudDataResult<ListItemScanBatch>> ScanUserListItemsAsync(long userId, VarChar180 key, int batchSize, long? beforeItemUuid = null)按稳定游标分批扫描指定用户的列表项数据。
userId— 用户 ID,必须大于 0。key— 列表键,不超过 180 个 UTF-8 字符,不能为空。batchSize— 本批最多返回的列表项数量,必须大于 0。beforeItemUuid— 上一批结果的NextBeforeItemUuid;传null表示从最新列表项开始。
返回: 包含扫描批次的任务。成功时返回 ListItemScanBatch,失败时返回相应的错误代码。
备注
该方法适合需要把一个较大的 ListItem 列表分多次读完的场景。每批结果按 ItemUUID 倒序返回;当 HasMore 为 true 时,将 NextBeforeItemUuid 传给下一次调用即可继续。 与 Int32}) 只取最新若干条不同,扫描游标按列表项 ID 向更旧记录推进,正常情况下不会重复返回已经扫描过的列表项。该方法不是强一致数据库快照;扫描过程中新增的列表项 通常会留到下一轮完整扫描,删除或移动列表项会影响后续批次。
ScanPlayerListItemsAsync 仅服务端
csharp
public static Task<UserCloudDataResult<ListItemScanBatch>> ScanPlayerListItemsAsync(Player player, VarChar180 key, int batchSize, long? beforeItemUuid = null)按稳定游标分批扫描指定玩家的列表项数据。
player— 玩家对象,会自动提取真人玩家的 UserId。key— 列表键,不超过 180 个 UTF-8 字符,不能为空。batchSize— 本批最多返回的列表项数量,必须大于 0。beforeItemUuid— 上一批结果的NextBeforeItemUuid;传null表示从最新列表项开始。
返回: 包含扫描批次的任务。成功时返回 ListItemScanBatch,失败时返回相应的错误代码。
备注
这是 Int64}) 的玩家便利方法。
FindListItemByIdAsync 仅服务端
csharp
public static Task<UserCloudDataResult<RecordFoundStatus<IListItemRecord>>> FindListItemByIdAsync(long listItemUuid)异步通过全局唯一ID查找列表项
listItemUuid— 列表项的全局唯一标识符
返回: 包含查找结果的任务。成功时返回 RecordFoundStatus1`, 指示是否找到项目以及项目数据,失败时返回相应的错误代码。
备注
委托给 Int64) 实现。
CheckNameClaimedStatusAsync 仅服务端
csharp
public static Task<UserCloudDataResult<NameClaimStatus>> CheckNameClaimedStatusAsync(VarChar180 key, VarChar180 name)异步检查指定名称在给定命名空间中是否已被占用
key— 命名空间键,不超过180个UTF-8字符,不能为空name— 要检查的名称,不超过180个UTF-8字符,不能为空
返回: 包含名称占用状态的任务。成功时返回 NameClaimStatus, 失败时返回相应的错误代码。
备注
委托给 VarChar180) 实现。
SearchClaimedNamesAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<INameRecord>>> SearchClaimedNamesAsync(VarChar180 key, VarChar180 partialName)异步搜索包含指定部分名称的已占用名称
key— 命名空间键,不超过180个UTF-8字符,不能为空partialName— 要搜索的部分名称,支持模糊匹配,不能为空
返回: 包含匹配名称记录的任务。成功时返回 INameRecord 集合, 失败时返回相应的错误代码。最多返回15个结果。
备注
委托给 VarChar180) 实现。
ForUser 仅服务端
csharp
public static TransactionBuilder ForUser(long userId)为指定用户创建事务构建器
userId— 用户ID,必须大于0
返回: 事务构建器实例
备注
委托给 Int64) 实现。
ForPlayer 仅服务端
csharp
public static TransactionBuilder ForPlayer(Player player)为指定玩家创建事务构建器(便利方法)
player— 玩家对象,自动提取UserId创建事务
返回: 事务构建器实例
备注
这是便利方法,会自动从Player对象提取对应的UserId创建事务构建器。 确保传入的是连接的真人玩家,AI玩家不支持云数据操作。
ForUser 仅服务端
csharp
public static TransactionBuilder ForUser(User user)为指定用户创建事务构建器(便利方法)
user— 用户对象,自动提取UserId创建事务
返回: 事务构建器实例
备注
这是便利方法,会自动从User对象提取UserId创建事务构建器。 委托给 Int64) 实现。
ForUsers 仅服务端
csharp
public static BatchTransactionBuilder ForUsers(params long[] userIds)创建批量用户事务构建器
userIds— 用户ID数组
返回: 批量事务构建器
备注
委托给 Int64[]) 实现。
ForPlayers 仅服务端
csharp
public static BatchTransactionBuilder ForPlayers(params Player[] players)创建批量玩家事务构建器(便利方法)
players— 玩家数组,自动提取UserId创建批量事务
返回: 批量事务构建器
备注
这是便利方法,会自动从Player对象数组提取对应的UserId创建批量事务构建器。 只有连接的真人玩家会被包含,AI玩家会被过滤掉。
ExecuteTransactionAsync 仅服务端
csharp
public static Task<UserCloudDataResult> ExecuteTransactionAsync(IEnumerable<TransactionOperation> operations, VarChar255 description)直接执行事务操作(便捷方法)
operations— 事务操作集合description— 事务描述
返回: 事务执行结果
备注
委托给 VarChar255) 实现。 适用于已经构建好操作列表的场景。
CloudDataOperations 仅服务端
命名空间 GameCore.UserCloudData
csharp
public static class CloudDataOperations云数据操作实现类,提供所有云数据操作的具体实现
备注
该类是云数据系统的中间层,负责:
- 实现所有云数据查询和事务操作
- 提供参数验证和错误处理
- 管理请求ID生成和异步等待
- 封装底层Provider调用
方法
QueryUserDataBatchAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IUserDataBatchQueryResult>>> QueryUserDataBatchAsync(long[] userIds, IEnumerable<VarChar180> keys)异步批量查询指定用户的通用数据
userIds— 要查询的用户ID数组,不能为null或空keys— 要检索的数据键集合,每个键不超过180个UTF-8字符,不能为null或空
返回: 包含查询结果的任务。成功时返回 IUserDataBatchQueryResult 集合, 失败时返回相应的错误代码。结果可能为空但不会为null。
备注
该方法支持批量查询多个用户的多个数据键,适用于需要同时获取大量用户数据的场景。 查询结果按用户分组,每个用户的数据包含BigInt、VarChar和Blob三种类型。
QueryUserNameBatchAsync 仅服务端
csharp
public static Task<UserCloudDataResult<UserNames>> QueryUserNameBatchAsync(long[] userIds)异步批量查询指定用户的平台用户名数据
userIds— 要查询的用户ID数组,不能为null或空
返回: 包含用户平台用户名查询结果的任务。成功时返回 UserNames 对象, 失败时返回相应的错误代码。结果可能为空但不会为null。
备注
该方法支持批量查询多个用户的名称信息,适用于需要同时获取大量用户名称的场景。 查询结果包含用户ID和对应的名称,如果某个用户没有设置名称,则返回空字符串。 可以通过返回的 UserNames 对象的 Int64) 方法获取特定用户的名称。
QueryCurrencyBatchAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IUserCurrencyRecord>>> QueryCurrencyBatchAsync(long[] userIds, IEnumerable<VarChar180> keys)异步批量查询指定用户的货币数据
userIds— 要查询的用户ID数组,不能为null或空keys— 要检索的货币键集合,每个键不超过180个UTF-8字符,不能为null或空
返回: 包含查询结果的任务。成功时返回 IUserCurrencyRecord 集合, 失败时返回相应的错误代码。
备注
货币数据具有特殊的原子性保证,支持AddCurrency和CostCurrency等事务操作。 货币值不能为负数,CostCurrency操作会验证余额充足性。
QueryCappedDataBatchAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IUserCappedDataRecord>>> QueryCappedDataBatchAsync(long[] userIds, IEnumerable<VarChar180> keys)异步批量查询指定用户的有上限数据
userIds— 要查询的用户ID数组,不能为null或空keys— 要检索的数据键集合,每个键不超过180个UTF-8字符,不能为null或空
返回: 包含查询结果的任务。成功时返回 IUserCappedDataRecord 集合, 失败时返回相应的错误代码。
备注
有上限数据支持动态调整上限值,常用于体力、经验等有最大值限制的数值。 可以通过 UserDataResetOption) 操作修改数值和上限。
CheckNameClaimedStatusAsync 仅服务端
csharp
public static Task<UserCloudDataResult<NameClaimStatus>> CheckNameClaimedStatusAsync(VarChar180 key, VarChar180 name)异步检查指定名称在给定命名空间中是否已被占用
key— 命名空间键,不超过180个UTF-8字符,不能为空name— 要检查的名称,不超过180个UTF-8字符,不能为空
返回: 包含名称占用状态的任务。成功时返回 NameClaimStatus, 失败时返回相应的错误代码。
备注
名称系统提供全局唯一性保证,常用于玩家昵称、公会名称等需要唯一标识的场景。 名称一旦被占用,可以通过 DeleteName 操作进行删除,或通过新的 ClaimNewName 操作占用其他名称。
SearchClaimedNamesAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<INameRecord>>> SearchClaimedNamesAsync(VarChar180 key, VarChar180 partialName)异步搜索包含指定部分名称的已占用名称
key— 命名空间键,不超过180个UTF-8字符,不能为空partialName— 要搜索的部分名称,支持模糊匹配,不能为空
返回: 包含匹配名称记录的任务。成功时返回 INameRecord 集合, 失败时返回相应的错误代码。最多返回15个结果。
备注
该方法执行大小写不敏感的部分匹配搜索,适用于名称联想和重复检查。 为了防止性能问题,单次搜索最多返回15个匹配结果。
QueryUserListItemsAsync 仅服务端
csharp
public static Task<UserCloudDataResult<IEnumerable<IListItemRecord>>> QueryUserListItemsAsync(long userId, VarChar180 key, int? maxCount = null)异步查询指定用户的列表项数据
userId— 用户ID,必须大于0key— 列表键,不超过180个UTF-8字符,不能为空maxCount— 最大返回数量,如果指定则返回最新的指定数量的项目,null表示返回所有项目
返回: 包含列表项记录的任务。成功时返回 IListItemRecord 集合, 失败时返回相应的错误代码。
备注
列表项按时间倒序排列,最新添加的项目排在前面。 如果指定了maxCount,将返回最新的指定数量的项目。 列表项支持添加、修改和删除操作,可以存储任意二进制数据。
ScanUserListItemsAsync 仅服务端
csharp
public static Task<UserCloudDataResult<ListItemScanBatch>> ScanUserListItemsAsync(long userId, VarChar180 key, int batchSize, long? beforeItemUuid = null)按稳定游标分批扫描指定用户的列表项数据。
userId— 用户 ID,必须大于 0。key— 列表键,不超过 180 个 UTF-8 字符,不能为空。batchSize— 本批最多返回的列表项数量,必须大于 0。beforeItemUuid— 上一批结果的NextBeforeItemUuid;传null表示从最新列表项开始。
返回: 包含扫描批次的任务。成功时返回 ListItemScanBatch,失败时返回相应的错误代码。
备注
每批结果按 ItemUUID 倒序返回。调用方应在 HasMore 为 true 时继续传入 NextBeforeItemUuid,直到该值为 null。 该扫描不是强一致快照;扫描过程中新增的列表项通常会留到下一轮完整扫描,删除或移动列表项会影响后续批次。
FindListItemByIdAsync 仅服务端
csharp
public static Task<UserCloudDataResult<RecordFoundStatus<IListItemRecord>>> FindListItemByIdAsync(long listItemUuid)异步通过全局唯一ID查找列表项
listItemUuid— 列表项的全局唯一标识符
返回: 包含查找结果的任务。成功时返回 RecordFoundStatus1`, 指示是否找到项目以及项目数据,失败时返回相应的错误代码。
备注
该方法通过全局唯一ID进行精确查找,不需要指定用户ID或列表键。 返回的 RecordFoundStatus1` 提供类型安全的空值检查。
ExecuteTransactionAsync 仅服务端
csharp
public static Task<UserCloudDataResult> ExecuteTransactionAsync(IEnumerable<TransactionOperation> operations, VarChar255 description)异步执行云数据事务,如果任何操作失败,整个事务将被回滚
operations— 要执行的事务操作集合,不能为null或空description— 事务描述,将存储到数据库中用于审计,不超过255个UTF-8字符
返回: 包含事务执行结果的任务。成功时返回 Success, 失败时返回相应的错误代码。
备注
事务提供ACID特性保证,所有操作要么全部成功,要么全部失败。 支持的操作类型包括:数据设置/删除、货币加减、列表项管理、名称占用等。 事务描述将记录在审计日志中,建议提供有意义的描述信息。
CloudDataType 仅服务端
命名空间 GameCore.UserCloudData
csharp
public enum CloudDataType云数据类型枚举
枚举值
BigIntVarCharBlobUtf8Blob— UTF-8 字符串(以 blob 存储, tag=Utf8)。删除时与 Blob 等价。Double— 双精度浮点(以 8 字节 IEEE754 存入 blob, tag=Double)。删除时与 Blob 等价。
ListItemReferenceTransactionOperationExtensions 仅服务端
命名空间 GameCore.UserCloudData
csharp
public static class ListItemReferenceTransactionOperationExtensionsExtension methods for converting prepared list item references into transaction operations.
方法
ToListItemAddOperation 仅服务端
csharp
public static TransactionOperation ToListItemAddOperation(this ListItemReference listItemReference)Converts a prepared list item reference into an AddListItem transaction operation.
listItemReference— The prepared list item reference.
返回: The transaction operation that adds the referenced list item.
ListItemScanBatch 仅服务端
命名空间 GameCore.UserCloudData
csharp
public sealed class ListItemScanBatchListItem 分批扫描的一批结果。
备注
将成功结果中的 NextBeforeItemUuid 传给下一次扫描调用,可以继续读取更旧的列表项。 扫描按 ItemUUID 倒序推进,适合把同一个用户、同一个 key 下的大量 ListItem 分多次读完。它不是数据库快照:扫描过程中新增的列表项通常会留到下一轮完整扫描;删除或移动 列表项会影响之后批次还能读到的内容。
构造函数
ListItemScanBatch 仅服务端
csharp
public ListItemScanBatch(IReadOnlyList<IListItemRecord> items, bool hasMore, long? nextBeforeItemUuid)属性
Items 仅服务端
csharp
public IReadOnlyList<IListItemRecord> Items { get; }本批返回的列表项,按 ItemUUID 倒序排列。
HasMore 仅服务端
csharp
public bool HasMore { get; }是否还有更旧的列表项可以继续扫描。
NextBeforeItemUuid 仅服务端
csharp
public long? NextBeforeItemUuid { get; }下一次扫描要传入的排他游标;为 null 时表示已经读到当前列表末尾。
TransactionBuilder 仅服务端
命名空间 GameCore.UserCloudData
csharp
public sealed class TransactionBuilder云数据事务构建器,提供流式API来构建和执行事务操作
备注
该构建器简化了事务的创建过程,提供类型安全和链式调用支持。 支持自动优化、操作验证和错误预检等高级功能。
属性
OperationCount 仅服务端
csharp
public int OperationCount { get; }获取操作数量
HasOperations 仅服务端
csharp
public bool HasOperations { get; }检查是否有操作
方法
ForUser 仅服务端
csharp
public static TransactionBuilder ForUser(long userId)为指定用户创建事务构建器
userId— 用户ID,必须大于0
返回: 事务构建器实例
ForUsers 仅服务端
csharp
public static BatchTransactionBuilder ForUsers(params long[] userIds)创建批量用户事务构建器
userIds— 用户ID数组
返回: 批量事务构建器
SetData 仅服务端
csharp
public TransactionBuilder SetData(string key, long value)设置整数数据
key— 数据键,不超过180个UTF-8字符value— 整数值
返回: 当前构建器实例,支持链式调用
SetData 仅服务端
csharp
public TransactionBuilder SetData(string key, string value)设置字符串数据
key— 数据键,不超过180个UTF-8字符value— 字符串值,不超过255个UTF-8字符
返回: 当前构建器实例,支持链式调用
SetData 仅服务端
csharp
public TransactionBuilder SetData(string key, byte[] data)设置二进制数据
key— 数据键,不超过180个UTF-8字符data— 二进制数据
返回: 当前构建器实例,支持链式调用
SetUtf8Blob 仅服务端
csharp
public TransactionBuilder SetUtf8Blob(string key, string value)设置 UTF-8 字符串数据(以 blob 形式存储,不受 String) 的 255 字符限制;后台可编辑)
key— 数据键,不超过180个UTF-8字符value— UTF-8 字符串值
返回: 当前构建器实例,支持链式调用
SetDoubleBlob 仅服务端
csharp
public TransactionBuilder SetDoubleBlob(string key, double value)设置双精度浮点数据(以 8 字节 IEEE754 存入 blob;后台可编辑)。用于存储小数云变量。
key— 数据键,不超过180个UTF-8字符value— 双精度浮点值
返回: 当前构建器实例,支持链式调用
AddToData 仅服务端
csharp
public TransactionBuilder AddToData(string key, long delta)增加整数数据
key— 数据键delta— 增加的数值
返回: 当前构建器实例,支持链式调用
DeleteData 仅服务端
csharp
public TransactionBuilder DeleteData(string key, CloudDataType dataType = CloudDataType.BigInt)删除数据
key— 要删除的数据键dataType— 数据类型
返回: 当前构建器实例,支持链式调用
AddCurrency 仅服务端
csharp
public TransactionBuilder AddCurrency(string currencyKey, long amount)添加货币,可为负数,可以将货币扣到负数
currencyKey— 货币键amount— 添加的金额,可为负数,可以将货币扣到负数
返回: 当前构建器实例,支持链式调用
CostCurrency 仅服务端
csharp
public TransactionBuilder CostCurrency(string currencyKey, long amount)消耗货币,若余额不足,则事务失败
currencyKey— 货币键amount— 消耗的金额,必须大于0
返回: 当前构建器实例,支持链式调用
AddListItem 仅服务端
csharp
public TransactionBuilder AddListItem(ListItemReference listItemReference)添加列表项到事务中
listItemReference— 列表项引用,包含ID、列表键、用户ID和数据
返回: 当前构建器实例,支持链式调用
备注
该方法要求传入一个完整的 ListItemReference,通常通过 Byte[]) 方法获得。 这种设计确保了ID、列表键和数据的一致性,避免了参数传递错误。
PrepareListItem 仅服务端
csharp
public ListItemReference PrepareListItem(string listKey, byte[] itemData)准备列表项引用(自动生成全局唯一ID),但不添加到事务中
listKey— 列表键itemData— 项目数据
返回: 列表项引用,包含自动生成的ID
备注
该方法会自动调用内部ID生成器生成全局唯一ID。 返回的引用对象包含生成的ID,需要通过 ListItemReference) 方法添加到事务中。 这种两阶段设计确保了ID的预先获取和类型安全的操作。
PrepareUtf8ListItem 仅服务端
csharp
public ListItemReference PrepareUtf8ListItem(string listKey, string itemData)准备 UTF-8 字符串列表项引用(自动生成全局唯一ID),但不添加到事务中
listKey— 列表键itemData— UTF-8 字符串数据
返回: 列表项引用,包含自动生成的ID
PrepareDoubleListItem 仅服务端
csharp
public ListItemReference PrepareDoubleListItem(string listKey, double itemData)准备双精度浮点列表项引用(自动生成全局唯一ID),但不添加到事务中
listKey— 列表键itemData— 双精度浮点数据
返回: 列表项引用,包含自动生成的ID
DeleteListItem 仅服务端
csharp
public TransactionBuilder DeleteListItem(long itemId)删除列表项(使用全局唯一ID)
itemId— 全局唯一的项目ID
返回: 当前构建器实例,支持链式调用
DeleteListItem 仅服务端
csharp
public TransactionBuilder DeleteListItem(ListItemReference itemReference)删除列表项(使用引用)
itemReference— 项目引用
返回: 当前构建器实例,支持链式调用
UpdateListItem 仅服务端
csharp
public TransactionBuilder UpdateListItem(long itemId, byte[] newData)更新列表项(使用全局唯一ID)
itemId— 全局唯一的项目IDnewData— 新的项目数据
返回: 当前构建器实例,支持链式调用
UpdateListItemUtf8 仅服务端
csharp
public TransactionBuilder UpdateListItemUtf8(long itemId, string newData)更新列表项为 UTF-8 字符串数据(使用全局唯一ID)
itemId— 全局唯一的项目IDnewData— 新的 UTF-8 字符串数据
返回: 当前构建器实例,支持链式调用
UpdateListItemDouble 仅服务端
csharp
public TransactionBuilder UpdateListItemDouble(long itemId, double newData)更新列表项为双精度浮点数据(使用全局唯一ID)
itemId— 全局唯一的项目IDnewData— 新的双精度浮点数据
返回: 当前构建器实例,支持链式调用
UpdateListItem 仅服务端
csharp
public TransactionBuilder UpdateListItem(ListItemReference itemReference, byte[] newData)更新列表项(使用引用)
itemReference— 项目引用newData— 新的项目数据
返回: 当前构建器实例,支持链式调用
UpdateListItemUtf8 仅服务端
csharp
public TransactionBuilder UpdateListItemUtf8(ListItemReference itemReference, string newData)更新列表项为 UTF-8 字符串数据(使用引用)
itemReference— 项目引用newData— 新的 UTF-8 字符串数据
返回: 当前构建器实例,支持链式调用
UpdateListItemDouble 仅服务端
csharp
public TransactionBuilder UpdateListItemDouble(ListItemReference itemReference, double newData)更新列表项为双精度浮点数据(使用引用)
itemReference— 项目引用newData— 新的双精度浮点数据
返回: 当前构建器实例,支持链式调用
MoveListItem 仅服务端
csharp
public TransactionBuilder MoveListItem(long itemId, string targetListKey)移动列表项到另一个列表
itemId— 全局唯一的项目IDtargetListKey— 目标列表的键名
返回: 当前构建器实例,支持链式调用
MoveListItem 仅服务端
csharp
public TransactionBuilder MoveListItem(ListItemReference itemReference, string targetListKey)移动列表项到另一个列表(使用引用)
itemReference— 项目引用targetListKey— 目标列表的键名
返回: 当前构建器实例,支持链式调用
AddListItems 仅服务端
csharp
public TransactionBuilder AddListItems(ListItemReference[] listItemReferences)批量添加列表项到事务中
listItemReferences— 列表项引用数组,每个引用包含完整的项目信息
返回: 当前构建器实例,支持链式调用
备注
该方法将多个列表项引用批量添加到事务中,适用于需要同时添加多个项目的场景。 所有引用通常通过 Byte[][]) 方法批量准备。
PrepareListItems 仅服务端
csharp
public ListItemReference[] PrepareListItems(string listKey, params byte[][] itemsData)批量准备列表项引用(仅生成ID,不添加到事务中)
listKey— 列表键itemsData— 项目数据数组
返回: 列表项引用数组,包含所有生成的全局唯一ID
备注
该方法仅准备列表项引用,不会将它们添加到事务中。 需要调用 ListItemReference[]) 方法将引用添加到事务中。
PrepareUtf8ListItems 仅服务端
csharp
public ListItemReference[] PrepareUtf8ListItems(string listKey, params string[] itemsData)批量准备 UTF-8 字符串列表项引用(仅生成ID,不添加到事务中)
listKey— 列表键itemsData— UTF-8 字符串数据数组
返回: 列表项引用数组,包含所有生成的全局唯一ID
PrepareDoubleListItems 仅服务端
csharp
public ListItemReference[] PrepareDoubleListItems(string listKey, params double[] itemsData)批量准备双精度浮点列表项引用(仅生成ID,不添加到事务中)
listKey— 列表键itemsData— 双精度浮点数据数组
返回: 列表项引用数组,包含所有生成的全局唯一ID
DeleteListItems 仅服务端
csharp
public TransactionBuilder DeleteListItems(params ListItemReference[] itemReferences)批量删除列表项(使用引用)
itemReferences— 项目引用数组
返回: 当前构建器实例,支持链式调用
ModifyCappedData 仅服务端
csharp
public TransactionBuilder ModifyCappedData(string key, long delta, long newCap, UserDataResetOption? resetOption = null)修改有上限的数据,若修改后的值超过上限,则整个事务失败。 若从未设置过指定Key的数据,则设置上限为newCap,并设置当前值为delta。
key— 数据键,不超过180个UTF-8字符delta— 变化量,可以为正数(增加)或负数(减少)newCap— 新的上限值,必须大于等于0resetOption— 重置选项,控制数据何时自动重置为0。可选值:Int32): 每N小时重置Int32): 每N天重置DayOfWeek): 每N周的指定星期重置Int32): 每N月重置Int32): 每N年重置Never: 永不重置(默认)
返回: 当前构建器实例,支持链式调用
备注
此方法用于管理具有上限限制的数据,如体力、经验池等。 计算逻辑:新值 = 当前值 + delta,如果新值 > newCap,则事务失败。 重置选项可以实现定期重置功能,例如每日体力恢复、每周活跃度重置等。 如果数据不存在,则从0开始计算。
ResetCappedData 仅服务端
csharp
public TransactionBuilder ResetCappedData(string key)重置有上限数据,将当前值重置为0
key— 数据键名
返回: 当前构建器实例,支持链式调用
ClaimName 仅服务端
csharp
public TransactionBuilder ClaimName(string nameKey, string name, string description = "")占用新名称
nameKey— 名称空间键name— 要占用的名称description— 名称描述
返回: 当前构建器实例,支持链式调用
DeleteName 仅服务端
csharp
public TransactionBuilder DeleteName(string nameKey, string name)删除已声明的名称
nameKey— 名称空间键name— 要删除的名称
返回: 当前构建器实例,支持链式调用
WithDescription 仅服务端
csharp
public TransactionBuilder WithDescription(string description)设置事务描述 通常可以在云数据后台查看
description— 事务描述,用于审计日志
返回: 当前构建器实例,支持链式调用
WithOptimization 仅服务端
csharp
public TransactionBuilder WithOptimization(bool enable = true)启用或禁用事务优化
enable— 是否启用优化
返回: 当前构建器实例,支持链式调用
备注
优化包括:合并相同键的操作、去除冗余操作等
WithValidation 仅服务端
csharp
public TransactionBuilder WithValidation(bool enable = true)启用或禁用操作验证
enable— 是否启用验证
返回: 当前构建器实例,支持链式调用
Build 仅服务端
csharp
public IEnumerable<TransactionOperation> Build()构建事务操作列表
返回: 优化后的事务操作列表
ExecuteAsync 仅服务端
csharp
public Task<UserCloudDataResult> ExecuteAsync()执行事务
返回: 事务执行结果
UserData 双端
命名空间 GameCore.UserCloudData
csharp
public class UserData<T> where T : IUserKeyRecord<T>用户数据集合,提供高效的数据查询和分组功能
备注
该类封装了用户数据记录集合,提供按用户ID和数据键进行分组查询的功能。 适用于云数据查询结果的后续处理和分析。 数据键相关的便利查询使用 OrdinalIgnoreCase 比较,贴近底层云数据存储可能大小写不敏感的命中语义。
构造函数
UserData 双端
csharp
public UserData(IEnumerable<T> records)用户数据集合,提供高效的数据查询和分组功能
备注
该类封装了用户数据记录集合,提供按用户ID和数据键进行分组查询的功能。 适用于云数据查询结果的后续处理和分析。 数据键相关的便利查询使用 OrdinalIgnoreCase 比较,贴近底层云数据存储可能大小写不敏感的命中语义。
属性
Records 双端
csharp
public IEnumerable<T> Records { get; }原始记录集合
Count 双端
csharp
public int Count { get; }获取记录总数
UserCount 双端
csharp
public int UserCount { get; }获取唯一用户ID的数量
KeyCount 双端
csharp
public int KeyCount { get; }获取唯一键的数量
方法
GetByKey 双端
csharp
public IEnumerable<T>? GetByKey(string key)根据数据键分组查询
key— 数据键,不能为null或空
返回: 匹配的记录集合,如果键为空则返回null
备注
此方法会按大小写不敏感比较过滤出所有Key属性等于指定键的记录。
GetByUserId 双端
csharp
public IEnumerable<T> GetByUserId(long userId)根据用户ID分组查询
userId— 用户ID
返回: 该用户的所有记录
备注
此方法会过滤出所有UserId属性等于指定用户ID的记录。
GetByUserIds 双端
csharp
public IEnumerable<T> GetByUserIds(params long[] userIds)根据多个用户ID查询
userIds— 用户ID数组
返回: 指定用户的所有记录
GetByKeys 双端
csharp
public IEnumerable<T> GetByKeys(params string[] keys)根据多个数据键查询
keys— 数据键数组
返回: 指定键的所有记录
HasUserId 双端
csharp
public bool HasUserId(long userId)检查是否包含指定用户ID的记录
userId— 用户ID
返回: 如果包含该用户的记录则返回true
HasKey 双端
csharp
public bool HasKey(string key)检查是否包含指定键的记录
key— 数据键
返回: 如果包含该键的记录则返回true
GetByPlayer 仅服务端
csharp
public IEnumerable<T>? GetByPlayer(Player player)根据玩家对象分组查询(仅服务端)
player— 玩家对象
返回: 该玩家的所有记录,如果玩家无效则返回null
备注
此方法会自动从Player对象提取UserId进行查询。 只有连接的真人玩家才会返回数据,AI玩家会返回null。
UserNames 双端
命名空间 GameCore.UserCloudData
csharp
public class UserNames构造函数
UserNames 双端
csharp
public UserNames(IEnumerable<IUserNameRecord> records)属性
Records 双端
csharp
public IEnumerable<IUserNameRecord> Records { get; }方法
GetUserName 双端
csharp
public string? GetUserName(long userId)ListItemReference 仅服务端
命名空间 GameCore.UserCloudData.Internal
csharp
public sealed class ListItemReference列表项引用,包含自动生成的ID和相关信息
备注
该类用于在事务构建过程中引用列表项,确保ID、列表键、用户ID和数据的一致性。 通过引用对象可以避免参数传递错误,提供类型安全的操作。
属性
Id 仅服务端
csharp
public long Id { get; }列表项的全局唯一ID
ListKey 仅服务端
csharp
public string ListKey { get; }列表键,标识该项目属于哪个列表
UserId 仅服务端
csharp
public long UserId { get; }所属用户ID
Data 仅服务端
csharp
public byte[] Data { get; }项目数据
ValueType 仅服务端
csharp
public CloudDataListItemValueType ValueType { get; }项目数据类型。
DoubleValue 仅服务端
csharp
public double DoubleValue { get; }当 ValueType 为 Double 时保存双精度浮点值。
方法
ToString 仅服务端
csharp
public override string ToString()返回引用的字符串表示
返回: 包含ID、列表键和用户ID的描述字符串
Equals 仅服务端
csharp
public override bool Equals(object? obj)比较两个列表项引用是否相等
obj— 要比较的对象
返回: 如果引用相同的列表项则返回true
GetHashCode 仅服务端
csharp
public override int GetHashCode()获取引用的哈希码
返回: 基于ID的哈希码