[Unity3D] #7 - Fusion 2-2 | 채팅 시스템

qweasfjbv·2024년 8월 6일

Unity3D

목록 보기
7/7

개요


멀티 플레이에서 빠지면 안 될 기능 중 하나인 채팅 시스템을 만들어보겠습니다.
일단, Photon의 공식 문서를 먼저 보도록 하겠습니다.

인터페이스를 상속받아서 함수를 구현하면 사용할 수 있도록 편리하게 만들어져 있습니다.
하지만, 전부 구현하고 난 후에 실행해보면 경고창과 에러가 발생합니다.

경고창이 시키는 대로 Photon setup wizard 를 찾아보면,

아무래도 PUN과 관련된 기능인 듯 합니다.

저는 Fusion2 를 사용하고 있기 때문에, 다른 방법으로 채팅을 구현해보도록 하곘습니다.

구현


public class PhotonChat : NetworkBehaviour
{
    [SerializeField] private TMP_InputField inputField;
    [SerializeField] private TextMeshProUGUI chatDisplay;
    [SerializeField] private float delayTime;
    
    private bool chatDelay = false;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Return))
        {
            if(inputField.text.Trim().Length > 0 && !chatDelay)
            {
                OnSendButtonClicked();
                chatDelay = true;
                Invoke(nameof(ReleaseChat), delayTime);
            }
        }
    }

    public void OnSendButtonClicked()
    {
        if (!string.IsNullOrEmpty(inputField.text))
        {
            RPC_SendMessage(inputField.text);
            inputField.text = string.Empty;
        }
    }

    [Rpc(RpcSources.All, RpcTargets.All)]
    private void RPC_SendMessage(string message, RpcInfo info = default)
    {
        string sender =  $"{info.Source}";
        string formattedMessage = $"{sender} : {message}\n";

        chatDisplay.text += formattedMessage;
        chatDisplay.text = CheckLongMessage(chatDisplay.text);
    }

    private string CheckLongMessage(string s)
    {
        int newlineCount = s.Count(c => c == '\n');

        if (newlineCount < 5) return s;

        int newlineIndex = s.IndexOf('\n');
        string result = s.Substring(newlineIndex + 1);
        return result;
    }

    private void ReleaseChat()
    {
        chatDelay = false;
    }
}

저는 RPC 를 통해서 채팅 시스템을 만들었습니다.

엔터를 치면 RPC 함수를 호출하여 각 클라이언트의 UI에 메세지가 적히도록 구현했습니다.
또한, CheckLongMessage 를 통해서 오래된 메세지부터 사라지도록 했습니다.

여기까지 실행해보겠습니다.

마무리


Fusion2의 RPC 기능으로 간단하게 채팅 시스템을 만들어봤습니다.
Photon Chat에 있는 인터페이스를 따로 구현하는것 보다 쉽고 간편해서 빠르게 만들 수 있었습니다.

참고자료


https://doc.photonengine.com/ko-kr/chat/current/getting-started/chat-intro

0개의 댓글