알림 #

알림을 통해 플레이어에게 게임 중 이벤트를 알려줄 수 있습니다. 이번 섹션에서는 Nakama 알림 엔진을 사용하여 특정 액션이 발생했을 때 플레이어에게 경고와 메시지를 보내는 방법에 대해서 살펴봅니다.

인앱 알림은 서버에서 전송한 다음, 클라이언트에 의해 수신되고 게임 내에서 표시할 수 있습니다. 영구적인 것으로 표시된 경우, 수신인이 오프라인 상태인 경우에도 서버는 알림을 수락할 수 있습니다.

인앱 알림은 전화기에서 받는 푸쉬 알림과 다릅니다. 플레이어가 게임에 있을 때에만 나타납니다.

알림 전송 #

먼저, 서버 측 코드를 설정하여 알림을 전송합니다.

알림은 특정 이벤트 이전/이후에 발화되는 등록 후크와 연결할 수 있습니다. Nakama는 오류 발생을 감지하는 로직을 처리합니다.

예를 들어, 플레이어가 처음 친구를 추가할 때 보상을 제공하려고 하면 친구가 추가된 뒤에 실행되는 RegisterAfterAddFriends 후크를 사용할 수 있습니다:

quests.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
let afterAddFriendsFn: nkruntime.AfterHookFunction<void, nkruntime.AddFriendsRequest> = function(ctx: nkruntime.Context, logger: nkruntime.Logger, nk: nkruntime.Nakama, data: void, request: nkruntime.AddFriendsRequest) {
    let subject = JSON.stringify("A new friend!");
    let content = { reward: 1000 };
    let code = 1;
    let senderId = null; // Server sent
    let persistent = true;

    nk.notificationSend(ctx.userId, subject, content, code, senderId, persistent);
}

...
initializer.registerAfterAddFriends(afterAddFriendsFn); // Don't forget to register the hook!

여기서, 함수 notificationSend은(는) 새로운 친구가 추가될 때 사용자 ctx.userId에게 알림을 전달합니다. 이 함수에서는 다음을 수행할 수 있습니다:

  • Content 알림을 통해 전달하려고 하는 데이터가 사용자 지정 키 값 쌍을 포함하는 JSON 개체입니다.
  • code을(를) 사용하여 사용자 지정 알림 유형을 지정하고 0을(를) 초과하는 값이 표시됩니다. 코드 0 및 아래 항목은 시스템에 의해 예약됩니다.
  • 다른 플레이어에 의해 알림이 전송된 경우, senderId은(는) 알림을 전송한 사용자의 ID가 됩니다. 이 경우, 메시지는 서버에 의해 생성되었습니다. null
  • 알림에 persistent = true이(가) 포함되는 경우, 플레이어가 오프라인 상태인 경우에도 알림이 전송됩니다. 플레이어가 다시 게임에 참여할 경우, ListNotificationsAsync를 사용하여 대기 중인 알림 목록을 볼 수 있습니다.

알림 수신하기 #

이제 시스템을 통해서 알림을 전송할 수 있으니 클라이언트 측을 설정하겠습니다.

이 작업을 위해서 후크에 함수를 연결하는데, 알림이 도착하면 ReceivedNotification 후크를 적용합니다. 이 함수를 사용하여 서버에서 전송한 데이터를 처리합니다:

NotificationPopup.cs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public void Init(GameConnection connection) {
    connection.Socket.ReceivedNotification += NotificationReceived;
}

private class Reward {
    public int reward = 0;
}

private void NotificationReceived(IApiNotification notification) {
    if (notification.Code == 1) {
        Reward reward = JsonUtility.FromJson<Reward>(notification.Content);
        _titleText.text = notification.Subject;
        _descriptionText.text = "Received reward: " + reward.reward;
        ...
    }
}

여기서는 서버에서 notificationSend(으)로 입력한 모든 데이터를 포함하는 IApiNotification의 형태로 알림을 받습니다.

content이(가) JSON 개체이기 때문에 C# 개체로 언팩해야 합니다. 원하는 형식은 숫자를 포함하는 단일 키 reward이(가) 포함되는 개체이기 때문에 이 구조를 사용하여 클래스 Reward을(를) 생성하고, JsonUtility.FromJson을(를) 사용하여 Content(으)로 변환할 수 있습니다.

그런 다음, 원하는 주체와 설명을 지정하기 위해서 텍스트 개체 _titleText_descriptionText을(를) 설정합니다.

Related Pages