실시간 파티 #

실시간 파티는 게임에 팀 플레이를 추가할 수 있는 좋은 방법으로 사용자는 파티를 구성하고 파티 구성원과 대화할 수 있습니다.

파티는 일종의 게임 플레이나 사교 모임에 참여하기 위해 모인 사용자 그룹입니다. 모든 사용자는 파티를 생성할 수 있으며 최초의 파티 리더가 됩니다. 사용자는 다른 플레이어를 초대하여 가입시키거나 파티를 비공개로 표시하여 다른 플레이어가 참여를 요청하게 할 수 있습니다. 리더는 항상 필요하며 현재 리더가 종료하는 경우 현재 연결된 플레이어 중에서 선택됩니다. 모든 플레이어가 파티를 종료하면 파티가 사라집니다.

파티에 대한 매우 일반적인 Nakama 지원 사용 사례는 그룹으로 함께 매치메이킹하는 것입니다. 파티는 사용자들이 분대 단위로 협력하거나 플레이어들이 팀 전투에서 경쟁하는 게임 플레이에 적합합니다. 매치메이커에는 대결에 가입할 수 있는 충분한 용량이 확보되도록 일치 로직에 지시하는 파티 ID가 전달될 수 있습니다.

파티는 사용자가 오프라인일 때 플레이 세션 사이에 존재하도록 설계되지 않았기 때문에 그룹 기능과는 다릅니다. 파티는 최소한 한 명의 사용자라도 있으면 존재합니다. 게임이나 앱에서 영구적인 엔터티로 존재해야 하는 기타 게임 플레이나 길드 시스템을 만들려면 그룹을 사용해야 합니다.

파티 생성 #

파티는 모든 사용자가 만들 수 있습니다. 파티에 허용되는 최대 사용자 수(최대 256명)와 파티 구성원 가입 시 리더 승인 여부를 제한할 수 있습니다. 파티는 또한 파티 리더가 수정할 수 있는 상태로 생성됩니다.

Client
1
2
3
4
5
6
7
8
9
// Create an open party (i.e. no approval needed to join) with 10 max users
// This maximum includes the party leader
var party = await socket.CreatePartyAsync(open: true, maxSize: 10);
System.Console.WriteLine("New Party: {0}", party);

// Create a closed party (i.e. approval needed to join) with 5 max users
// This maximum includes the party leader
var party = await socket.CreatePartyAsync(open: false, maxSize: 5);
System.Console.WriteLine("New Party: {0}", party);
Client
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Create an open party (i.e. no approval needed to join) with 10 max users
# This maximum includes the party leader
var open = true
var max_size = 10
var party = yield(socket.create_party_async(open, max_size), "completed")
print("New party: %s" % party)

# Create a closed party (i.e. approval needed to join) with 5 max users
# This maximum includes the party leader
var open = false
var max_size = 5
var party = yield(socket.create_party_async(open, max_size), "completed")
print("New party: %s" % party)
Client
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// Create an open party (i.e. no approval needed to join) with 10 max users
// This maximum includes the party leader
const open = true;
const maxSize = 10;
const party = await socket.createParty(open, maxSize);
console.info("New Party: ", party);

// Create a closed party (i.e. approval needed to join) with 5 max users
// This maximum includes the party leader
const open = false;
const maxSize = 5;
const party = await socket.createParty(open, maxSize);
console.info("New Party: ", party);

Code snippet for this language C++/Unreal/Cocos2d-x has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Java/Android has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Defold has not been found. Please choose another language to show equivalent examples.
Code snippet for this language REST has not been found. Please choose another language to show equivalent examples.
Code snippet for this language cURL has not been found. Please choose another language to show equivalent examples.

여러분은 사용자가 런타임 코드를 사용하여 사전 후크로 게임 내에 파티를 만들 수 있는 규칙을 생성할 수 있습니다.

파티 찾기 #

새 파티를 만든 후 파티 ID를 다른 사용자와 공유하여 그 사용자가 찾고 가입할 수 있도록 하는 방법은 여러 가지입니다:

  • ID를 업데이트로 게시하기 위한 상태 이벤트, 플레이어의 구독자들이 파티에서 자신들이 활성화된 것을 볼 수 있습니다.
  • 사용자의 친구 목록에 대한 인앱 알림
  • 길드, 모든 구성원과 파티 ID 공유

서버의 이러한 기능을 결합하여 게임 디자인을 강화하는 방식을 통해 사용자를 하나로 모으고 깊고 의미 있는 플레이어 커뮤니티를 만드는 멋진 소셜 메커니즘을 만들 수 있습니다.

Client
1
2
3
4
string partyId = "<partyid>";

// Set a status update with your party ID
await socket.UpdateStatusAsync("Join my party: ", partyId);
Client
1
2
3
4
var party_id = "<party_id>"

