클랜 #

플레이어는 Nakama를 통해 클랜이라고 하는 작은 그룹을 생성하여 팀을 구성하거나 게임을 같이 플레이 할 수 있습니다.

Pirate Panic을 통해 플레이어는 다음 작업을 수행할 수 있습니다:

  • 새 클랜 생성
  • 기존 클랜 가입 또는 탈퇴
  • 공용 클랜 검색
  • 이름과 엠블럼 같은 공유된 클랜 정보를 사용자 지정
  • 클랜의 다른 구성원과 채팅

이 튜토리얼에서는 새로운 플레이어가 가입을 위해서 요청을 제출해야 하는 개인 그룹에 대한 내용을 다루지 않습니다. 자세한 내용은 공식 Nakama 문서를 참조하십시오.

클랜 서버 모듈 #

Unity 클라이언트 실행으로 이동하기 전에 서버 측을 살펴보겠습니다.

다른 모듈과 마찬가지로, 새로운 클랜을 생성하는 것과 같이 특정한 이벤트에 대해서 사용자 지정 서버 행위를 등록할 수 있습니다. 그룹의 경우, 다음 사항을 중점적으로 다룹니다:

  • registerAfterJoinGroup
  • registerAfterKickGroupUsers
  • registerAfterLeaveGroup
  • registerAfterPromoteGroupUsers
  • registerAfterAddFriends
  • registerBeforeDeleteGroup

해당 이벤트의 전체 목록을 살펴봅니다.

알림 전송 #

예를 들어, 새로운 플레이어가 가입했을 때 클랜 내 모두에게 알림을 전송하는 기능은 다음과 같습니다:

clans.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
enum ClanNotificationCode {
    Refresh = 2,
    Delete = 3
}

function sendGroupNotification(nk: nkruntime.Nakama, groupId: string, code: ClanNotificationCode, subject: string) {
    const members = nk.groupUsersList(groupId, 100);
    const count = (members.groupUsers ?? []).length;
    if (count < 1) {
        return;
    }

    const notifications: nkruntime.NotificationRequest[] = new Array(count);
    members.groupUsers?.forEach(function {
        const n: nkruntime.NotificationRequest = {
            code: code,
            content: {},
            persistent: false,
            subject: subject,
            userId: user.user.userId,
        }
        notifications.push(n);
    });

    nk.notificationsSend(notifications);
}

여기서, 사용자 지정 알림 코드를 생성하여 다양한 유형의 알림을 구분합니다. 모든 양의 숫자를 사용할 수 있습니다. 그런 다음, groupUsersList을(를) 사용하여 모든 구성원에 대한 목록을 얻고, 목록에서 각 사용자에게 user.user.id을(를) 사용하여 ID를 얻고 NotificationRequest을(를) 전송합니다.

런타임 후크 설정 #

그룹에 새로운 구성원이 가입할 때마다 Nakama가 자동으로 호출되는 것과 같은 방식으로 함수를 호출해야 합니다:

clans.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/**
* Send an in-app notification to all clan members when a new member joins.
*/
const afterJoinGroupFn: nkruntime.AfterHookFunction<void, nkruntime.JoinGroupRequest> =
    function(
        ctx: nkruntime.Context,
        logger: nkruntime.Logger,
        nk: nkruntime.Nakama,
        data: void, request: nkruntime.JoinGroupRequest) {
            sendGroupNotification(nk, request.groupId ?? "", ClanNotificationCode.Refresh, "New Member Joined!");
        }

여기서는 해당 알림을 어디로 전송해야 할지 알려주는 groupId을(를) 포함하는 JoinGroupRequest을(를) 처리합니다.

예를 들어, 구성원이 추방된 경우 다른 사람에게 알림을 제공하는 것과 같이 유사한 코드를 사용하여 알림 기능을 다른 이벤트로 확대할 수 있습니다:

clans.ts

1
2
3
4
5
6
7
/**
* Send an in-app notification to all clan members when one or more members are kicked.
*/
const afterKickGroupUsersFn: nkruntime.AfterHookFunction<void, nkruntime.KickGroupUsersRequest> =
        function(ctx: nkruntime.Context, logger: nkruntime.Logger, nk: nkruntime.Nakama, data: void, request: nkruntime.KickGroupUsersRequest) {
    sendGroupNotification(nk, request.groupId ?? "", ClanNotificationCode.Refresh, "Member(s) Have Been Kicked!");
}

후크 등록 #

함수가 원하는 목적에 맞게 작동되도록 하기 위한 마지막 단계는 메인 모듈에 등록하는 것입니다. 생성된 각각의 함수를 다음과 같이 추가할 수 있습니다:

main.ts

1
2
3
4
5
6
    initializer.registerAfterKickGroupUsers(afterKickGroupUsersFn);
    initializer.registerAfterLeaveGroup(afterLeaveGroupFn);
    initializer.registerAfterPromoteGroupUsers(afterPromoteGroupUsersFn);
    initializer.registerAfterAddFriends(afterAddFriendsFn);
    initializer.registerBeforeDeleteGroup(beforeDeleteGroupFn);
    ...

각각의 register 함수는 런타임 이벤트 목록에서 사용되고, clans.ts에서 생성된 함수 중 한 개가 매개 변수로 전달됩니다.

클라이언트 생성 #

