본문 바로가기

Starters 부트캠프/B - log

유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 20주차 학습 일지

이번 주 역시 저번 주와 마찬가지로 어몽어스의 기능들을 하나씩 추가해나갔다.

임포스터를 한 명 고르는 거나, 유령이 되면 유령이 된 플레이어들만 보인다거나, 임포스터 외의 사람들에게는 임포스터 닉네임이 빨간 색으로 보이지 않는다거나 등등의 여러 추가사항들이 있었다.

하지만, 대부분 이전에 했었던 기능들과 맥락이 비슷하고, 이를 활용하는 것이라 생략하고 다만, 처음 배운 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기 과정 후기로 작성되었습니다.