이번 주 역시 저번 주와 마찬가지로 어몽어스의 기능들을 하나씩 추가해나갔다.
임포스터를 한 명 고르는 거나, 유령이 되면 유령이 된 플레이어들만 보인다거나, 임포스터 외의 사람들에게는 임포스터 닉네임이 빨간 색으로 보이지 않는다거나 등등의 여러 추가사항들이 있었다.
하지만, 대부분 이전에 했었던 기능들과 맥락이 비슷하고, 이를 활용하는 것이라 생략하고 다만, 처음 배운 Photon - Chat + 채팅 기능에 대해서는 정리를 하고자 한다.
Starters 20주차 - 'Photon - Chat'
포톤은 Pun 외에도 Chat이라는 채팅을 전용으로 하는 솔루션도 제공하고 있다.
이는 채팅 메세지를 보내고 받는 데에 필요한 많은 메서드를 가지고 있어 게임 내 채팅을 구현하기 매우 좋았다.
어몽어스에도 멀티플레이를 제공하는만큼 채팅은 중요한 역할을 하는데, 이 역시 Chat을 통해서 구현할 수 있었다.
채팅 서버 접속하기
Chat의 접속 역시 Pun과 비슷하면이 많다.
Chat 역시 채팅 서버에 먼저 접속을 하고, 이후 원하는 채팅 방에 방의 이름을 통해 접속한다.
여기서는 접속을 구독한다고 하는데, 이 용어 차이가 큰 의미가 있는지는 잘 모르겠다.
본 게임에서는 Pun 에서 방에 접속하게 되면 바로 씬이 전환되면서 아래의 함수가 실행되고, 바로 채팅 서버의 해당 채팅 방으로 구독된다.
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.InputSystem; // InputSystem 패키지
using Photon.Chat; // 포톤 Chat
using Photon.Pun; // 포톤 Pun
using ExitGames.Client.Photon; // IChatClientListener를 사용하기 위해서 필요
public class ChatManager : MonoBehaviour, IChatClientListener
{
ChatClient chatClient;
public string userName;
string currentChannelName;
[SerializeField] private InputField inputField; // 입력창
[SerializeField] private Text channelTxt; // 채팅창
[SerializeField] private GameObject chatPanel; // 채팅 패널
void Start()
{
Application.runInBackground = true; // 게임 외의 화면에서도 앱이 실행됨 (바탕화면 등)
userName = PhotonNetwork.NickName;
currentChannelName = "ChannelU";
chatClient = new ChatClient(this); // 새로운 채팅 클라이언트 생성
chatClient.UseBackgroundWorkerForSending = true; // 게임 외 화면에서도 채팅 받기
// 채팅 서버 연결
chatClient.Connect
(
PhotonNetwork.PhotonServerSettings.AppSettings.AppIdChat,
PhotonNetwork.AppVersion,
new AuthenticationValues(userName)
// realtime을 using하면 AuthenticationVaues 메서드가 겹쳐서 에러
);
}
public void OnConnected()
{
// subscribe : 채팅 채널에 접속
chatClient.Subscribe(new string[] { currentChannelName }, 10);
AddLine("Server Connected");
}
채팅 창에 채팅 내역 표시하기
기본적으로 채팅을 구독한 뒤에도 계속 chatClient.Service()를 통해서 채팅이 서비스 되도록 업데이트에 넣어주어야 채팅을 지속적으로 받아올 수 있게 된다.
그리고, 채팅 메세지를 받게 되면, 저절로 OnGetMessage를 실행해서 메세지를 출력하게 된다.
void Update()
{
// onGetMessage가 계속 호출됨
chatClient.Service();
// 엔터, 키패드의 엔터키를 눌렀다면, 메세지를 보냄
if (Keyboard.current[Key.Enter].wasPressedThisFrame ||
Keyboard.current[Key.NumpadEnter].wasPressedThisFrame)
OnEnterSend();
// 입력하는 동안에는 플레이어의 이동을 막기 위해서 추가한 코드
if (AU_PlayerController.localPlayer == null) return;
AU_PlayerController.localPlayer.isChatting = inputField.isFocused;
}
// 메세지를 받으면 실행
public void OnGetMessages(string channelName, string[] senders, object[] messages)
{
// 채널명과 저장된 채널명 이름이 같으면, 채널 메세지를 채널창에 보여줌
if (channelName.Equals(currentChannelName))
{
this.ShowChannel(currentChannelName);
}
}
public void ShowChannel(string channelN)
{
// 아무것도 입력 안 하고 보낸 경우 무시됨
if (string.IsNullOrEmpty(channelN)) return;
// 채널을 다시 연결 시도하고, 연결이 되면, 채널의 메세지들을 가져와서 출력
ChatChannel channel = null;
bool found = this.chatClient.TryGetChannel(channelN, out channel);
if (!found)
{
Debug.Log("Failed to Find Channel " + channelN);
return;
}
this.currentChannelName = channelN;
this.channelTxt.text = channel.ToStringMessages();
}
채팅 보내기
보내기 버튼을 누르거나 키보드의 엔터 키를 누를 시에 아래의 함수가 실행되면서, 채팅을 제출하게 된다.(publishMessage)
그 이후에 다시 입력창을 지워준다.
public void OnEnterSend()
{
if (string.IsNullOrEmpty(this.inputField.text)) return;
this.chatClient.PublishMessage(currentChannelName, this.inputField.text);
this.inputField.text = "";
}
채팅 구현 결과물
채팅은 대기 방에서 가능하고, 채팅 버튼을 눌러서 키거나 끄도록 하였다.
그리고, 저번 주 학습일지에 올렸던 캐치마인드 클론 코딩을 깃허브에 일단 올렸다.
아직 수정 사항이 거의 없지만 더 수정하면 바로바로 깃허브의 파일도 수정하도록 할 예정이다.
저번 주에 게시했던 캐치마인드 클론 코딩 프로젝트 깃허브 링크
GitHub - MoHoDu/Copied_CatchMind: 넷마블 캐치마인드 클론코딩
넷마블 캐치마인드 클론코딩. Contribute to MoHoDu/Copied_CatchMind development by creating an account on GitHub.
github.com
유데미 코리아 바로가기 :
Udemy Korea - 실용적인 온라인 강의, 글로벌 전문가에게 배워보세요. | Udemy Korea
유데미코리아 AI, 파이썬, 리엑트, 자바, 노션, 디자인, UI, UIX, 기획 등 전문가의 온라인 강의를 제공하고 있습니다.
www.udemykorea.com
💡 본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.
'Starters 부트캠프 > B - log' 카테고리의 다른 글
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 22주차 학습 일지 (0) | 2022.11.20 |
---|---|
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 21주차 학습 일지 (0) | 2022.11.13 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 19주차 학습 일지 (0) | 2022.10.30 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 18주차 학습 일지 (0) | 2022.10.23 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 17주차 학습 일지 (0) | 2022.10.16 |