_ConnectionManager.cs

c# 2023. 8. 30. 10:23
728x90

 

Unity Photon Pun2 통신

public class _ConnectionManager : MonoBehaviourPunCallbacks
{
	public InputField chatInput;
    public Text chatText;
    
    void Start()
    {
    	PhotonNetwork.ConnectUsingSettings();
    }
    
    public override void OnConnectedToMaster()
    {
    	Debug.Log("Connected to Photon master Server");
        PhotonNetwork.JoinRandomRoom();
    }
    
    public overrid void OnJoinRandomFailed(short returnCode, string message)
    {
    	Debug.Log("Failed to join a room. Creating a new room");
        PhotonNetwork.CreateRoom(null, new RoomOptions{ MaxPlayers = 4 });
    }
    
    public override void OnJoinedRoom()
    {
    	Debug.Log("Joined Room Successful");
        string joinMessage = $"{PhotonNetwork.LocalPlayer.NickName} has Joined";
        
        foreach (string message in PhotonNetwork.LocalPlayer.CustomProperties.Keys)
        {
        	chatText.text += message + "\n";
        }
    }
    
    public void SendChatMessage(string message)
    {
    	photonView.RPC("ReceiveChatMessage", RpcTarget.All, message);
    }
    
    /// <summary>
    /// RPC ( 원격 프로시저 호출)
    /// 이 속성은 해당 메서드가 Photon의 RPC 시스템을 사용하여 원격으로 호출되어야 함을 표기
    /// </summary>
    [PunRPC]
    public void ReceiveChatMessage(string message, PhotonMessageInfo info)
    {
    	string senderName = info.Sender.NickName;
        string formattedMessage = $"{senderName}: {message}";
     	chatText.text += formattedMessage + "\n";
        
        ExitGames.Client.Photon.Hashtable customProperties = new ExitGames.Client.Photon.Hashtable();
        customProperties.Add(message, true);
        
        info.Sender.SetCustomProperties(customProperties);
    }
    
    public void OnSendButtonClicked()
    {
    	string message = chatInput.text;
        if(!string.IsNullOrEmpty(message))
        {
        	SendChatMessage(message);
            chatInput.text = string.Empty;
        }
    }

}

 

실행순서

1. Start() / Phton 서버에 연결 시도

2. OnConnectedToMaster() / 서버연결에 성공하면 OnConnectedToMaster() 콜백 메서드 호출

/ PhotonNetwork.JoinRandomRoom() 호출하여 랜덤한 방에 참여 시도

3. OnJoinRandomFailed() / 랜덤방에 참여 실패시 OnJoinRandomFailed() 콜백 메서드 호출

/ PhotonNetwork.CreateRoom()  호출하여 새로운 방 생성, 최대 플레이어 수 지정

4. OnJoinedRoom() / 방 참여에 성공하면 OnJoinedRoom() 콜백 메서드 호출

/ 플레이어가 방에 참여 했다는 메시지를 SendChatMessage() 를 통해 전송

/ 플레이어의 CustomProperties에 저장된 기존 채팅 메시지를 foreach 루프를 사용하여 UI에 표시

5. SendChatMessage() / SendChatMessage() 메서드가 호출되면 현재 플레이어의 RPC를 통해 모든 플레이어에게 채팅 메시지를 보낸다

/ ReceiveChatMessage() / RPC가 호출된다

6. ReceiveChatMessage() / 다른 플레이어가 채팅 메시지를 보내면 ReceiveChatmessage() RPC가 호출된다

 

728x90
Posted by 바르마스
,