자료실

Photon Chat 기능 소개 및 프로그램 예시
작성자 | admin 2021-06-14  |    조회수 : 516  


멀티 플레이어 네트워크 실시간 온라인 게임을 개발할 때, 스토리 소재, 그래픽 및 음향 효과 구현과 연결 지연을 축소하는 것 외에도 플레이어끼리 교류할 수 있게 하는 것 역시 놓쳐서는 안 될 부분입니다.

게임 플레이어끼리 교류하는 시스템을 만들 때는 수많은 세부사항을 고려해야 합니다. 크로스 플랫폼, 사용자 식별 및 친구 목록, 채널 관리, 메시지 기록 보호 등 문제가 있죠.
생각만 해도 머리가 아프지 않나요?

이제 고민할 필요 없습니다. 지금 소개해드리는 Photon Chat을 사용하면 쉽고 빠르게 크로스 플랫폼 멀티 채팅 시스템을 개발할 수 있습니다.



신규 프로젝트에 Photon Chat 패키지를 임포트하기



Unity에서 Photon Chat sample란 이름으로 새로운 프로젝트를 만드세요.

Asset Store를 열고, Photon Chat FREE 패키지를 찾아 다운로드 후 임포트 합니다.



Import Unity Package 창에서 Import를 클릭하여 모두 임포트합니다.




임포트 완료 후 Project 창에서 Assets 폴더 아래에 여러 폴더가 생성된 것을 확인할 수 있습니다. 예시: Demo Chat, PhotonChat, PhotonChatApi 등



이 외에 사용자에게 AppId 또는 Email 계정을 입력하라는 Photon Chat 알림창이 팝업됩니다.

AppId는 어떻게 취득할까요?

Photon Chat의 신규 사용자라면 바로 Email을 입력하고 Setup을 클릭하세요.

Photon Chat 창이 Photon Cloud에 계정 및 응용 프로그램을 생성하고, 자동으로 응용 프로그램의 AppId를 Photon Chat 창으로 가져옵니다.




또는 직접 Photon Cloud에서 가입/로그인하여 Cloud Dashboard에 Photon Chat 어플리케이션을 생성하고 AppId를 취득할 수 있습니다.




AppId를 Photon Chat 대화창에 붙여넣은 후 Setup을 클릭하면 Photon Chat 패키지 임포트 및 설정을 완료하게 됩니다.





Photon Chat 예시 프로그램 실행


Projects 창에서 Demo Chat 폴더를 찾아, 안에 있는 Chat-Scene을 로드하세요.




이어서 File/Build Settings 항목을 클릭하여 Unity의 Build Settings 창을 불러옵니다.

Chat-Scene을 Scenes in Build 에 드래그 앤드 드롭하고, Build를 클릭해 “Demo Chat” 실행 파일을 생성합니다.




Demo Chat을 실행하면 두개의 메인 화면이 보입니다.

하나는 로그인 화면이고, 또 하나는 채팅방 화면입니다.

로그인 화면은 [1]- User Id 입력창과 [2]- Connect 버튼으로 구성되어 있습니다.

사용자는 User Id를 입력하고 Connect를 클릭하여 채팅방에 입장합니다.




채팅방 화면은 [1]- 로그인 이름, [2]- 프로그램 실행 상태, [3]- 구독 채널 목록, [4]- 친구 목록, [5]- 채팅 기록, [6]- 문자 입력 구역으로 구성되어 있습니다.

사용자는 선택한 채널안에서 임의 문자를 입력하여 해당 채널을 구독한 다른 사용자와 채팅할 수 있으며, 다른 친구가 해당 채널에 보낸 채팅 기록을 확인할 수 있습니다.






ChatClient를 사용하여 연결 시작


Demo Chat의 실행 프로세스를 통해 Photon Chat의 기능을 알아보도록 하죠.

사용자가 로그인 화면에서 User Id를 입력하고 Connect를 클릭해 연결 시,







프로그램은 C# Script- ChatNewGui.cs 안의 Connect()를 실행합니다.




프로그램이 이곳에서 ChatClient 객체를 생성하고, chatClient.Connect()를 호출하여 Photon Cloud와의 연결을 시작합니다.

ChatClient란 무엇인가요?

Photon Chat의 핵심이며, ChatClient는 Photon Cloud와의 연결 유지 관리를 포함한 완벽한 채팅방 기능 인터페이스를 제공합니다.

ChatClient.Connect()에 전달된변수는 2개입니다.

하나는 AppId, 즉 Cloud Dashboard에서 얻은 기다란 문자열이며, 이는Photon Cloud에서 실행되는 프로그램의 고유성을 보장하여 다른 사람들의 프로그램과 혼동되지 않고 오류를 발생시키지 않습니다.

