본문 바로가기

유니티/모바일 멀티플레이 Shooting Game

유니티 Photon의 RaiseEvents를 이용한 채팅 시스템

반응형

UI에 관한 건 스킵하겠다. 각자 본인 마다 원하는 UI 배치가 있을꺼니깐.

나는 이 포스팅에선 모바일 전용이니깐 키보드로 입력하는 것이 아닌

미리 정해진 구문을 누르면 메세지를 보낼 수 있게 했다. 

 

RPC가 아닌 RaiseEvent 기능을 이용한 채팅 시스템

 

RaiseEvents에는 4가지 특징이 있다

  • PhotonView가 필요없다
  • Unreliable하게 이벤트를 보낼 수 있다
  • 한 오브젝트에서 다른오브젝트로 보내거나 받을 수 있다
  • 특정 플레이어에게만 보낼 수 있다

 

 

두 가지 종류의 이벤트가 있는데 Reliable한 이벤트와 Unreliable한 이벤트가 있다

  • Reliable : 매우 중요한 이벤트고 어떠한 경우에서라도 전달되어야 한다. 네트워크가 얼마나 바쁘든지 간에 이 이벤트는 전달되야한다
  • Unreliable : 별로 중요한 이벤트가 아닌 경우이며, 만약 네트워크가 바쁘다면 필수적으로 전달될 필요는 없다

 

또한 유니티의 OnEnable()과 OnDisable()를 사용해서 이벤트를 받아준다. 

 

일단 여기 스크립트에는 RecevierGroup.All 이므로 나를 포함한 모든 클라이언트가 채팅을 받는다

 

ChatMessageHandler.cs

 

using System.Collections;
using System.Collections.Generic;

using UnityEngine;
using UnityEngine.UI;

using ExitGames.Client.Photon;

using Photon.Pun;
using Photon.Realtime;

public class ChatMesseageHandler : MonoBehaviour
{
    public Text messageReceived;
    enum EventCodes//다른이벤트에 다른 코드를 가질 수 있다
    {
        chatmessage ,
    }

    private void OnEnable() 
    {
        PhotonNetwork.NetworkingClient.EventReceived+=OnEvent;
    }
    private void OnDisable()
    {
        PhotonNetwork.NetworkingClient.EventReceived-=OnEvent;
    }
    public void OnEvent(EventData photonEvent)//포톤이벤트를 받는다
    {
        byte eventCode=photonEvent.Code;
        object content=photonEvent.CustomData;//메세지 내용을 받는다
        EventCodes code=(EventCodes)eventCode;
        if(code==EventCodes.chatmessage)//일어난 이벤트가 chatmessage라면
        {
            object[] datas=content as object[];
            messageReceived.text=(string)datas[0];
        }
    }//여기서 메세지를 받아준다
    public void SendMsg(string msg)//메세지를 보낸다
    {
        object[] datas=new object[] {msg};
        RaiseEventOptions options = new RaiseEventOptions
        {
            CachingOption=EventCaching.DoNotCache,//캐시를 허용하지않는다
            //이렇게 안해두면 플레이어가 들어올 때마다 계속 이벤트를 받아낸다
            Receivers = ReceiverGroup.All
            //모든 플레이어가 받게
        };
        SendOptions sendOp=new SendOptions();
        sendOp.Reliability=true;//Reliable한 송신 옵션

        PhotonNetwork.RaiseEvent((byte)EventCodes.chatmessage,datas,options,sendOp);
        //이벤트를 일으킨다
    }
}

 

실행영상

 

 

 

 

 

 

출처 : https://doc.photonengine.com/pun/current/gameplay/rpcsandraiseevent

 

RPCs and RaiseEvent | Photon Engine

One feature that sets PUN aside from other Photon packages is the support for "Remote Procedure Calls" (RPCs). Remote Procedure Calls are...

doc.photonengine.com

 

반응형