Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

unihee1의 블로그

[TIL] Unity 멀티 구현하기_ 2. 방 생성과 입장 본문

Unity

[TIL] Unity 멀티 구현하기_ 2. 방 생성과 입장

unihee1 2025. 8. 27. 21:30

2025.08.26 - [Unity] - [TIL] Unity 멀티 구현하기_ 1. Photon 연결하기

 

[TIL] Unity 멀티 구현하기_ 1. Photon 연결하기

2025.08.18 - [Unity] - [TIL] Unity 멀티 구현 전 Photon에 대해 알아보기 [TIL] Unity 멀티 구현 전 Photon에 대해 알아보기1. Photon이란?멀티플레이 게임용 유니티 패키지로 유연한 매치메이킹을 통해 플레이어

unihee1.tistory.com

1. 개요

Unity와 Photon을 연결하는 데 성공했으니 이제 본격적으로 매칭 시스템을 구현해보려고 한다.
내가 만들 방식은 플레이어가 먼저 원하는 역할을 선택하고 그 역할에 맞게 방에 참가하는 구조이다.

 

2. 로비씬 만들기

이미지 UI로 BackGround를 만들고 Text로 Title 텍스트를 입력한 후 원하는 곳에 배치한다.

그런 다음 Button을 두개 만들어 배치하여 주면 간단하게 로비씬을 만들 수 있다.

 

3. LobbyManager 스크립트 작성하기

Farmer 역할 1명, Chicken 역할 4명 총 5명 플레이어가 모이면 Main씬으로 이동하도록 구현할 것이다.

우선 매칭 방식은 단순하게 이미 생성된 방이 있다면 참가하고 없다면 새로 방을 만들어주는 방식으로 진행할 것이다.

using Photon.Pun;
using Photon.Realtime;
using ExitGames.Client.Photon;
using UnityEngine;

public class LobbyManager : MonoBehaviourPunCallbacks
{
    private string selectedRole;


    private void Start()
    {
        PhotonNetwork.ConnectUsingSettings(); 
    }

  
    public void JoinRole(string role)
    {
        selectedRole = role;
        PhotonNetwork.JoinRandomRoom();
    }

    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        RoomOptions options = new RoomOptions();
        options.MaxPlayers = 5;
        options.CustomRoomProperties = new ExitGames.Client.Photon.Hashtable
        {
            { "FarmerCount", 0 },
            { "ChickenCount", 0 }
        };
        options.CustomRoomPropertiesForLobby = new string[] { "FarmerCount", "ChickenCount" };
        PhotonNetwork.CreateRoom(null, options);
    }

    public override void OnJoinedRoom()
    {
        var props = PhotonNetwork.CurrentRoom.CustomProperties;

        int farmerCount = (int)props["FarmerCount"];
        int chickenCount = (int)props["ChickenCount"];


        if (selectedRole == "Farmer")
        {
            if (farmerCount >= 1)
            {
                PhotonNetwork.LeaveRoom();
                return;
            }
            farmerCount++;
        }
        else
        {
            if (chickenCount >= 4)
            {
                PhotonNetwork.LeaveRoom();
                return;
            }
            chickenCount++;
        }

  
        PhotonNetwork.CurrentRoom.SetCustomProperties(new ExitGames.Client.Photon.Hashtable
        {
            { "FarmerCount", farmerCount },
            { "ChickenCount", chickenCount }
        });

        Debug.Log($"Joined as {selectedRole}");

  
        if (farmerCount == 1 && chickenCount == 4 && PhotonNetwork.IsMasterClient)
        {
            PhotonNetwork.LoadLevel("GameScene");
        }
    }
}
  • Start: PhotonNetwork.ConnectUsingSettings()을 호출해서 Photon 서버에 연결
  • JoinRole(string role): 플레이어가 역할을 선택했을 때 호출되며 선택된 역할을 저장
    • PhotonNetwork.JoinRandomRoom()을 실행해서 랜덤 방 참가를 시도
    • 들어갈 수 있는 방이 없으면 OnJoinRandomFailed 호출
  • OnJoinRandomFailed(short returnCode, string message): 랜덤 방 참가에 실패했을 때 새로운 방 만
    • MaxPlayers: 5명
    • CustomRoomProperties: FarmerCount = 0, ChickenCount = 0 초기값을 지정
    • PhotonNetwork.CreateRoom()을 실행해서 방을 생성
  • OnJoinedRoom(): 방에 성공적으로 참가했을 때 인원 체크 후 메인 씬을 로드

 

4. 버튼 On Click 이벤트 등록

만들어둔 버튼의 OnClick에 LobbyManager 스크립트가 붙은 오브젝트를 할당한 후 JoinRole 함수를 입력해준다.

그런 다읍 버튼 역할에 맞게 입력해주면 끝이다.

 

5. 결과

실행 하면 Photon 서버와 연결되고 각각의 버튼을 누르면 각 역할이 정확하게 선택된 것을 확인할 수 있다.