멀티 플레이에서 빠지면 안 될 기능 중 하나인 채팅 시스템을 만들어보겠습니다.
일단, 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