원본 글 : https://doc.photonengine.com/ko-kr/pun/current/demos-and-tutorials/pun-basics-tutorial/lobby

포톤 사이트에 있는 내용을 기본으로 나름대로 정리해봤다.



#region은 처음봤는데 비쥬얼스튜디오 편집기에서 구역을 나눌수 있는 기능이더라.

#region 에서 #endregion 사이에 있는 내용을 열고 닫을 수 있다.




우선 Awake에서 기본 설정을 해준다.

1
2
3
4
5
6
7
8
9
10
private void Awake()
{
    // 로그 출력 레벨을 결정. full이면 모든 로그 출력. 익숙해지면 Informational로 변경하기    
    PhotonNetwork.logLevel = PhotonLogLevel.Full;
    // 로비를 사용할것인지를 결정. false면 OnJoinedLobby()가 호출되지않음.
    PhotonNetwork.autoJoinLobby = false;
    // 플레이어 수에 따라 변경되는 경기장 세팅에 사용. true면 Master클라이언트에서 LoadLevel()을 호출할 수 있다.
    // 이때 방의 모든 클라이언트가 마스터 클라이언트와 동일한 레벨을 자동으로 로드함. 즉 true시 레벨 동기화.
    PhotonNetwork.automaticallySyncScene = true;
}
cs

우선 logLevel은 로그를 얼마나 출력할것인지 로그레벨을 설정하는 것이다.

Full이면 모든 로그를 출력. Informational이면 결과나 호출의 일부만 출력한다. ErrorsOnly는 오직에러만을 출력한다.

사이트에서는 처음에는 Full로 모든 로그를 출력하다가 익숙해지면 Informational로 변경하기를 추천하고있다.


autoJoinLobby는 마스터서버에 접속할때 자동으로 로비를 연결할 것인지 결정한다.

OnJoinedLobby() 함수는 로비에 접속될때 호출됨으로 당연히 호출되지 않는다.


automaticallySyncScene은 마스터 클라이언트와 일반 클라이언트들이 레벨을 동기화할지 결정한다.

true로 설정하면 마스터 클라에서 LoadLevel()로 레벨을 변경하면 모든 클라이언트들이 자동으로 동일한 레벨을 로드.




Start에서는 Connect() 함수를 불러준다.

1
2
3
4
5
6
7
8
9
10
11
12
public void Connect()
{
    if(PhotonNetwork.connected)
    {
        PhotonNetwork.JoinRandomRoom();
    }
    else
    {
        // 해당 게임버전으로 photon 클라우드로 연결되는 시작점
        PhotonNetwork.ConnectUsingSettings(_gameVersion);
    }
}
cs

연결되어있으면 JoinRandomRoom() 함수로 무작위 방에 입장하고.

아니라면 ConnectUsingSettings()함수로 해당 게임버전으로 포톤 클라우드에 연결한다.




PUN 콜백은 위의 문서에 적힌대로 3가지 방법이 있는데.


첫번째는 정해진 이름의 함수를 만들면 자동으로 해당함수가 호출된다.

하지만 함수의 정확한 이름을 알아야 됨으로 잘 쓰이지 않는다.


두번째는 IPunCallbacks 인터페이스를 상속받아 해당 함수를 사용하는 방법이다. 

원본 링크에 gif로 잘 되어있으니 참고하면 될 것.


세번째는 Photon.PunBehaviour를 사용하는 방법으로 가장 많이쓰고 쉬운 방법이다.

Photon.PunBehaviour는 Photon.MonoBehaviour, IPunCallbacks를 상속받고 있으므로 

필요한 함수만 오버라이드해서 쓰면된다.




마지막으로는 인스펙터에서 변수가 노출될수 있게 변수를 선언하여 사용하는 것이다.

1
2
3
4
5
public PhotonLogLevel Loglevel = PhotonLogLevel.Informational;
public byte MaxPlayersPerRoom = 4;
 
PhotonNetwork.logLevel = Loglevel;
PhotonNetwork.CreateRoom(nullnew RoomOptions() { MaxPlayers = MaxPlayersPerRoom }, null);
cs

이렇게하면 코드를 수정하지 않고도 인스펙터에서 바로 값을 변경할 수 있으므로 편리하다.

byte는 1바이트 숫자 자료형으로 0~255까지의 범위를 가짐.

변수 위에 [Tooltip("내용")]을 적으면 인스펙터에서 마우스 오버시 툴팁이 나타난다.




전체 소스코드 (Launcher.cs)

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Launcher : Photon.PunBehaviour {
 
    #region Public Variables
    /// <summary>
    /// PUN loglevel
    /// </summary>
    public PhotonLogLevel Loglevel = PhotonLogLevel.Informational;
 
    [Tooltip("The maximum number of players per room. When a room is full, it can't be joined by new players, and so new room will be created")]
    public byte MaxPlayersPerRoom = 4;
    #endregion
 
    #region Private Variables
    /// <summary>
    /// 클라이언트 버전.
    /// </summary>
    string _gameVersion = "1";
 
    #endregion
 
    #region MonoBehaviour Callbacks
 
    private void Awake()
    {
        // 로그 출력 레벨을 결정. full이면 모든 로그 출력. 익숙해지면 Informational로 변경하기    
        PhotonNetwork.logLevel = Loglevel;
        // 로비를 사용할것인지를 결정. false이면 OnJoinedLobby()가 호출되지않음. 
        PhotonNetwork.autoJoinLobby = false;
        // 플레이어 수에 따라 변경되는 경기장 세팅에 사용. true면 Master클라이언트에서 LoadLevel()을 호출할 수 있다.
        // 이때 방의 모든 클라이언트가 마스터 클라이언트와 동일한 레벨을 자동으로 로드함. 즉 true시 레벨 동기화.
        PhotonNetwork.automaticallySyncScene = true;
    }
 
    // Use this for initialization
    void Start () {
        Connect();
    }
    #endregion
 
    #region Public Mathods
 
    public void Connect()
    {
        if (PhotonNetwork.connected)
        {
            PhotonNetwork.JoinRandomRoom();
        }
        else
        {
            // 해당 게임버전으로 photon 클라우드로 연결되는 시작점
            PhotonNetwork.ConnectUsingSettings(_gameVersion);
        }
    }
    #endregion
 
    #region Photon.PunBehaviour CallBacks
    public override void OnConnectedToMaster()
    {
        Debug.Log("DemoAnimator/Launcher: OnConnectedToMaster() was called by PUN");
 
        PhotonNetwork.JoinRandomRoom();
    }
 
    public override void OnDisconnectedFromPhoton()
    {
        Debug.LogWarning("DemoAnimator/Launcher: OnDisconnectedFromPhoton() was called by PUN");
    }
 
    // 랜덤 룸 참여에 실패하면 룸을 생성
    public override void OnPhotonRandomJoinFailed(object[] codeAndMsg)
    {
        Debug.Log("DemoAnimator/Launcher:OnPhotonRandomJoinFailed() was called by PUN. No random room available, so we create one.\nCalling: PhotonNetwork.CreateRoom(null, new RoomOptions() {maxPlayers = 4}, null);");
 
        PhotonNetwork.CreateRoom(nullnew RoomOptions() { MaxPlayers = MaxPlayersPerRoom }, null);
    }
 
    // 룸에 성공적으로 참가했을때 OnJoinedRoom()이 불림
    public override void OnJoinedRoom()
    {
        Debug.Log("DemoAnimator/Launcher: OnJoinedRoom() called by PUN. Now this client is in a room.");
    }
    #endregion
}
 
cs


Posted by misty_
,