你的下一项功能
好友
所选项目的好友、申请与屏蔽。
Unity

可见的结果
超时或冲突后重新获取并核对意图,切勿自动换用新修订号重试。
此步骤尚无视频。指南和MCP请求已可使用。
好友
准备同一个项目
在仪表盘中选择与游戏配置相同的项目。
好友 →首次请求不需要额外定义。没有对应游戏数据时,空结果也有效。
在同一项目使用两个独立玩家会话。从用户管理复制另一玩家的准确UUID。
使用精确UUID或规范H代码,不接受姓名或邮箱。
此处仅查看;只有玩家本人的会话可以更改关系。
实现此功能
你可以预览指南。运行需要有效的项目密钥。 准备项目
已安装 SDK、导入项目配置,且玩家已登录。
此 SDK 示例使用 develop。请检查已安装的 SDK 是否具备所需 API。
先通过快速入门连接目标玩家,再通过明确的按钮或场景操作调用RunReviewedAction()。仅打开文件不会发送请求。
C#
1using UnityEngine;
2using PM.horizOn.Cloud.Core;
3using PM.horizOn.Cloud.Manager;
4
5// Existing SDK/project configuration and authenticated player session required.
6// Call RunReviewedAction explicitly after reviewing this example and its data.
7// 超时或冲突后重新获取并核对意图,切勿自动换用新修订号重试。
8public sealed class FriendsDemo : MonoBehaviour
9{
10 public async void RunReviewedAction()
11 {
12 var sessionUser = UserManager.Instance.CurrentUser;
13 if (sessionUser == null || !sessionUser.IsValid()) return;
14 var userId = UserManager.Instance.CurrentUser.UserId;
15 var manager = FriendsManager.Instance;
16 var loaded = await manager.GetFriends(userId);
17 if (!loaded.IsSuccess) { Debug.LogWarning(loaded.ErrorCode); return; }
18 Debug.Log(loaded.Data.friendCode); // Public identifier, not a credential.
19 foreach (var friend in loaded.Data.friends)
20 Debug.Log(friend.display.name + ": " + (friend.lastActiveAt ?? "unknown"));
21
22 // Invoke only after the player explicitly reviews this snapshot and chooses an action.
23 async System.Threading.Tasks.Task ApplyReviewed(string action, string targetUserId,
24 long expectedRevision, string requestId = null)
25 {
26 var result = action switch {
27 "request" => await manager.SendRequest(userId, targetUserId, expectedRevision),
28 "accept" => await manager.AcceptRequest(userId, targetUserId, expectedRevision, requestId),
29 "decline" => await manager.DeclineRequest(userId, targetUserId, expectedRevision, requestId),
30 "cancel" => await manager.CancelRequest(userId, targetUserId, expectedRevision, requestId),
31 "remove" => await manager.RemoveFriend(userId, targetUserId, expectedRevision),
32 "block" => await manager.BlockPlayer(userId, targetUserId, expectedRevision),
33 "unblock" => await manager.UnblockPlayer(userId, targetUserId, expectedRevision),
34 _ => throw new System.ArgumentException("Unknown action")
35 };
36 if (!result.IsSuccess) {
37 Debug.LogWarning(result.ErrorCode); // Timeout/409: reload and reconcile; do not repeat automatically.
38 return;
39 }
40 Debug.Log(result.Data.revision); // Replace the whole displayed snapshot.
41 }
42 // Accept/decline: original incoming requestId. Cancel: original outgoing requestId.
43 // Never replace expectedRevision on an uncertain retry. A new request is a new identity.
44 // FindPlayer(userId, exactUuidOrHCode) never searches names or emails.
45 // Last login is nullable, never an online flag. No hidden polling timer.
46 }
47}
测试你的新功能。
超时或冲突后重新获取并核对意图,切勿自动换用新修订号重试。
在仪表盘中选择与游戏配置相同的项目。
接口
- GET
/friends - GET
/friends/find - POST
/friends/request - POST
/friends/accept - POST
/friends/decline - POST
/friends/cancel - POST
/friends/remove - POST
/friends/block - POST
/friends/unblock


