게임 아이디어와 기능

다음에 추가할 기능

친구

선택한 프로젝트의 친구, 요청 및 차단입니다.

SDK: develop 브랜치플레이어 세션 필요
Unity
친구 일러스트
확인할 수 있는 결과

시간 초과나 충돌 후 새로 읽고 의도를 확인하세요. 새 리비전으로 자동 재시도하지 마세요.

동영상 준비 중

이 단계의 동영상은 아직 없습니다. 안내와 MCP 요청은 바로 사용할 수 있습니다.

친구

같은 프로젝트 준비

  1. 게임 설정과 같은 프로젝트를 대시보드에서 선택하세요.

    친구 →
  2. 첫 요청에는 추가 정의가 필요하지 않습니다. 일치하는 게임 데이터가 없으면 빈 결과도 정상입니다.

    같은 프로젝트에서 서로 다른 두 플레이어 세션을 사용하세요. 사용자 관리에서 상대의 정확한 UUID를 복사하세요.

    정확한 UUID 또는 정규 H 코드를 사용하세요. 이름과 이메일은 허용되지 않습니다.

    여기서는 조회만 가능하며 플레이어 본인 세션만 관계를 변경합니다.

이 기능 구현하기

가이드는 미리 볼 수 있습니다. 실행하려면 활성 프로젝트 키가 필요합니다. 프로젝트 준비

SDK 설치와 프로젝트 설정 가져오기가 완료되고 플레이어가 로그인해야 합니다.

이 SDK 예제는 develop을 사용합니다. 필요한 API가 설치된 SDK에 있는지 확인하세요.

빠른 시작으로 원하는 플레이어를 연결하세요. 명시적인 버튼이나 씬 동작에서 RunReviewedAction()을 호출하세요. 파일을 여는 것만으로는 요청을 보내지 않습니다.

C#
Assets/Scripts/FriendsDemo.cs
horizOn 호출
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}
전체 SDK 예제 열기 ↗

새 기능을 테스트하세요.

시간 초과나 충돌 후 새로 읽고 의도를 확인하세요. 새 리비전으로 자동 재시도하지 마세요.

게임 설정과 같은 프로젝트를 대시보드에서 선택하세요.

엔드포인트
  • 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
API 레퍼런스의 모든 엔드포인트
다음 단계에 대한 추천

모든 라운드에 최고 점수를 더하세요.

라운드가 끝나면 점수를 저장하고 선두를 보여주세요. 기존 연결과 플레이어 세션을 계속 사용하세요.