다음으로, 플레이어가 서버와 상호 작용할 수 있도록 Unity에서 인터페이스를 생성합니다. Pirate Panic에서는 다음과 같이 나타납니다:

ClansPanel
ClansPanel

이 튜토리얼에서는 Unity UI 구성 요소가 생성되는 과정을 세부적으로 다루지 않습니다. 세부적인 내용은 공식 Unity UI 튜토리얼을 참조하십시오.

클랜의 전체 코드 예시는 Pirate Panic 프로젝트를 참조하십시오.

클랜 생성 #

새로운 클랜을 생성하기 위해서 session이(가) 서버 연결이고 name이(가) 새로운 클랜인 CreateGroupAsync(session, name, ...) 함수를 사용합니다. 이 함수는 설명 또는 아바타 이미지와 같은 정보를 저장할 때 사용할 수 있는 임의 매개 변수를 추가로 사용합니다.

Pirate Panic 클랜 생성 패널에서는 다음과 같이 나타납니다:

ClanCreationPanel.cs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
private async void CreateClan()
{
    string name = _clanName.text;

    try
    {
        IApiGroup group = await _connection.Client.CreateGroupAsync(_connection.Session, name, "A super great clan.", _avatarImage.name);
        if (OnClanCreated != null)
        {
            OnClanCreated(group);
        }
    }
    catch (ApiResponseException e)
    {
        Debug.LogError("Error creating clan: " + e.Message);
    }
}

위 조각에서는 다음을 수행할 수 있습니다:

  • _clanName: 플레이어가 Unity 텍스트 상자에 새로운 클랜 이름을 입력할 수 있습니다. 텍스트를 이곳으로 가져옵니다.
  • _connection: GameConnection 개체는 코드에서 이미 초기화되었습니다.
  • 임의 매개 변수로 사용할 수 있는 두 가지 항목은 설명과 아바타 이름입니다.
  • 클랜이 생성되면 OnClanCreated 함수가 호출됩니다. [ClansMenuUI.cs]에서 Awake에 대해서 해당 속성이 지정됩니다.

마지막으로, 해당 비동기화 함수를 함수에 적용시키고 버튼 액션으로 연결시킵니다:

ClanCreationPanel.cs

1
2
3
4
5
6
7
8
...
_doneButton.onClick.AddListener(() =>
    { Hide(); });
...
public override void Hide (bool isMuteSoundManager = false) {
    CreateClan();
    base.Hide(isMuteSoundManager);
}

클랜 채팅 #

다른 구성원과 채팅할 수 있도록 전체 그룹에 대한 채널을 생성할 수 있습니다. Pirate Panic에서는 다음과 같이 나타납니다:

ClansChatPanel
ClansChatPanel

클랜 채팅을 사용하기 위해서 채팅 채널에 가입할 때 위와 같은 클랜 그룹 ID를 전달하여 클랜의 모든 구성원이 같은 채널을 사용할 수 있도록 합니다.

채팅 채널에 참여하기 위해서 JoinChatAsync을(를) 사용합니다:

ClansMenuUI.cs

1
2
3
4
5
private async void StartChat(ClanMenuUIState state)
    ...
    channel = await _connection.Socket.JoinChatAsync(state.UserClan.Id, ChannelType.Group, persistence: true, hidden: true);
    ...
}

여기서, ID state.UserClan.Id의 그룹 채널에 가입합니다. 이 채널은 지속적이기 때문에 메시지가 데이터베이스에 저장되어 연결이 해제되거나 다시 연결되어도 메시지가 표시됩니다. 또한, 플레이어가 숨겨진 구성원으로 참여하기 때문에 구성원 목록에는 표시되지 않습니다.

해당 설정은 채팅방 유형에 따라 다르게 구성할 수 있습니다. 다양한 설정에 대한 자세한 내용은 실시간 채팅 문서를 참조하십시오.

플레이어가 채팅 채널에 참여하면, 메시지 전송 및 수신은 다이렉트 메시지와 같은 방식으로 처리됩니다.

클랜 탈퇴 또는 해산 #

플레이어가 클랜에 남기를 원하지 않을 경우, 탈퇴 또는 해산 중에서 선택할 수 있습니다.

ClansMainPanel
ClansMainPanel

클랜을 탈퇴할 경우, 활성화된 상태로 유지되고 클랜에 다른 superadmin(소유자)가 남아 있는 경우에만 처리할 수 있습니다. 클랜을 해산하면 서버에서 클랜이 삭제되고 모든 구성원이 없어집니다.

예를 들어, 클랜을 탈퇴하려면 다음과 같이 합니다:

ClansMenuUI.cs

1
await _connection.Client.LeaveGroupAsync(_connection.Session, _state.DisplayedClan.Id);

이 경우, _state_은(는) 사용자 정의 클래스(ClansMenuUIState.cs에서 정의됨) ClansMenuUIState로, 현재 플레이어의 화면에 있는 정보를 포함하고 있습니다. 또한, DisplayedClan.Id은(는) 플레이어가 탈퇴하려고 하는 클랜의 ID입니다.

클랜을 해산하려면 다음과 같이 합니다:

ClansMenuUI.cs

1
await _connection.Client.DeleteGroupAsync(_connection.Session, _state.UserClan.Id);

다음 주제 #

저장소

Related Pages