Unity 게임에 실시간 채팅을 추가하는 방법
Published: 2024-05-16 21:19:50

실시간 채팅 또는 게임 내 채팅은 플레이어의 참여도를 높이고 사용자 리텐션에 도움이 됩니다. 실시간 채팅은 플레이어가 서로 소통할 수 있도록 하여 공동체 의식을 고취하고 소셜 상호 작용을 위한 플랫폼을 제공하여 더욱 즐거운 게임 경험을 선사합니다.

실시간 채팅을 통합하는 것은 말처럼 쉬운 일은 아닙니다. 처음부터 시작하려면 플레이어 수가 늘어날 때 이를 구축, 유지, 확장하는 데 많은 리소스가 필요합니다. 다행히도 PubNub은 지연 시간이 짧은 실시간 API 플랫폼을 통해 그 어느 때보다 쉽게 Unity 게임에 실시간 기능을 도입할 수 있도록 지원합니다. 윈도우, 맥, iOS, 안드로이드, 오큘러스, 메타 퀘스트와 같은 가상 현실 시스템을 개발하거나 크로스 플랫폼으로 개발하는 경우 [Unity SDK를](https://www.pubnub.com/docs/sdks/unity?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 사용하면 됩니다.

다양한 채널 패턴을 설정하는 방법부터 메시지를 주고받는 방법, 모더레이션, 이모티콘, 리액션, GIF와 같은 다른 기능으로 게임 내 채팅을 강화/보안하는 방법까지 PubNub를 사용하여 Unity 비디오 게임에 실시간 채팅을 추가하는 방법에 대해 알아보세요.

PubNub 시작하기
-----------

게임 내 채팅을 설정하는 방법을 이해하려면 먼저 PubNub 플랫폼과 플랫폼의 기능을 활용하도록 애플리케이션을 구성하는 방법을 이해해야 합니다.

### 개요

PubNub는 Pub/Sub(게시/구독) 모델을 기반으로 합니다. 사용자는 기본적으로 모든 관련 정보가 포함된 페이로드인 메시지를 PubNub 네트워크에 [게시합니다](https://www.pubnub.com/docs/general/messages/publish?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko). 메시지를 받거나 듣기를 원하는 사용자는 PubNub 네트워크에 [가입하고](https://www.pubnub.com/docs/general/messages/receive?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 메시지를 파싱합니다. 메시지에는 32KB 미만(가급적 JSON 형식)인 경우 원하는 모든 내용을 포함할 수 있습니다.

메시지가 올바른 수신자에게 전달되도록 하기 위해 [채널은](https://www.pubnub.com/docs/general/channels/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 데이터가 한 디바이스에서 다른 디바이스로 전송되는 메커니즘으로 사용됩니다. 채널은 디바이스가 PubNub 네트워크에 메시지를 게시하고 구독하고자 할 때마다 필요합니다. 사용자는 한 번에 하나의 메시지만 게시할 수 있지만, 한 번에 여러 개의 채널을 구독하여 다양한 메시지를 수신할 수 있습니다.

메시지를 게시할 때 정확한 채널 이름을 지정해야 하지만, 채널 이름을 문자열 배열로 제공하여 하나 이상의 채널을 구독하는 [멀티플렉싱을](https://www.pubnub.com/docs/general/channels/subscribe#channel-multiplexing?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 통해 한 번에 여러 채널을 구독할 수 있습니다.

이 정보가 필요한 이유는 무엇인가요? 전체 게임 내 메시징 시스템은 채널이라는 개념을 기반으로 하며, _채널 패턴 이름을 어떻게 형식화하고 보호하는지에 따라 원하는 채팅 유형이 결정됩니다_.

### PubNub Unity SDK 설치 및 구성하기

시작하려면 애플리케이션을 PubNub 네트워크에 연결하기 위해 PubNub Unity SDK를 구성해야 합니다. 자세한 내용은 [Unity SDK 설명서를](https://www.pubnub.com/docs/sdks/unity?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 참조하시기 바라며, 개요적으로 다음과 같이 해야 합니다:

1.  [패키지 관리자를](https://www.pubnub.com/docs/sdks/unity#install-via-package-manager?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 통해 Unity 패키지를 추가합니다.
2.  [무료 PubNub 계정을](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 생성하고 PubNub 키를 받습니다. 애플리케이션에 필요한 기능을 키 세트에서 활성화하는 것이 중요합니다. 필수 Pub/Sub 기능의 경우 스트림 컨트롤러를 활성화하기만 하면 됩니다. 고급 기능을 위해 구성해야 할 다른 설정에 대해서는 나중에 설명해 드리겠습니다.
3.  이전 단계에서 얻은 퍼블리시 및 구독 키를 Unity에 제공하여 PubNub 게임 오브젝트를 [구성합니다](https://www.pubnub.com/docs/sdks/unity#configure-pubnub?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko). 또한 모든 PubNub 오브젝트는 PubNub에 대한 연결을 설정하기 위해 고유 식별자가 필요하므로 UserId를 제공해야 합니다. 설정이 완료되면 PubNub 오브젝트를 초기화합니다:

```js
using PubnubApi;
using PubnubApi.Unity;
…
PubNub pubnub = new Pubnub(pnConfiguration);
```

4.  게임이 이벤트와 메시지에 반응할 수 있도록 [이벤트 리스너를](https://www.pubnub.com/docs/sdks/unity#add-event-listeners?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 추가합니다. 각 유형의 메시지나 이벤트에 응답하는 사용자 지정 로직을 구현할 수 있는 다양한 이벤트 리스너가 있지만 채팅 메시지를 주고받는 핵심 기능에는 메시지 이벤트 리스너만 있으면 됩니다(이 가이드의 뒷부분에서 실시간 채팅에 추가 기능을 추가하여 더욱 매력적인 채팅을 만드는 방법에 대해 알아보겠습니다):

```js
var listener = new SubscribeCallbackListener();
pubnub.AddListener(listener);
listener.onMessage += OnPnMessage;
…
private void OnPnMessage(Pubnub pn, PNMessageResult<object> result) {
    Debug.Log($"Message received: {result.Message}");
}
```

다른 디바이스로 메시지를 보내기 위해 퍼블리싱을 시작하고 퍼블리셔로부터 메시지를 받기 위해 가입하려면 먼저 채널 이름을 정의해야 합니다. 채널 패턴의 형식에 따라 구현하려는 채팅 유형이 결정된다는 점을 기억하세요.

다양한 채팅 패턴 정의하기
--------------

게임에 어떤 유형의 채팅을 구현할지 고려해야 합니다. 이 섹션에서는 게임이나 사용자로부터 필요한 정보를 얻기 위한 전체 설정이 아니라 채널이 따라야 하는 패턴에 대해 설명합니다. PubNub를 사용하는 Unity 프로젝트의 다양한 채팅 패턴을 확인하려면 [Unity 쇼케이스 게임을](https://github.com/PubNubDevelopers/unity-multiplayer-shooter) 확인하세요.

### 전체/글로벌 채팅

전체 또는 글로벌 채팅을 사용하면 게임 내 모든 플레이어 간의 커뮤니케이션이 가능합니다. 모든 플레이어가 구독하는 공통 채널로 메시지를 게시하고 구독하여 일반 채팅을 설정할 수 있습니다. 글로벌 플레이어를 위한 채널 구조를 설정할 수 있습니다:

```js
string allChat = “global”;
```

그러면 각 클라이언트가 채널을 구독하고 모든 사람이 실시간으로 동일한 메시지를 수신하여 모두가 참여할 수 있는 공유 채팅 환경을 만들 수 있습니다.

### 비공개/귓속말 채팅

비공개 또는 귓속말 대화에서는 플레이어가 일대일 대화를 할 수 있으며, 관련된 두 명의 플레이어만 서로 대화할 수 있고 다른 사람은 대화할 수 없습니다. 비공개 또는 귓속말 대화 채널 패턴에서는 각 사용자가 비공개 대화를 위한 채널 구조에 가입하게 됩니다:

```js
string privateChatBase= “chat.private.*”;
```

여기에는 [와일드카드 구독이라는](https://www.pubnub.com/docs/general/channels/subscribe#wildcard-subscribe?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 개념이 사용됩니다. 이 기능은 하나의 이름 선언으로 많은 채널을 구독할 수 있는 계층적 채널 목록을 구독하는 데 사용할 수 있습니다.

예를 들어, 사용자가 다른 사용자에게 비공개로 메시지를 보내려고 할 때 PubNub 네트워크에서 사용자를 식별하는 고유 식별자를 나타내는 현재 PubNub 사용자 ID(또는 UUID/uuid)와 메시지를 받을 수신자의 사용자 ID를 연결할 수 있습니다. 현재 사용자의 사용자 아이디는 언제든지 pubnub.GetCurrentUserId()를 통해 얻을 수 있지만, 의도한 수신자의 사용자 아이디를 얻어야 합니다. 수신자의 User ID가 있으면 다음과 같이 채널을 연결할 수 있습니다:

```js
string privateChatMessage = “chat.private.user-a-uuid&user-b-uuid”;
```

chat.private.\*와 같은 와일드카드 채널 패턴을 지정하면 앱에서 해당 패턴과 일치하는 모든 채널 이름을 구독하게 됩니다. 이렇게 하면 런타임에 항상 채널 이름을 알 필요가 없습니다. 마지막으로 사용자 ID를 사용하면 채널 이름이 고유하고 두 사용자 간에 대화가 유지되도록 할 수 있습니다.

### 친구/버디 채팅

친구 또는 버디 채팅을 생성하면 새로 만난 플레이어든 게임 외부의 친구든 친밀한 관계를 형성하고자 하는 특정 플레이어와 비공개로 대화할 수 있습니다.

친구/친구 채팅 패턴에서는 사용자 ID를 추가하여 비공개 채팅 채널 패턴을 구성하는 방법과 유사하게 각 기기 또는 플레이어에 고유한 채널 패턴을 만들어야 합니다:

```js
string chanFriendChat = "chat.friends.” + pubnub.GetCurrentUserId();”
```

그런 다음 친구가 되고자 하는 모든 사용자에 대해 이 과정을 반복하여 chanFriendChat 문자열의 사용자 ID를 pubnub.GetCurrentUserId()의 사용자 ID로 대체합니다. 이제 채널 패턴이 마련되었지만 채팅.friends.\*와 같은 와일드카드 패턴을 사용하여 단순히 구독할 수는 없으며, 대신 어떤 플레이어가 친구인지 확인할 수 있는 메커니즘이 필요합니다.

이 문제에 대한 해결책으로 많은 수의 채널을 한 번에 관리할 수 있는 PubNub의 [채널 그룹이](https://www.pubnub.com/docs/general/channels/subscribe#channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 있습니다. 채널 그룹은 기본적으로 채널 목록에 대한 포인터이며, 이 경우 채널 그룹은 플레이어에게 고유하며 플레이어의 모든 친구에 대한 참조를 포함합니다:

```js
string chanGroupFriendChat = "chanGroupFriendChat_" + pubnub.GetCurrentUserId();
```

참고: 채널 그룹 이름은 채널 이름과 동일한 규칙을 따르지만 이름에 [마침표를 포함할 수 없으므로](https://www.pubnub.com/docs/general/channels/subscribe#channel-group-names?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 패턴 구조에 차이가 있습니다.

pubnub 객체를 사용하여 채널을 구독하는 방법(다음 섹션에서 설명)과 유사하게 채널 그룹도 동시에 구독할 수 있습니다. 즉, 플레이어가 친구 채널 그룹에 가입되어 있으므로 새 친구가 추가될 때마다 해당 친구의 chanFriendChat이 플레이어의 친구 채널 그룹에 추가되고 해당 채널이 메시지를 게시할 때마다 메시지 이벤트 리스너에서 메시지를 수신하게 됩니다. 채널 그룹에 게시할 수는 없지만 채널 그룹 내의 제휴 채널에 메시지를 게시하면 모든 구독자(친구)가 해당 메시지를 받을 수 있습니다.

[PubNub Unity SDK용 채널 그룹 API를](https://www.pubnub.com/docs/sdks/unity/api-reference/channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 사용하면 권한이 있는 채널 그룹에서 친구/채널을 추가, 나열 및 제거할 수 있습니다. 채널 그룹 기능은 친구의 온라인/오프라인 상태(프레즌스)를 결정하는 데도 사용됩니다. 이에 대해서는 [Unity에서 친구 목록을 추가하는 방법 가이드에서](https://www.pubnub.com/how-to/add-friend-list-to-your-unity-game/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 자세히 설명합니다.

### 길드/동맹/클랜 채팅

길드, 동맹 또는 클랜이 등장하는 게임에서 전용 채팅 환경은 팀 협력과 동료애에 큰 도움이 될 수 있습니다. 이러한 스타일의 그룹 채팅은 여러 사용자 간의 커뮤니케이션을 가능하게 하여 친구뿐만 아니라 더 많은 수의 플레이어 간의 협업과 팀워크를 촉진합니다. 길드/동맹/클랜 채팅을 통해 같은 그룹의 구성원들은 전략을 계획하고, 업적을 공유하거나, 게임 내에서 보다 개인적인 커뮤니티를 형성하기 위해 유대감을 형성할 수 있습니다.

PubNub에서 이를 설정하는 것은 친구/버디 채팅을 구현하는 것과 같은 개념입니다. 각 유형별로 채널 그룹을 구성하고, 이러한 채널 그룹에 가입하고, 승인되면 이러한 채널 그룹에 친구를 추가하면 됩니다. 이러한 채널 그룹과 연결된 채널에 게시된 모든 메시지는 이벤트 수신자를 트리거하고 채팅을 적절하게 표시할 수 있습니다.

각 플레이어의 채널 그룹은 대규모 온라인 게임에서 가장 큰 길드도 충분히 [관리할](https://www.pubnub.com/docs/general/channels/subscribe#channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 수 있는 [2000개의 채널](https://www.pubnub.com/docs/general/channels/subscribe#channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) (이 경우 플레이어)을 [관리할](https://www.pubnub.com/docs/general/channels/subscribe#channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 수 있으므로 채널 그룹은 대규모 그룹을 관리할 수 있는 좋은 방법입니다. 더 좋은 점은 PubNub 네트워크에 연결된 모든 개별 클라이언트가 10개의 채널 그룹을 가질 수 있어, 필요한 경우 20,000개의 채널을 구독할 수 있다는 것입니다.

### 파티/로비 채팅

파티 또는 로비 채팅은 특정 게임 세션이나 미션을 위해 구성된 소규모의 임시 그룹을 위한 채팅입니다. 이러한 스타일의 채팅은 서로 다른 목적을 위한 것이지만, 구현 방식은 비공개/귓속말 채팅 채널 패턴을 만드는 패턴과 유사합니다.

먼저, 각 그룹 채팅 유형에 대한 기본 문자열을 만듭니다. 채널 배열을 구독할 때(다음 단계에서 설명) 와일드카드 구독을 사용하여 구독하여 모든 요청을 수신 대기합니다:

```js
string chanChatParty = “chat.party.” + “*”;
string chanChatLobby= “chat.lobby.” + “*”;
```

로비 또는 파티가 형성되면, 그룹을 시작한 사람이나 인터넷 연결 및 지역에 따라 결정된 플레이어가 그룹의 리더 또는 소유자로 지정됩니다. 이러한 유형의 플레이어를 파티 리더 또는 호스트라고 합니다. 그런 다음 호스트 플레이어의 사용자 ID를 기본 문자열과 연결하여 고유한 채널 패턴을 만듭니다. 파티나 로비에 초대를 받은 새로운 플레이어는 이 채널에 동적으로 가입하게 되어 사실상 그룹에 가입하게 됩니다. 파티나 로비가 종료되거나 해산되면 채널은 삭제할 수 있습니다.

모든 것 정리하기
---------

채널 패턴에 따라 게임에 구현할 채팅 유형을 결정했으면, 이제 이러한 채널을 게시하고 구독하여 실시간으로 메시지를 주고받을 차례입니다.

### 메시지 게시

이 과정은 메시지 페이로드를 만드는 것으로 시작됩니다. 이는 Unity 게임의 요구 사항에 따라 간단한 텍스트 채팅일 수도 있고 복잡한 데이터 구조일 수도 있습니다. 페이로드가 준비되면 메시지를 게시할 차례입니다.

퍼블리시 [API는](https://www.pubnub.com/docs/sdks/unity/api-reference/publish-and-subscribe#publish?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 지정된 채팅 채널의 모든 구독자에게 메시지를 보내는 데 사용됩니다. 한 번에 하나의 채널에만 게시할 수 있지만 게시가 비동기적으로 수행되므로 나머지 코드가 실행되는 것을 차단하지 않습니다(원하는 경우 동기식으로 게시할 수도 있지만).

예를 들어, 파티에 채팅 메시지를 보내려면 다음과 같이 호출하여 게시할 뿐만 아니라 PubNub 호출이 성공적으로 이루어졌는지 확인하고 호출이 실패하면 처리할 수 있습니다:

```js
PNResult<PNPublishResult> publishResponse = await pubnub.Publish()
  .Message(“Ready to go!”)
  .Channel(chanChatParty )
  .ExecuteAsync();
PNPublishResult publishResult = publishResponse.Result;
PNStatus status = publishResponse.Status;
Debug.Log("pub timetoken: " + publishResult.Timetoken.ToString());
Debug.Log("pub status code : " + status.StatusCode.ToString());
```

### 메시지 구독

메시지가 게시될 때 수신되는 메시지와 이벤트를 수신하려면 적절한 채널을 [구독해야](https://www.pubnub.com/docs/sdks/unity/api-reference/publish-and-subscribe#receive-messages?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 합니다. 한 번의 통화로 여러 개의 채팅 채널과 채널 그룹을 구독할 수 있습니다:

```js
pubnub.Subscribe<string>()
  .Channels(new List<string>() {
    chanChatAll,
    chanPrivateChat,
    chanChatParty + "*",
    chanChatLobby + "*"               
})
  .ChannelGroups(new List<string>() {
    chanFriendGroupChat + userId,
    chanGuildGroupChat + userId,
    chanAllianceGroupChat + userId
})
.Execute();
```

이제 플레이어가 PubNub 네트워크에 연결되고 [이벤트 리스너는](https://www.pubnub.com/docs/sdks/unity#add-event-listeners?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 이벤트 발생(이 경우 새 메시지 도착)을 기다린 다음 해당 이벤트와 관련된 코드를 실행합니다.

메시지가 도착하면 리스너는 콜백을 트리거하여 수신 메시지를 처리하기 위해 작성한 코드를 실행합니다. 이는 채팅방에 메시지를 표시하는 것처럼 간단할 수도 있고, 채팅 메시지를 기반으로 게임 내 이벤트를 트리거하는 것처럼 더 복잡한 것일 수도 있습니다.

게임 내 채팅을 더욱 매력적으로 만드는 고급 기능
---------------------------

플레이어가 실시간으로 메시지를 주고받을 수 있는 인게임 채팅을 Unity 게임에 성공적으로 구현했습니다! 이미 플레이어가 서로 소통할 수 있는 공간이 만들어졌지만, 구현된 기능은 빙산의 일각에 불과합니다. 플레이어의 게임 내 채팅 참여도를 높이기 위해 구현을 고려해야 할 기능이 많이 있습니다.

### 메시지 기록 로드: 메시지 지속성

게임에서 플레이어는 이전 대화를 다시 확인하거나 놓친 채팅을 따라잡아야 할 수 있습니다. 이때 채팅 메시지 기록을 저장하고 검색할 수 있는 [메시지 지속](https://www.pubnub.com/docs/general/storage?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 성이 유용합니다. Unity 게임에서 메시지 지속성 API를 구현하면 채팅 메시지, 메시지 액션, 파일을 저장하고 필요할 때 검색할 수 있습니다:

```js
PNResult<PNFetchHistoryResult> fetchHistoryResponse = await pubnub.FetchHistory()
  .Channels(new string[] { chanPrivateChat })
  .IncludeMeta(true)
  .MaximumPerChannel(25)
  .ExecuteAsync();
```

또한 메시지 저장 기간을 유연하게 제어할 수 있어 게임의 특정 요구 사항과 리소스에 따라 스토리지를 관리할 수 있습니다. 메시지 지속성을 사용하려면 [관리자 포털에서](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 키에 이 기능을 활성화해야 합니다. [메시지 지속성 사용 방법 가이드를](https://www.pubnub.com/how-to/admin-portal-persistence/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 통해 이 기능에 대해 자세히 알아보고 활성화하는 방법을 확인할 수 있습니다.

### 플레이어에게 부재중 메시지 알림 모바일 푸시 알림

모바일 게임의 경우 플레이어가 앱에 들락날락하는 경우가 많아 팀에서 보내는 중요한 메시지나 게임 업데이트를 놓칠 수 있습니다. 이때 [모바일 푸시 알림이](https://www.pubnub.com/docs/general/push/send?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 유용합니다. 모바일 푸시 알림은 플레이어가 게임에 접속하지 않을 때에도 놓친 채팅 메시지, 게임 업데이트 또는 기타 중요한 알림을 알려줄 수 있는 방법을 제공합니다.

[모바일 푸시 알림 API를](https://www.pubnub.com/docs/sdks/unity/api-reference/mobile-push?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 사용하면 iOS와 Android 기기 모두에 푸시 알림을 보낼 수 있는 통합 API를 제공합니다. 따라서 프로세스가 간소화되고 플랫폼에 관계없이 한 번의 API 호출로 모든 기기에 알림을 보낼 수 있습니다. 개별 게이머에게 개인화된 알림을 보내거나 모든 플레이어에게 메시지를 브로드캐스트하는 등 푸시 알림을 사용자 지정할 수도 있습니다. 이러한 유연성을 통해 플레이어와 효과적으로 소통하여 플레이어의 참여와 정보를 유지할 수 있습니다.

펍넙에서 모바일 푸시 알림을 활용하려면 [관리자 포털의](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) [방법 가이드를](https://www.pubnub.com/how-to/push-notifications/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 따라 모바일 푸시 알림을 활성화해야 합니다. 또한 [FCM](https://www.pubnub.com/how-to/admin-portal-push-notifications-android/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 및 [APN](https://www.pubnub.com/how-to/admin-portal-push-notifications-apns/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 모바일 푸시 알림에 대한 보다 구체적이고 자세한 가이드도 마련되어 있습니다.

### 문자 그 이상: 이모티콘

이모티콘은 디지털 커뮤니케이션에서 보편적인 감정의 언어 역할을 합니다. 이모티콘은 플레이어가 자신의 감정과 반응을 재미있고 다채로운 방식으로 표현할 수 있게 해주며, 채팅을 더욱 상호작용적이고 매력적으로 만들어줍니다.

펍넙을 사용하면 플레이어가 메시지 대신 [시그널을](https://www.pubnub.com/docs/general/messages/publish#send-signals?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 게시하도록 하여 Unity 게임에서 이모티콘 지원을 쉽게 구현할 수 있습니다. 시그널은 메시지보다 훨씬 빠르고 저렴하기 때문에 작은 비트의 데이터를 전송하는 데 사용됩니다. 이모티콘은 일반적으로 데이터 크기가 매우 작기 때문에 데이터를 빠르게 전송하기에 완벽한 방법입니다.

[PubNub의 시그널 API를](https://www.pubnub.com/docs/sdks/unity/api-reference/publish-and-subscribe#signal?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 사용하여 지정된 채팅에 이모지를 게시할 수 있습니다. 예를 들어, 플레이어가 글로벌 채팅에 손을 흔드는 이모티콘을 보내고 싶다면, 보내기를 누르면 다음 코드가 실행됩니다:

```js
Dictionary<string, string> myMessage = new Dictionary<string, string>();
myMessage.Add("emoji", ":wave:");
pubnub.Signal()
  .Message(myMessage)
  .Channel("global")
  .Execute((result, status) => {
    if (status.Error) {
      Debug.Log(status.ErrorData.Information);
    } else {
      Debug.Log(result.Timetoken);
    }
  });
```

수신하려는 플레이어가 지정된 채널을 구독하는 경우 신호를 받게 됩니다. 이 경우 글로벌 채널용이기 때문에 모든 사람이 이모티콘을 받게 됩니다. 신호를 수신하려면 수신자 이벤트를 구독하세요:

```js
listener.onSignal += OnPnSignal;
private void OnPnSignal(Pubnub pn, PNSignalResult<object> result) {
    // Handle the emoji by looking up the value and displaying the result.
}
```

이모티콘의 값이 Unity에 정의된 실제 이모티콘을 나타내는지 확인해야 합니다. 이러한 이모티콘은 [앱 컨텍스트](https://www.pubnub.com/docs/sdks/unity/api-reference/objects?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) (이전의 오브젝트)를 통해 PubNub 네트워크에 저장하고 검색할 수 있으므로 플레이어가 액세스할 수 있는 모든 이모티콘을 서버리스 스토리지에서 검색할 수 있습니다. Unity 게임에서 앱 컨텍스트를 구현하는 방법에 대한 자세한 내용은 사용법 가이드를 참조하세요.

### 메시지 응답: 메시지 반응

좋아요, 하트, 엄지 척, 스티커, 커스텀 게임별 반응과 같은[메시지 반응](https://www.pubnub.com/docs/sdks/unity/api-reference/message-actions?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko)은 플레이어가 채팅 메시지에 빠르고 쉽게 응답할 수 있는 방법을 제공합니다. 채팅에 상호작용을 추가할 뿐만 아니라 플레이어가 서로의 메시지를 인정하고 참여할 수 있도록 함으로써 커뮤니티 의식을 고취할 수 있습니다.

PubNub의 [메시지 액션 API를](https://www.pubnub.com/docs/sdks/unity/api-reference/message-actions?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 사용하여 반응 및 읽음 확인과 같은 기능을 구축하거나 사용자 지정 메타데이터를 메시지에 연결할 수 있습니다. Discord와 같은 채팅 애플리케이션에서 서버마다 서로 다른 리액션과 이모티콘을 사용하는 것과 마찬가지로, 채팅 유형도 서로 다를 수 있습니다. 채팅이 로드될 때 다음 호출을 사용하여 지정된 채팅 채널에 대해 사용 가능한 메시지 리액션을 검색할 수 있습니다:

```js
pubnub.GetMessageActions()
  .Channel(chanChatLobby)
  .Execute(new PNGetMessageActionsResult((result, status) => 
  {
    //result is of type PNGetMessageActionsResult.
  }));
```

플레이어가 메시지에 리액션으로 응답하려고 할 때, 게시된 메시지에 메시지 리액션을 추가하면 됩니다:

```js
pubnub.AddMessageAction()
  .Channel(chanChatLobby)
  .MessageTimetoken(5610547826969050)
  .Action(new PNMessageAction { Type = "reaction", Value = "smiley_face" })
  .Execute(new PNAddMessageActionResult((result, status) =>
  {
    //result is of type PNAddMessageActionResult.
  }));
```

PubNub은 시간 토큰을 사용하여 메시지가 네트워크에 게시된 시점을 정확하게 추적합니다. 메시지를 수신하면 소요된 시간도 페이로드에 포함됩니다. 그런 다음 메시지에 반응할 수 있도록 MessageTimetoken() 인수에 적절한 시간 토큰 값을 제공할 수 있습니다.

반응을 수신하고 원래 메시지를 보낸 플레이어에게 알리려면 리스너를 추가하고 OnPNMessageAction 메서드에서 반응을 처리해야 합니다:

```js
listener.onMessageAction += OnPnMessageAction;
…
private void OnPnMessageAction(Pubnub pn, PNMessageActionEventResult result) {
   //Handle Message Reaction
}
```

이모티콘과 마찬가지로 [앱 컨텍스트를](https://www.pubnub.com/docs/sdks/unity/api-reference/objects?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 사용하여 이러한 반응이 게임에서 시각적으로 어떻게 표시되는지 검색하고 저장할 수 있습니다. 메시지 반응을 사용하려면 [관리자 포털에서](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 키에 [메시지 지속성이](https://www.pubnub.com/how-to/admin-portal-persistence/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 활성화되어 있는지 확인해야 합니다.

### GIF 및 기타 멀티미디어

채팅 경험을 향상시키는 또 다른 중요한 기능은 멀티미디어 파일 공유입니다. GIF, 재미있는 순간을 담은 스크린샷, 게임 리소스 공유 등 파일 공유는 게임에 또 다른 차원의 상호작용을 제공합니다.

이러한 유형의 멀티미디어 파일을 구현하는 데는 [PubNub 파일 공유 API가](https://www.pubnub.com/docs/sdks/unity/api-reference/files?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 사용됩니다. 이 기능을 사용하면 플레이어는 액세스 권한이 있는 파일을 업로드, 다운로드, 삭제할 수 있습니다. 파일을 전송하려면 다음 호출을 수행하면 됩니다:

```js
PNResult<PNFileUploadResult> fileUploadResponse = await pubnub.SendFile()
  .Channel(string chanFriendChatSamantha)
  .File("cat_picture.jpg") //checks the bin folder if no path is provided
  .Message("Look at this photo!")
  .ExecuteAsync();
PNFileUploadResult fileUploadResult = fileUploadResponse.Result;
PNStatus fileUploadStatus = fileUploadResponse.Status;
if (!fileUploadStatus.Error && fileUploadResult != null)
{
  Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileUploadResult));
}
else
{
  // Handle File Upload Error.
}
```

구독자가 파일을 수신할 수 있도록 이벤트 리스너를 추가하고 OnPNFile 메서드에서 파일을 표시하는 방법을 처리해야 합니다:

```js
listener.onFile += OnPnFile;
…
private void OnPnFile(Pubnub pn, PNFileEventResult result) {
    //Handle how to display the file received
}
```

또한 다른 채팅 채널과 관련된 모든 파일을 가져오고, 정보를 나열하고, 삭제할 수도 있습니다. 관리자 포털에서 파일 공유 기능과 메시지 지속성을 사용 설정했는지 확인해야 합니다. [파일 사용 설정 방법 가이드에서](https://www.pubnub.com/how-to/admin-portal-enabling-files/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 자세한 방법을 알아볼 수 있습니다.

### 채팅 채널 보안 설정하기: 액세스 관리자

모든 게임 환경에서는 채팅 채널의 보안을 유지하는 것이 가장 중요합니다. 원치 않는 메시지로부터 플레이어를 보호하든, 민감한 전략적 토론을 보호하든, Unity 게임의 채팅 시스템은 보안을 염두에 두고 설계해야 합니다.

이때 PubNub의 [Access Manager가](https://www.pubnub.com/docs/sdks/unity/api-reference/access-manager?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 유용합니다. 이 솔루션은 채팅 채널 보안을 위한 강력하고 유연한 프레임워크를 제공합니다. 액세스 관리자를 사용하면 각 채널을 게시하거나 구독할 수 있는 사용자를 제어하여 Unity 게임의 채팅 시스템에 보안을 한층 더 강화할 수 있습니다.

액세스 관리자를 사용하면 사용자 수준, 채널 수준 또는 개별 키 수준에서 권한을 부여할 수 있습니다. 사용자가 채널을 읽고, 쓰고, 관리할 수 있는지 여부를 지정할 수 있으며, 이러한 권한은 게임의 필요에 따라 동적으로 업데이트할 수 있습니다. 예를 들어 두 플레이어 간의 비공개 채팅에서는 해당 두 플레이어에게만 비공개 채널에 대한 읽기 및 쓰기 권한을 부여할 수 있습니다. 마찬가지로, 길드 채팅에서는 모든 길드원에게 읽기 및 쓰기 권한을 부여하고 길드장에게만 관리 권한을 부여할 수 있습니다.

또한 액세스 관리자는 토큰 기반 인증을 지원하므로 사용자를 안전하게 인증하고 적절한 권한을 부여할 수 있습니다. 이렇게 하면 권한이 있는 플레이어만 게임 채팅 채널에 액세스할 수 있으므로 잠재적인 위협으로부터 게임 커뮤니티를 보호할 수 있습니다.

이 기능을 사용하려면 [관리자 포털에서](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 액세스 관리자를 활성화해야 합니다. 이 추가 기능 활성화에 대한 [지원 페이지에서](https://support.pubnub.com/hc/en-us/articles/360051974791-How-do-I-enable-add-on-features-for-my-keys-?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 자세한 방법을 확인할 수 있습니다.

다음 단계
-----

이 사용법 가이드를 통해 Unity 게임에 강력한 실시간 채팅 시스템을 추가하는 방법을 배웠습니다. 환경에서 PubNub 오브젝트를 초기화하는 방법부터 다양한 채팅 유형을 나타내는 채팅 패턴을 설정한 다음 메시지를 보내고 받는 방법까지 모든 것을 설명했습니다. 이모티콘, 메시지 반응, 파일 공유와 같은 고급 기능을 구현하는 방법과 메시지 지속성, 모바일 푸시 알림, 채널 보안 등 좋은 채팅 시스템의 중요한 측면에 대해서도 배웠습니다.

첫 게임을 개발하는 인디 개발자이든 멀티플레이어 게임을 개선하려는 노련한 개발자이든, PubNub의 실시간 기능은 게임 내 채팅을 지원하는 인프라 역할을 할 수 있으므로 가장 중요한 것에 집중할 수 있습니다.

다음 리소스를 통해 자세히 알아보세요:

-   [유니티 문서를](https://www.pubnub.com/docs/sdks/unity?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 읽고 게임에 실시간 채팅을 추가하는 데 필요한 모든 정보를 알아보세요.
-   유니티 가이드를 통해 [친구 목록을](https://www.pubnub.com/how-to/add-friend-list-to-your-unity-game/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ko) 추가하는 방법을 알아보세요.
-   [유니티 쇼케이스 게임에서](https://github.com/PubNubDevelopers/unity-multiplayer-shooter) 채팅 패턴을 활용하여 채팅방 등을 관리하는 방법을 알아보세요.
-   [Unity SDK 소스 코드를](https://github.com/pubnub/unity) 살펴보세요.

궁금한 점이 있으면 언제든지 개발자 지원팀( [devrel@pubnub.com](mailto:devrel@pubnub.com) )으로 문의하세요.