Jak dodać czat w czasie rzeczywistym do gry Unity
Published: 2024-05-16 21:08:11

Czat w czasie rzeczywistym lub czat w grze zwiększa zaangażowanie graczy i pomaga im pozostać w grze. Czat w czasie rzeczywistym pozwala graczom komunikować się ze sobą, wspierając poczucie wspólnoty i zapewniając platformę do interakcji społecznych, które sprawiają, że gra jest przyjemniejsza.

Włączenie czatu w czasie rzeczywistym jest łatwiejsze do powiedzenia niż do zrobienia. Aby zacząć od zera, potrzeba wielu zasobów do zbudowania, utrzymania i skalowania wraz ze wzrostem liczby graczy. Na szczęście PubNub sprawił, że wprowadzanie funkcji czasu rzeczywistego do gier Unity jest łatwiejsze niż kiedykolwiek dzięki naszej platformie API czasu rzeczywistego o niskim opóźnieniu. Niezależnie od tego, czy tworzysz gry dla systemów Windows, Mac, iOS, Android, systemów rzeczywistości wirtualnej, takich jak Oculus i Meta Quest, czy też korzystasz z wielu platform, nasz [pakiet Unity SDK](https://www.pubnub.com/docs/sdks/unity?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) jest dla Ciebie.

Czytaj dalej, aby dowiedzieć się, jak dodać czat w czasie rzeczywistym do swojej gry wideo Unity za pomocą PubNub, zaczynając od zrozumienia, jak skonfigurować różne wzorce kanałów, nauczyć się wysyłać / odbierać wiadomości, a następnie ulepszyć / zabezpieczyć czat w grze za pomocą innych funkcji, takich jak moderacja, emotikony, reakcje i GIF-y.

Pierwsze kroki z PubNub
-----------------------

Zanim zaczniesz rozumieć, jak skonfigurować czat w grze, musisz zrozumieć platformę PubNub i jak skonfigurować aplikację, aby korzystać z jej funkcji.

### Przegląd

PubNub opiera się na modelu Pub/Sub (publikuj/subskrybuj). Użytkownik [publikuje](https://www.pubnub.com/docs/general/messages/publish?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) wiadomość, która jest zasadniczo ładunkiem zawierającym wszystkie istotne informacje, w sieci PubNub. Użytkownicy, którzy chcą odebrać lub odsłuchać wiadomość, [subskrybują](https://www.pubnub.com/docs/general/messages/receive?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) sieć PubNub i analizują wiadomość. Wiadomość może zawierać wszystko, co chcesz, o ile ma mniej niż 32 KB (i najlepiej w formacie JSON).

Aby zapewnić, że wiadomość dotrze do właściwych odbiorców, [kanały](https://www.pubnub.com/docs/general/channels/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) są używane jako mechanizm, za pośrednictwem którego dane są przesyłane z jednego urządzenia do drugiego. Kanały są wymagane za każdym razem, gdy urządzenie chce publikować i subskrybować sieć PubNub. Podczas gdy użytkownik może publikować tylko jedną wiadomość na raz, użytkownik może subskrybować wiele różnych kanałów na raz, nasłuchując różnych wiadomości.

Podczas gdy podczas publikowania wiadomości należy określić dokładną nazwę kanału, można subskrybować wiele kanałów jednocześnie za pomocą [multipleksowania](https://www.pubnub.com/docs/general/channels/subscribe#channel-multiplexing?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), czyli subskrybowania jednego lub więcej kanałów poprzez podanie nazw kanałów jako tablicy ciągów znaków.

Dlaczego te informacje są niezbędne? Cały system przesyłania wiadomości w grze będzie opierał się na koncepcji kanałów: _sposób formatowania i zabezpieczania nazwy wzorca kanału określa rodzaj cz_atu.

### Instalacja i konfiguracja PubNub Unity SDK

Aby rozpocząć, musisz skonfigurować PubNub Unity SDK, aby połączyć swoją aplikację z siecią PubNub. Aby uzyskać szczegółowe informacje, zapoznaj się z [dokumentacją](https://www.pubnub.com/docs/sdks/unity?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) Unity SDK, ale jako przegląd, będziesz musiał:

1.  Dodać pakiet Unity za pośrednictwem [Menedżera pakietów](https://www.pubnub.com/docs/sdks/unity#install-via-package-manager?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl).
2.  Utworzyć [bezpłatne konto PubNub](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) i uzyskać klucze PubNub. Ważne jest, aby włączyć funkcje w zestawie kluczy, których potrzebuje aplikacja - w przypadku podstawowych funkcji Pub/Sub wystarczy włączyć Stream Controller. Z pewnością omówimy wszelkie inne ustawienia, które mogą być potrzebne do skonfigurowania zaawansowanych funkcji.
3.  Przekaż Unity klucze publikowania i subskrybowania uzyskane w poprzednim kroku, aby [skonfigurować](https://www.pubnub.com/docs/sdks/unity#configure-pubnub?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) obiekt PubNub GameObject. Powinieneś również podać UserId, ponieważ każdy obiekt PubNub wymaga unikalnego identyfikatora w celu nawiązania połączenia z PubNub. Gdy to zrobisz, zainicjalizuj obiekt PubNub:

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

4.  Dodaj [detektory](https://www.pubnub.com/docs/sdks/unity#add-event-listeners?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) zdarzeń dla swojej gry, aby reagować na zdarzenia i wiadomości. Istnieją różne detektory zdarzeń, aby móc zaimplementować niestandardową logikę reagowania na każdy rodzaj wiadomości lub zdarzenia, ale do podstawowej funkcjonalności wymiany wiadomości na czacie potrzebny będzie po prostu detektor zdarzeń wiadomości (w dalszej części tego przewodnika dowiesz się, jak dodać dodatkowe funkcje do czatu w czasie rzeczywistym, aby uczynić go bardziej angażującym):

```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}");
}
```

Zanim zaczniesz publikować, aby wysyłać wiadomości do innych urządzeń i subskrybować, aby otrzymywać wiadomości od wydawców, musisz zdefiniować nazwę swojego kanału. Pamiętaj: sposób formatowania wzorca kanału określa typ czatu, który chcesz wdrożyć.

Definiowanie różnych wzorców czatu
----------------------------------

Musisz rozważyć, jakie typy czatu będziesz musiał zaimplementować w swojej grze. Ta sekcja ma na celu omówienie wzorca kanału, a nie całej konfiguracji uzyskiwania wymaganych informacji z gry lub użytkowników. Jeśli chcesz zobaczyć różne wzorce czatu w projekcie Unity wykorzystującym PubNub, sprawdź naszą [grę pokazową Unity](https://github.com/PubNubDevelopers/unity-multiplayer-shooter).

### Czat ogólny/globalny

Czat ogólny lub globalny umożliwia komunikację między wszystkimi graczami w grze. Możesz skonfigurować ogólny czat, publikując i subskrybując wiadomości za pomocą wspólnego kanału, który subskrybują wszyscy gracze. Można skonfigurować strukturę kanałów dla graczy globalnych:

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

Każdy klient będzie wtedy subskrybował kanał i zapewni, że wszyscy otrzymają te same wiadomości w czasie rzeczywistym, tworząc wspólny czat, którego każdy może być częścią.

### Czat prywatny/szeptany

Czat prywatny lub szeptany pozwala graczom na prowadzenie rozmów jeden na jednego, w których tylko dwaj zaangażowani gracze mogą ze sobą rozmawiać i nikt inny. We wzorcu kanału czatu prywatnego lub szeptanego każdy użytkownik subskrybuje strukturę kanału przeznaczoną do rozmów prywatnych:

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

Wykorzystuje to koncepcję [Wildcard Subscribe](https://www.pubnub.com/docs/general/channels/subscribe#wildcard-subscribe?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl). Ta funkcja może być używana do subskrybowania hierarchicznej listy kanałów, gdzie można subskrybować wiele kanałów za pomocą pojedynczej deklaracji nazwy.

Na przykład, gdy użytkownik ma zamiar wysłać prywatną wiadomość do innego użytkownika, należy połączyć bieżący identyfikator użytkownika PubNub (lub UUID/uuid), który reprezentuje unikalny identyfikator identyfikujący użytkownika w sieci PubNub i identyfikator użytkownika zamierzonego odbiorcy wiadomości. Chociaż zawsze można uzyskać identyfikator użytkownika dla bieżącego użytkownika (poprzez pubnub.GetCurrentUserId()), należy uzyskać identyfikator użytkownika zamierzonego odbiorcy. Po uzyskaniu identyfikatora użytkownika odbiorcy można połączyć kanał w następujący sposób:

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

Ponieważ określono wieloznaczny wzorzec kanału, taki jak chat.private.\*, aplikacja zasubskrybuje wszystkie nazwy kanałów pasujące do tego wzorca. Dzięki temu nie trzeba zawsze znać nazwy kanału w czasie działania aplikacji. Wreszcie, użycie identyfikatorów użytkowników gwarantuje, że nazwa kanału będzie unikalna, a rozmowa pozostanie między dwoma użytkownikami.

### Czat znajomy/kolega

Utworzenie czatu Friend lub Buddy pozwala graczom na prywatną komunikację z konkretnymi graczami, z którymi chcą nawiązać bliższą więź, niezależnie od tego, czy są to nowo poznani gracze, czy znajomi spoza gry.

We wzorcu czatu przyjaciel/kumpel należy utworzyć wzorzec kanału, który jest unikalny dla każdego urządzenia lub gracza, podobnie jak w przypadku tworzenia wzorca kanału czatu prywatnego poprzez dołączenie identyfikatora użytkownika:

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

Następnie powtórz tę czynność dla każdego użytkownika, z którym chcesz się zaprzyjaźnić - zastąp ich identyfikatory użytkownika w łańcuchu chanFriendChat identyfikatorem pubnub.GetCurrentUserId(). Chociaż masz już gotowy wzorzec kanału, nie możesz po prostu zasubskrybować go za pomocą wzorca wieloznacznego, takiego jak chat.friends.\*; zamiast tego będziesz potrzebować mechanizmu określającego, którzy gracze są przyjaciółmi.

Rozwiązaniem tego problemu są [grupy kanałów](https://www.pubnub.com/docs/general/channels/subscribe#channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) PubNub, które pozwalają zarządzać dużą liczbą kanałów jednocześnie. Grupy kanałów są zasadniczo wskaźnikiem do listy kanałów; w tym przypadku grupa kanałów jest unikalna dla gracza i będzie zawierać odniesienie do wszystkich znajomych gracza:

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

Uwaga: Nazwy grup kanałów są zgodne z tymi samymi konwencjami, co nazwy kanałów, ale [nie mogą zawierać kropek](https://www.pubnub.com/docs/general/channels/subscribe#channel-group-names?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) w nazwie, stąd różnica w strukturze wzorca.

Podobnie jak w przypadku subskrybowania kanałów za pomocą obiektu pubnub (wyjaśnione w następnej sekcji), można również subskrybować grupy kanałów w tym samym czasie. Oznacza to, że skoro gracz jest subskrybowany do grupy kanałów swoich znajomych, to za każdym razem, gdy dodawany jest nowy znajomy, chanFriendChat tego znajomego jest dodawany do grupy kanałów znajomych gracza i będzie otrzymywał wiadomości w detektorze zdarzeń Message za każdym razem, gdy którykolwiek z tych kanałów opublikuje wiadomość. Chociaż nie można publikować w grupie kanałów, można po prostu opublikować wiadomość na dowolnym z powiązanych kanałów w grupie kanałów, a każdy subskrybent (znajomy) otrzyma tę wiadomość.

Korzystając z interfejsu [API Channel Groups dla PubNub Unity SDK](https://www.pubnub.com/docs/sdks/unity/api-reference/channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), możesz dodawać, wyświetlać i usuwać znajomych/kanały z grup kanałów, do których masz uprawnienia. Funkcja Channel Groups jest również używana do określania, kiedy znajomi są online/offline, znanego jako Obecność. Zostanie to szczegółowo omówione w naszym szczegółowym [przewodniku Jak dodać listę znajomych w 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=pl).

### Czat gildii/sojuszu/klanu

W grach, w których występują gildie, sojusze lub klany, dedykowane środowisko czatu może znacznie poprawić koordynację zespołu i koleżeństwo. Ten styl czatu grupowego umożliwia komunikację między wieloma użytkownikami, promując współpracę i pracę zespołową wśród większej liczby graczy niż tylko twoi znajomi. Czat gildii/sojuszu/klanu pozwala członkom tej samej grupy planować strategie, dzielić się osiągnięciami lub po prostu tworzyć bardziej osobistą społeczność w grze.

Konfiguracja czatu w PubNub jest taka sama, jak w przypadku czatu ze znajomymi. Należy utworzyć grupy kanałów dla każdego typu, zasubskrybować te grupy kanałów i dodać znajomych do tych grup kanałów po uzyskaniu autoryzacji. Wszelkie wiadomości publikowane na kanale powiązanym z tymi grupami kanałów będą wyzwalać detektor zdarzeń i można odpowiednio wyświetlić czat.

Grupy kanałów to świetny sposób na zarządzanie dużymi grupami, ponieważ grupa kanałów każdego gracza może [zarządzać 2000 kanałów](https://www.pubnub.com/docs/general/channels/subscribe#channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) (w tym przypadku graczy), co jest więcej niż wystarczające nawet dla największych gildii w masowych grach online. Co więcej, każdy indywidualny klient podłączony do sieci PubNub może mieć 10 grup kanałów, co oznacza, że w razie potrzeby masz dostęp do subskrypcji 20 000 kanałów.

### Czat Party/Lobby

Czaty Party lub Lobby są przeznaczone dla małych, tymczasowych grup utworzonych na potrzeby konkretnej sesji gry lub misji. Chociaż te style czatu są przeznaczone do różnych celów, ich implementacja jest podobna do wzorca tworzenia prywatnego/szeptanego kanału czatu.

Najpierw należy utworzyć ciąg bazowy dla każdego z typów czatu grupowego. Kiedy subskrybujesz tablicę kanałów (omówioną w następnym kroku), będziesz subskrybować za pomocą symboli wieloznacznych, aby nasłuchiwać wszystkich żądań:

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

Po utworzeniu lobby lub grupy, gracz zostaje wyznaczony jako lider lub właściciel grupy, niezależnie od tego, czy zainicjował grupę, czy też został określony na podstawie połączenia internetowego i regionu. Tego typu gracze nazywani są liderami lub gospodarzami. Następnie należy połączyć identyfikator użytkownika gracza-gospodarza z ciągiem bazowym, tworząc unikalny wzorzec kanału. Każdy nowy gracz, który zostanie zaproszony do dołączenia do imprezy lub lobby, będzie dynamicznie subskrybował te kanały, skutecznie dołączając do grupy. Kanał można następnie usunąć po zakończeniu lub rozwiązaniu imprezy lub lobby.

Łączenie wszystkiego w całość
-----------------------------

Po określeniu typów czatu, które chcesz zaimplementować w swojej grze w oparciu o wzorzec kanału, nadszedł czas, aby wysyłać i odbierać wiadomości w czasie rzeczywistym, publikując i subskrybując te kanały.

### Publikowanie wiadomości

Proces rozpoczyna się od stworzenia ładunku wiadomości. Może to być prosty czat tekstowy lub bardziej złożone struktury danych, w zależności od wymagań gry Unity. Gdy ładunek jest gotowy, nadszedł czas, aby opublikować wiadomość.

Interfejs [API Publish](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=pl) służy do wysyłania wiadomości do wszystkich subskrybentów określonego kanału czatu. Chociaż możesz publikować tylko na jednym kanale naraz, publikowanie odbywa się asynchronicznie, więc nie blokuje wykonywania reszty kodu (chociaż nadal możesz publikować synchronicznie, jeśli chcesz).

Na przykład, jeśli chcesz wysłać wiadomość czatu do strony, wykonaj następujące wywołanie, aby nie tylko opublikować, ale także określić, czy połączenie PubNub zostało pomyślnie wykonane (i obsłużyć, gdy połączenie się nie powiodło):

```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());
```

### Subscribe to Messages

Gdy wiadomości są publikowane, musimy [zasubskrybować](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=pl) odpowiednie kanały, aby otrzymywać wszelkie przychodzące wiadomości i zdarzenia. Możesz subskrybować wiele kanałów czatu i grup kanałów za pomocą jednego połączenia:

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

Odtwarzacz jest teraz podłączony do sieci PubNub, a [nasłuchiwacze zdarzeń](https://www.pubnub.com/docs/sdks/unity#add-event-listeners?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) czekają na wystąpienie zdarzenia - w tym przypadku nadejście nowej wiadomości - a następnie wykonują kod powiązany z tym zdarzeniem.

Gdy nadejdzie wiadomość, słuchacz uruchamia wywołanie zwrotne, wykonując kod napisany do obsługi wiadomości przychodzących. Może to być tak proste, jak wyświetlenie wiadomości w pokoju czatu, lub coś bardziej złożonego, jak wyzwalanie zdarzeń w grze na podstawie wiadomości czatu.

Zaawansowane funkcje sprawiające, że czat w grze jest angażujący
----------------------------------------------------------------

Dobra robota - udało ci się zaimplementować czat w grze Unity, aby gracze mogli wysyłać i odbierać wiadomości w czasie rzeczywistym! Chociaż już teraz tworzy to przestrzeń dla graczy do wzajemnej interakcji, zaimplementowana funkcjonalność to tylko wierzchołek góry lodowej - istnieje wiele funkcji, które warto rozważyć, aby czat w grze był bardziej angażujący dla graczy.

### Wczytywanie historii wiadomości: Trwałość wiadomości

W grze gracze mogą potrzebować powrócić do poprzednich rozmów lub nadrobić zaległości w pominiętych czatach. W tym miejscu pojawia się Message [Persistence](https://www.pubnub.com/docs/general/storage?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), umożliwiając zapisywanie i pobieranie historii wiadomości czatu. Wdrożenie interfejsu API Message Persistence w grze Unity umożliwia przechowywanie i pobieranie wiadomości czatu, akcji wiadomości i plików w razie potrzeby:

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

Zapewniamy również elastyczność w kontrolowaniu czasu przechowywania wiadomości, umożliwiając zarządzanie pamięcią masową w oparciu o konkretne potrzeby i zasoby gry. Aby móc korzystać z Message Persistence, musisz włączyć tę funkcję w [portalu administracyjnym](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) dla swoich kluczy. Możesz dowiedzieć się więcej o tej funkcji, a także o tym, jak ją włączyć, postępując zgodnie z naszym [przewodnikiem](https://www.pubnub.com/how-to/admin-portal-persistence/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) dotyczącym trwałości wiadomości.

### Powiadamianie graczy o nieodebranych wiadomościach: Mobilne powiadomienia push

W przypadku gier mobilnych gracze mogą często wchodzić i wychodzić z aplikacji i mogą przegapić kluczowe wiadomości od swojej drużyny lub aktualizacje z gry. W tym miejscu do gry wkraczają mobilne [powiadomienia](https://www.pubnub.com/docs/general/push/send?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) push. Zapewniają one sposób na informowanie graczy o nieodebranych wiadomościach na czacie, aktualizacjach gry lub innych ważnych powiadomieniach, nawet gdy nie są oni aktywnie w grze.

Dzięki interfejsowi Mobile Push [Notifications API](https://www.pubnub.com/docs/sdks/unity/api-reference/mobile-push?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) zapewniamy ujednolicony interfejs API do wysyłania powiadomień push na urządzenia z systemem iOS i Android. Upraszcza to proces i umożliwia wysyłanie pojedynczego wywołania API w celu powiadomienia wszystkich urządzeń, niezależnie od platformy. Powiadomienia push można również dostosować do własnych potrzeb, na przykład wysyłając spersonalizowane powiadomienia do poszczególnych graczy lub rozgłaszając wiadomość do wszystkich graczy. Ta elastyczność pozwala skutecznie komunikować się z graczami, utrzymując ich zaangażowanie i informacje.

Aby móc korzystać z powiadomień Mobile Push w PubNub, należy je włączyć, postępując zgodnie z naszym [przewodnikiem](https://www.pubnub.com/how-to/push-notifications/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) w [portalu administratora](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl). Mamy również bardziej szczegółowe instrukcje dotyczące powiadomień mobilnych [FCM](https://www.pubnub.com/how-to/admin-portal-push-notifications-android/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) i [APN](https://www.pubnub.com/how-to/admin-portal-push-notifications-apns/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl).

### Więcej niż tylko słowa: Emoji

Emoji służą jako uniwersalny język emocji w komunikacji cyfrowej. Pozwalają graczom wyrazić swoje uczucia i reakcje w zabawny i kolorowy sposób, czyniąc czat bardziej interaktywnym i wciągającym.

Dzięki PubNub możesz łatwo zaimplementować obsługę emoji w swojej grze Unity, pozwalając graczom publikować [sygnały](https://www.pubnub.com/docs/general/messages/publish#send-signals?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), a nie wiadomości. Sygnały są przeznaczone do wysyłania małych fragmentów danych, ponieważ ich wysyłanie jest znacznie szybsze i tańsze niż wiadomości. Ponieważ emoji są zazwyczaj bardzo małe pod względem rozmiaru danych, jest to doskonały sposób na szybkie wysyłanie danych.

Możesz użyć [interfejsu API PubNub Signals](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=pl), aby opublikować emoji na określonym czacie. Na przykład, jeśli gracz chce wysłać machające emoji do globalnego czatu, po naciśnięciu przycisku Wyślij zostanie wykonany następujący kod:

```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);
    }
  });
```

Zamierzeni odbiorcy otrzymają sygnał, jeśli są subskrybentami określonego kanału. W tym przypadku, ponieważ jest to kanał globalny, wszyscy otrzymają emoji. Aby móc nasłuchiwać sygnałów, należy zasubskrybować zdarzenie nasłuchiwania:

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

Musisz upewnić się, że wartość emoji reprezentuje rzeczywiste emoji zdefiniowane w Unity. Te emoji mogą być przechowywane i pobierane w sieci PubNub za pośrednictwem App [Context](https://www.pubnub.com/docs/sdks/unity/api-reference/objects?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) (wcześniej znanego jako Objects), dzięki czemu wszelkie emoji, do których gracz ma dostęp, mogą być pobierane z bezserwerowej pamięci masowej. Więcej informacji na temat implementacji App Context w grze Unity można znaleźć w naszym poradniku.

### Odpowiadanie na wiadomości: Reakcje na wiadomości

[Reakcje](https://www.pubnub.com/docs/sdks/unity/api-reference/message-actions?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) na wiadomości, takie jak polubienia, serduszka, kciuki w górę, naklejki lub niestandardowe reakcje specyficzne dla gry, zapewniają graczom szybki i łatwy sposób reagowania na wiadomości na czacie. Nie tylko dodają one interaktywności do czatu, ale także wzmacniają poczucie wspólnoty, umożliwiając graczom wzajemne potwierdzanie i angażowanie się w wiadomości.

Interfejs [API Message Actions](https://www.pubnub.com/docs/sdks/unity/api-reference/message-actions?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) aplikacji PubNub umożliwia tworzenie funkcji takich jak reakcje i potwierdzenia odczytu, a także powiązanie niestandardowych metadanych z wiadomościami. Podobnie jak aplikacje do czatowania, takie jak Discord, mają różne reakcje i emotikony dla różnych serwerów, tak samo może być w przypadku różnych typów czatu. Możesz pobrać dostępne reakcje na wiadomości dla określonego kanału czatu za pomocą następującego wywołania podczas ładowania czatu:

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

Gdy gracz ma odpowiedzieć na wiadomość za pomocą reakcji, można to zrobić, dodając reakcję wiadomości do opublikowanej wiadomości:

```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 używa tokenów czasowych do dokładnego śledzenia, kiedy wiadomość została opublikowana w sieci. Kiedy otrzymujesz wiadomości, czas jest również zawarty w ładunku. Następnie można podać odpowiednią wartość tokena czasu w argumencie MessageTimetoken(), aby móc zareagować na wiadomość.

Aby móc nasłuchiwać reakcji i powiadomić gracza, który wysłał oryginalną wiadomość, należy dodać słuchacza i obsłużyć reakcję w metodzie OnPNMessageAction:

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

Podobnie jak w przypadku emoji, można użyć [App Context](https://www.pubnub.com/docs/sdks/unity/api-reference/objects?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), aby pobrać i przechowywać sposób, w jaki te reakcje są wizualnie reprezentowane w grze. Aby móc korzystać z Message Reactions, musisz upewnić się, że [Message Persistence](https://www.pubnub.com/how-to/admin-portal-persistence/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) jest włączone dla twoich kluczy w [Admin Portal](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl).

### GIF-y i inne multimedia

Kolejną ważną funkcją, która zwiększa komfort korzystania z czatu, jest udostępnianie plików multimedialnych. Niezależnie od tego, czy chodzi o udostępnianie GIF-ów, zrzutów ekranu z zabawnych momentów, czy nawet udostępnianie zasobów gry, udostępnianie plików wprowadza kolejny poziom interakcji do gry.

Wdrażanie tego typu plików multimedialnych wykorzystuje [PubNub File Sharing API](https://www.pubnub.com/docs/sdks/unity/api-reference/files?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl). Dzięki tej funkcjonalności gracze mogą przesyłać, pobierać i usuwać pliki, do których mają dostęp. Aby móc wysłać plik, należy wykonać następujące połączenie:

```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.
}
```

Aby subskrybenci mogli nasłuchiwać pliku, należy dodać detektor zdarzeń i obsłużyć sposób wyświetlania pliku w metodzie OnPNFile:

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

Można również uzyskać, wyświetlić listę informacji i usunąć dowolny plik powiązany z różnymi kanałami czatu. Będziesz musiał upewnić się, że włączyłeś funkcję udostępniania plików w portalu administracyjnym, a także Message Persistence. Możesz dowiedzieć się więcej o tym, jak to zrobić w naszym [przewodniku Włączanie plików](https://www.pubnub.com/how-to/admin-portal-enabling-files/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl).

### Zabezpieczanie kanałów czatu: Menedżer dostępu

W każdym środowisku gier zapewnienie bezpieczeństwa kanałów czatu jest sprawą najwyższej wagi. Niezależnie od tego, czy chodzi o ochronę graczy przed niechcianymi wiadomościami, czy o ochronę wrażliwych dyskusji strategicznych, system czatu w grze Unity musi być zaprojektowany z myślą o bezpieczeństwie.

W tym miejscu pojawia się menedżer [dostępu](https://www.pubnub.com/docs/sdks/unity/api-reference/access-manager?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl) PubNub. Zapewnia on solidną i elastyczną strukturę do zabezpieczania kanałów czatu. Dzięki Access Manager możesz kontrolować, kto może publikować lub subskrybować każdy z twoich kanałów, dodając dodatkową warstwę zabezpieczeń do systemu czatu w twojej grze Unity.

Access Manager umożliwia przyznawanie uprawnień na poziomie użytkownika, kanału, a nawet na poziomie poszczególnych kluczy. Możesz określić, czy użytkownik może odczytywać, zapisywać lub zarządzać kanałem, a uprawnienia te mogą być dynamicznie aktualizowane wraz ze zmianą potrzeb gry. Na przykład na prywatnym czacie między dwoma graczami możesz przyznać tylko tym dwóm graczom uprawnienia do odczytu i zapisu na ich prywatnym kanale. Podobnie, na czacie gildii można nadać uprawnienia do odczytu i zapisu wszystkim członkom gildii, a uprawnienia do zarządzania tylko liderowi gildii.

Access Manager obsługuje również uwierzytelnianie oparte na tokenach, umożliwiając bezpieczne uwierzytelnianie użytkowników i przyznawanie im odpowiednich uprawnień. Zapewnia to, że tylko autoryzowani gracze mogą uzyskać dostęp do kanałów czatu w grze, chroniąc społeczność gry przed potencjalnymi zagrożeniami.

Aby móc korzystać z tej funkcji, należy włączyć Menedżera dostępu w [Portalu administratora](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl). Możesz dowiedzieć się więcej o tym, jak to zrobić, postępując zgodnie z tą [stroną wsparcia](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=pl) dotyczącą włączania tej dodatkowej funkcji.

Co dalej
--------

W tym poradniku dowiedziałeś się, jak dodać solidny system czatu w czasie rzeczywistym do swojej gry Unity. Omówiliśmy wszystko, od inicjalizacji obiektu PubNub w środowisku, po konfigurację wzorca czatu, który reprezentuje różne typy czatu, a następnie wysyłanie i odbieranie wiadomości. Dowiedziałeś się nawet, jak zaimplementować zaawansowane funkcje, takie jak emotikony, reakcje na wiadomości i udostępnianie plików, a także ważne aspekty każdego dobrego systemu czatu z trwałością wiadomości, mobilnymi powiadomieniami push i bezpieczeństwem kanałów.

Niezależnie od tego, czy jesteś niezależnym deweloperem pracującym nad swoją pierwszą grą, czy doświadczonym deweloperem, który chce ulepszyć swoją grę wieloosobową, funkcjonalność PubNub w czasie rzeczywistym może służyć jako infrastruktura do obsługi czatu w grze, dzięki czemu możesz skupić się na tym, co najważniejsze.

Dowiedz się więcej, korzystając z poniższych zasobów:

-   Przeczytaj naszą [dokumentację Unity](https://www.pubnub.com/docs/sdks/unity?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=pl), aby dowiedzieć się wszystkiego, co musisz wiedzieć o dodawaniu czatu w czasie rzeczywistym do swojej gry.
-   Dowiedz się, jak dodać [listę](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=pl) znajomych, korzystając z naszego przewodnika Unity.
-   Dowiedz się, jak nasza gra [pokazowa Un](https://github.com/PubNubDevelopers/unity-multiplayer-shooter) ity wykorzystuje wzorce czatu do zarządzania pokojami rozmów i nie tylko.
-   Zanurz się w [kodzie źródłowym Unity SDK](https://github.com/pubnub/unity).

W razie jakichkolwiek pytań lub wątpliwości zachęcamy do kontaktu z zespołem ds. relacji z deweloperami pod adresem [devrel@pubnub.com](mailto:devrel@pubnub.com).