# Set a status update with your party ID
var update : NakamaAsyncResult = yield(socket.update_status_async(JSON.print({"Join my party: %s" % party_id}), "completed")
Client
1
2
3
4
const partyId = "<partyId>";

// Set a status update with your party ID
socket.updateStatus("Join my party: ", partyId);

Code snippet for this language C++/Unreal/Cocos2d-x has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Java/Android has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Defold has not been found. Please choose another language to show equivalent examples.
Code snippet for this language REST has not been found. Please choose another language to show equivalent examples.
Code snippet for this language cURL has not been found. Please choose another language to show equivalent examples.

파티 ID로 사용자는 파티에 가입할 수 있습니다.

파티 가입 #

사용자는 파티에 가입해야 메시지를 보내거나 구성원 목록을 보거나 다른 사용자를 초대할 수 있습니다.

Client
1
2
3
4
5
6
7
string partyId = "<partyid>";
await socket.JoinPartyAsync(partyId);

socket.ReceivedParty += party =>
{
    System.Console.WriteLine("Joined party: " + party);
};
Client
1
2
3
4
5
6
var party_id = "<party_id>"

var join: NakamaAsyncResult = yield(socket.join_party_async(party_id), "completed")

func _on_party_presence(p_presence : NakamaRTAPI.PartyPresenceEvent):
    print("Joined party: %s" % [p_presence.party_id])
Client
1
2
3
4
5
6
const partyId = "<partyId>";
await socket.joinParty(partyId);

socket.onpartypresence = (presence) => {
    console.info("Joined party: ", partyId);
};

Code snippet for this language C++/Unreal/Cocos2d-x has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Java/Android has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Defold has not been found. Please choose another language to show equivalent examples.
Code snippet for this language REST has not been found. Please choose another language to show equivalent examples.
Code snippet for this language cURL has not been found. Please choose another language to show equivalent examples.

파티가 비공개인 경우 사용자는 가입을 요청할 수 있으며 파티 리더는 수락 또는 거부할 수 있습니다.

Client
1
2
3
4
5
6
7
8
9
string partyId = "<partyid>";
// List all existing join requests
var requests = await socket.ListPartyJoinRequestsAsync(partyId);

// Accept a join request
await socket.AcceptPartyMemberAsync(partyId, <userPresence>);

// Reject a join request
await socket.RemovePartyMemberAsync(partyId, <userPresence>);
Client
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var party_id = "<party_id>"

# List all existing join requests
var requests: NakamaAsyncResult = yield(socket.list_party_join_requests_async(party_id), "completed")

# Accept a join request
var request: NakamaAsyncResult = yield(socket.accept_party_member_async(party_id, <user_presence>), "completed")

# Reject a join request
var request: NakamaAsyncResult = yield(socket.remove_party_member_async(party_id, <user_presence>), "completed")
Client
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const partyId = "<partyid>";

// List all existing join requests
const requests = await socket.listPartyJoinRequests(partyId);

// Accept a join request
await socket.acceptPartyMember(partyId, <userPresence>);

// Reject a join request
await socket.removePartyMember(partyId, <userPresence>);

Code snippet for this language C++/Unreal/Cocos2d-x has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Java/Android has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Defold has not been found. Please choose another language to show equivalent examples.
Code snippet for this language REST has not been found. Please choose another language to show equivalent examples.
Code snippet for this language cURL has not been found. Please choose another language to show equivalent examples.

파티 종료 #

사용자는 언제든지 파티를 떠날 수 있습니다. 또한 사용자는 파티 연결이 끊어진 경우 허용된 일시적 연결 해제 제한 시간 내에 다시 연결 및 다시 가입하지 않으면 해당 파티에서 자동으로 제거됩니다. 일시적 연결 해제 제한 시간은 서버의 시작 옵션으로 구성할 수 있습니다.

Client
1
2
3
string partyId = "<partyid>";
var party = await socket.LeavePartyAsync(partyId);
System.Console.WriteLine("Left party: " + party);
Client
1
2
3
var party_id = "<party_id>"
var party: NakamaAsyncResult = yield(socket.leave_party_async(party_id), "completed")
print("Left party: %s" % party)
Client
1
2
3
const partyId = "<partyid>";
const party = await socket.leaveParty(partyId);
console.info("Left party: ", partyId);

Code snippet for this language C++/Unreal/Cocos2d-x has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Java/Android has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Defold has not been found. Please choose another language to show equivalent examples.
Code snippet for this language REST has not been found. Please choose another language to show equivalent examples.
Code snippet for this language cURL has not been found. Please choose another language to show equivalent examples.

파티 리더 순환 #

사용자가 종료하면 서버는 해당 사용자가 현재 파티 리더인지 확인하고 리더로 확인되면 리더가 종료했고 어떤 구성원이 새 파티 리더로 승진했는지 알려주는 메시지를 보냅니다.

자동 승격이 발생하는 경우 선택된 리더는 항상 파티 생성 이후 가장 오랫동안 파티에 참여한 사용자입니다. 이것은 정해진 프로세스이며 변경되지 않습니다. 게임에 새 리더를 승격하기 위해 다른 기준이 필요한 경우 수동 리더 승격을 참조하세요.

메시지 보내기 #

파티 구성원인 모든 사용자는 텍스트, 이모티콘 또는 게임 특정 작업이 포함된 메시지를 파티에 보낼 수 있습니다.

Client
1
2
3
4
5
6
7
8
// Sending a message
socket.SendPartyDataAsync(partyId: "<partyid>", opCode: 1, data: System.Text.Encoding.UTF8.GetBytes("{<message>}"));

// Receiving the message
socket.ReceivedPartyData += data =>
{
    System.Console.WriteLine("Received: " + System.Text.Encoding.UTF8.GetString(data));
};
Client
1
2
3
4
5
6
7
8
9
# Sending the message
var party_id = "<party_id>"
var op_code = 1
var data = "<message>".to_utf8()
var party_message: NakamaAsyncResult =  yield(socket.send_party_data_async(party_id, op_code, data), "completed")

# Receiving the message
var message: NakamaAsyncResult = yield(socket.received_party_data(data), "completed)
print("Received: %s" % message)
Client
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// Sending the message
const partyId = "<partyId>";
const opCode = 1;
const data = {"hello": "world"};
socket.sendPartyData(partyId, opCode, data);

// Receiving the message
socket.onpartydata = (data) => {
    console.info("Received: ", data)
};

Code snippet for this language C++/Unreal/Cocos2d-x has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Java/Android has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Defold has not been found. Please choose another language to show equivalent examples.
Code snippet for this language REST has not been found. Please choose another language to show equivalent examples.
Code snippet for this language cURL has not been found. Please choose another language to show equivalent examples.

수동 리더 승격 #

파티 리더는 일반 메시지뿐만 아니라 자신이 현 리더에서 물러났으며 새 리더로 승격된 사람을 알리는 특별 승격 메시지를 보낼 수도 있습니다.

Client
1
2
3
4
5
6
socket.ReceivedPartyLeader += newLeader =>
{
    System.Console.WriteLine("new party leader " + newLeader);
};

await socket.PromotePartyMemberAsync("<partyid>", partyMember);
Client
1
2
3
4
var new_leader = "<user_id>"
var party_id = "<party_id>"
var leader: NakamaAsyncResult = yield(socket.received_party_leader(party_id, new_leader), "completed)
print("New party leader: %s" % new_leader)
Client
1
2
3
4
5
6
socket.onpartyleader += (newLeader) =>
{
    console.info("New party leader: ", newLeader);
};

await socket.promotePartyMember("<partyid>", partyMember);

Code snippet for this language C++/Unreal/Cocos2d-x has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Java/Android has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Defold has not been found. Please choose another language to show equivalent examples.
Code snippet for this language REST has not been found. Please choose another language to show equivalent examples.
Code snippet for this language cURL has not been found. Please choose another language to show equivalent examples.

파티 닫기 #

파티는 파티 리더만 닫을 수 있습니다. 파티 리더는 또한 모든 파티 구성원을 퇴출시킬 수 있습니다. 그러면 파티가 닫히고 서버에서 파티 상태가 지워집니다. 대부분의 경우 리더가 종료할 수 있도록 하는 것이 게임 디자인 관점에서 더 유용합니다.

Client
1
2
string partyId = "<partyid>";
await socket.ClosePartyAsync(partyId);
Client
1
2
var party_id = "<party_id>"
var party: NakamaAsyncResult = yield(socket.close_party_async(party_id), "completed")
Client
1
2
const partyId = "<partyid>";
await socket.closeParty(partyId);

Code snippet for this language C++/Unreal/Cocos2d-x has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Java/Android has not been found. Please choose another language to show equivalent examples.
Code snippet for this language Defold has not been found. Please choose another language to show equivalent examples.
Code snippet for this language REST has not been found. Please choose another language to show equivalent examples.
Code snippet for this language cURL has not been found. Please choose another language to show equivalent examples.

모범 사례 #

파티를 사용하여 멀티플레이어 게임 논리를 구현하거나, 파티 구성원에게 전송되는 메시지가 게임 플레이 진행을 유도하기 위한 시나리오에 사용하는 것은 권장되지 않습니다. 이러한 경우 게임 서버에 권위 부여 멀티플레이어 엔진을 사용하는 것이 좋습니다. 이를 통해 멀티플레이어 네트 코드와 사용자가 실행한 작업에 관련된 논리를 완벽하게 제어할 수 있습니다.