또 다른 하나는 매우 길어 보이는 new ExitGames.Client.Photon.Chat.AuthenticationValues(UserName)라는 명령입니다. 이 명령의 목적은 User Name을 UserID로 전환하는 것입니다.


UserID와 User Name은 무엇이 다른가요?

User Name은 사용자가 입력한 Jane 또는 ryan과 같이 의미와 가독성을 가진 이름 문자열입니다.

UserID는 Photon Cloud가 사용자를 식별하기 위한 것으로, 가독성이 없을 수도 있는 고유 문자열입니다. 같은 UserID를 지닌 사용자는 다른 장치에서 연결해도 같은 내용을 확인할 수 있고 연결이 끊긴 후 다시 접속해도 기존 채팅 기록이 유지됩니다. UserID를 통해 프로그램은 친구 목록을 생성하여,친구를 초대하여 이벤트에 참여하게 하는 효과를 촉진할 수도 있습니다.

기억하세요: User ID의 메커니즘은 Facebook ID, Google ID, Steam ID, PlayFab ID 등과 같은 타사 서비스를 통합할 수 있습니다. (상세 정보 참고: 커스텀 인증)



Photon Cloud와의 연결을 설정한 후 프로그램이 계속 실행되고 OnConnected() 상태가 됩니다.




이 단계에서 프로그램은 다음을 포함하여 채팅방 환경을 준비합니다.

  1. 1. 구독 채널 목록 생성: chatClient.Subscribe()를 호출하여 채널 구독
  2. 2 .친구 목록 생성: chatClient.AddFriends()를 호출하여 친구 상태 추적
  3. 3. 사용자 자체의 상태 설정: chatClient.SetOnlineStatus()를 호출하여 사용자 자신의 상태를 설정



기억하세요:
  1. 1. 구독 채널 목록과 친구 목록은 개발자의 프로그램에 의해 별도로 유지 관리됩니다. Demo Chat의 예제에서는, 이 두 목록의 내용을 class ChatNewGui에 미리 선언 및 정의되어 있습니다.
  2. 2. 채널 이름은 대소문자를 구분합니다.



또한 Photon Cloud와의 연결을 시작한 후, 프로그램은 Update()에서 chatClient.Service()를 호출하여 연결 상태를 유지하고 새 채팅 메시지 또는 상태 업데이트를 처리해야 합니다.





이렇게 하면 채팅방 화면의 준비가 완료됩니다.





채팅 조작 기능 시범


두 사용자가 채팅하는 상황을 시뮬레이션하며 프로그램의 실행 프로세스를 관찰해봅시다.

한쪽은 Unity에서 Play를 클릭해 실행하고, ryan이라는 유저네임으로 로그인 하였습니다.

다른 한쪽은 Demo Chat 실행 파일을 구동하고, Jane이라는 유저네임으로 로그인 하였습니다.


  1. 1. Jane이 어떤 채널에서 발언하면 해당 채널을 구독한 사람은 모두 업데이트를 받게 됩니다.




우리는 송신단과 수신단으로 나뉘어 프로그램의 실행 프로세스를 관찰합니다.



[송신단]

먼저 Jane이 채널- Guild를 선택하고, 문자를 입력 및 전송합니다.

프로그램은 SendChatMessage() 안의 chatClient.PublishMessage()를 실행하여 Jane이 입력한 문자를 선택한 채널에 전송합니다.



그러면 프로그램은 OnGetMessages()의 이벤트를 수신하게되고여기서 chatClient.TryGetChannel()을 실행하여 업데이트된 채널 내용을 가져와 채팅 창에 반영합니다.




[수신단]

ryan 측에서는 프로그램이 OnGetMessages() 이벤트를 수신하여 Jane 측 프로세스와 마찬가지로 프로그램이 chatClient.TryGetChannel()을 실행하여 업데이트된 채널 내용을 가져와 채팅 창에 반영합니다.


  1. 2. Jane이 사용자 상태를 변경했을 경우



[송신단]

먼저 Jane이 문자 입력 구역에 ”\state 3 Lunch” 명령을 입력하여 그녀의 사용자 상태를 Away로 변경합니다.

이어서 프로그램이 SendChatMessage() 실행 시 명령어 \state를 판단하고 chatClient.SetOnlineStatue()를 호출하여 자신의 상태를 변경합니다.



[수신단]

ryan 측에서는 프로그램이 OnStatusUpdate()의 이벤트를 수신하고, 프로그램은 이벤트의 변수를 통해친구리스트 상태를 업데이트합니다. 이때, 친구 리스트에 있는 Jane의 상태가 Away로 변경됩니다.




  1. 3. Jane이 새로운 채널 구독



[송신단]

Jane이 문자 입력 구역에 ”\s mlb nba movies” 명령을 입력하여 mlb, nba, movies 총 세 개 채널을 구독합니다.

이어서 프로그램이 SendChatMessage() 실행 시 명령어 \s를 판단하고 chatClient.Subscribe()를 호출하여 채널을 구독합니다.




이밖에 눈치채셨나요? 모든 사용자가 임의 채널에서 보게 되는 첫 메시지는 says ‘hi’입니다.

이건 우연이 아닌, 프로그램이 OnSubscribed()했다는 뜻입니다. 즉, 채널 구독 성공 시 자동으로 발송되는 메시지이죠.





  1. 4. Jane이 채널 구독을 취소



[송신단]

Jane이 문자 입력 구역에 ”\u nba” 명령을 입력하여 nba 채널 구독을 취소합니다.

이어서 프로그램이 SendChatMessage() 실행 시 명령어 \u를 판단하고 chatClient.Unsubscribe()를 호출하여 채널 구독을 취소합니다.




이밖에 ChatClient는 OnUnsubscribed() 인터페이스를 지원하므로, 필요한 경우 프로그램으로 사용자의 채널 구독이 취소된 후 텍스트 알림 또는 기타 처리를 수행할 수 있습니다.


  1. 5. Janeryan에게 개인 메시지 전송




[송신단]

Jane이 문자 입력 구역에 ”\msg ryan [private messages]” 명령을 입력하여 ryan에게 개인 메시지를 보냅니다.

이어서 프로그램이 SendChatMessage() 실행 시 명령어 \msg를 판단하고 chatClient.SendPrivateMessage()를 호출하여 ryan에게 개인 메시지를 발송합니다.



그러면 프로그램은 OnPrivateMessages()의 이벤트를 수신하고,여기서 chatClient.TryGetChannel()을 실행하여 업데이트된 채널 내용을 가져와 채팅 기록 창에 반영합니다.

기억하세요:

개인 메시지 발송 시 ChatClient는 [userA]: [userB],즉 Jane:ryan 과 같은 형식의 이름을 가진 전용 채널을 생성하고, 다른 사람은 해당 채널의 메시지 기록을 볼 수 없게 합니다.








[수신단]

ryan 측에서는 프로그램이 OnPrivateMessages() 이벤트를 수신하여 Jane 측 프로세스와 마찬가지로 프로그램이 this.chatClient.TryGetChannel()을 실행하여 업데이트된 채널 내용을 가져옵니다.



  1. 6. Jane이 채널의 메시지 기록을 삭제



[송신단]

Jane이 문자 입력 구역에 ”\clear” 명령을 입력하여 채널- Guild의 메시지 기록을 지우고자 합니다.

이어서 프로그램이 SendChatMessage() 실행 시 명령어 \clear를 판단하고, 현재 속한 채널이 공개 채널인지 또는 개인 메시지 채널인지에 따라 다른 처리를 수행합니다. 만약 공개 채널인 경우, channel.ClearMessages()를 호출하여 채널의 모든 메시지 기록을 삭제합니다.





  1. 7. ryan이 개인 메시지의 메시지 기록을 삭제



[송신단]

ryan이 문자 입력 구역에 ”\clear” 명령을 입력하여 Jane과의 개인 메시지 기록을 지우고자 합니다.

이어서 프로그램이 SendChatMessage() 실행 시 명령어 \clear를 판단하고, 현재 속한 채널이 공개 채널인지 또는 개인 메시지 채널인지에 따라 다른 처리를 수행합니다. 만약 개인 메시지인 경우, chatClient.PrivateChannels.Remove()를 호출하여 개인 메시지 채널 자체를 삭제합니다.

(GIF의 마지막 화면에 주의하세요. ryan이 ryan:Jane 채널을 클릭할 때, Console 창에 ShowChannel failed to find channel: ryan:Jane이라는 메시지가 나타납니다.)





이렇게 Photon Chat 기능에 대한 대략적인 시뮬레이션이 끝났습니다. Photon Chat을 사용하면 플레이어 채팅방 기능을 쉽게 개발할 수 있으며, 이를 통해 플레이어 간의 교류를 촉진할 수 있습니다.

Photon Chat뿐 아니라, Photon은 플레이어 간의 교류 및 멀티 플레이어 네트워크의 실시간 연결을 지원할 수 있는 다양한 제품을 보유하고 있습니다.



한국 페이스북 페이지 : https://www.facebook.com/photoncloudkr/
기술관련 문의사항 : developer@photonengine.kr
그 외 문의사항 : info@photonengine.kr


출처 : Hu씨의 Photon 블로그 이야기 (대만)