상세 컨텐츠

본문 제목

Unity PhotonServer_02 - 랜덤방 생성, 조인, 커넥트

C#/Server

by McRobbin 2020. 6. 12. 00:27

본문

2탄 랜덤 조인, 방 생성, 커넥트에 대해 알아보겠습니다.

 

1탄의 세팅을 제대로 보고 따라하셨다면 Photon/PhotonUnityNetworking/Demos/PubBasics-Tutorial

이 폴더 아래에 있는 Scenes에 PunBasics-Launcher!!! 이거 먼저 실행해 보시길 추천드립니다.

 

저 신을 빌드세팅에 전부 집어넣고 빌드해서 앱이나 게임 실행파일로 뽑아내시고

하나는 유니티 내에서, 하나는 앱이나 빌드한 실행파일로 돌려 둘이 잘 동작하고 연동되는지 확인하세요

 

 

이제 프로젝트 설명 들어갑니다!

하이어라키 이렇게 구성했습니다.

UIApp => UI를 위한 캔퍼스에 이름 바꿨습니다. UIApp 스크립트 붙혔습니다.

App => App 씬의 메인 오브젝트 입니다. App 스크립트 붙혔습니다.

PhotonApp => App에서 포톤에 연결할 네트워킹 담당하는 오브젝트 입니다. PhotonApp 스크립트 붙혔습니다.

 

 

 

1. App.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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
 
public class App : MonoBehaviour
{
    public UIApp uiApp;
    public PhotonApp photonApp;
 
    private void Awake()
    {
        DontDestroyOnLoad(this);
    }
 
    private void Start()
    {
        this.uiApp.startBtn.onClick.AddListener(() =>
        {
            uiApp.statText.text = "서버 연결 중...";
            photonApp.Connect();
            uiApp.startBtn.enabled = false;
        });
 
 
 
        this.photonApp.onConnected = () =>
        {
            uiApp.statText.text = "서버 연결 성공!!";
 
            var oper = SceneManager.LoadSceneAsync("Lobby");
 
            oper.completed += (complete) =>
            {
                GameObject.Find("Lobby").GetComponent<Lobby>().Init();
            };
        };
 
        this.photonApp.onDisConnected = () =>
        {
            uiApp.statText.text = "서버 연결 재시도 중!!";
            this.photonApp.Connect();
 
        };
 
    }
}
 
 
 

 

씬의 메인 스크립트이기 때문에 UI, Photon 스크립트를 가지게 했습니다.

 

UIApp에 있는 시작 버튼에 온클릭 콜백함수를 정의 했습니다.

또한 PhotonApp의 콜백에 들어갈 내용을 정의 했습니다.

 

 

2. ConnectManager

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
 
public class ConnectManager : MonoBehaviourPunCallbacks
{
    public static byte maxPlayer = 5;
    public static string gameVersion = "1.0";
    public static string nickName;
 
    public void Connect()
    {
        PhotonNetwork.AutomaticallySyncScene = true;
 
        PhotonNetwork.GameVersion = gameVersion;
        PhotonNetwork.ConnectUsingSettings();
 
 
        if (PhotonNetwork.IsConnected)
            Debug.Log("연결 됨.");
 
        else
        {
            Debug.Log("연결 실패.");
        }
    }
}
 
 
 

 PhotonApp을 알아보기 전에 ConnectManager.cs를 먼저 알아보겠습니다.

Connect() 메서드의 위의 3줄이 서버에 연결하는 코드 되겠습니다.

 

ConnectManager는 MonoBehaviourPunCallbacks를 상속 받습니다.

photon을 사용하면서 서버에 연결되거나 방에 접속하거나 등등 서버 이벤트가 발생하는데

그 이벤트가 완료 또는 실패하면 자동으로 콜백함수를 실행하게 합니다.

우리는 이 함수들을 오버라이딩 해서 사용하면 됩니다.

ConnectManager를 상속받는 스크립트들은 각 씬에서 필요한 콜백만

따로 구현하게 할 계획입니다.

 

ex) 로비에서는 방 생성, 방 참가를 하는 이벤트가 발생하며 이 콜백 함수들을 정의함.

 

각 씬에 Networking을 담당할 오브젝트, 스크립트가 하나씩은 꼭 있습니다.

그 오브젝트의 이름 앞에 Photon을 붙였습니다. 또한 여기에 붙는

모든 스크립트들은 ConnectManager.cs를 상속받게 했습니다.

 

ConnectManager는 모든 공유하거나 바뀌지 않을 정보를 가지고 있습니다.

게임 버전, 유저 닉네임, 방 최대 플레이어 등등 입니다.

 

또한 Connect기능을 가지고 있는데 이유는 이걸 상속받는 모든 곳에서

이 기능을 사용하게 하기 위함입니다.

 

연결이 끊어지는 것은 어느 곳에서나 발생할 수 있는 일입니다.

게임 도중, 타이틀에서 등등 어디서든 Connect함수를 쓸 수 있게

위로 올렸다고 생각하시면 됩니다.

 

 

3. PhotonApp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using UnityEngine.SceneManagement;
using UnityEngine.Events;
using Photon.Realtime;
 
public class PhotonApp : ConnectManager
{
    public UnityAction onConnected;
    public UnityAction onDisConnected;
 
    public override void OnConnectedToMaster()
    {
        this.onConnected();
    }
 
    public override void OnDisconnected(DisconnectCause cause)
    {
        this.onDisConnected();
    }
}
 
 
 

App에서 네트워킹을 담당할 스크립트 입니다.

App씬은 Start버튼 누르면 서버에 연결하고 다음 씬으로 넘어가는 일밖에 하지 않습니다.

 

여기서 앞에 On이 들어가는 함수들이 이벤트 후에 자동으로 실행 될 함수들 되겠습니다.

저는 여기서 델리게이트를 사용해 그것을 실행하도록 했습니다. 마치 이 클래스 안의

함수를 다른곳에서 정의하겠다!! 같은 느낌 되겠습니다. 정의는 App.cs 에서 했습니다.

 

이유는 연결이 되거나 실패할시에 App의 상태 메시지에 결과를 띄워야 하는데

Find같은 전역에서 찾는 것이 아니라 App에서 UIApp에 있는 텍스트를 변경하기 위해서 입니다.

 

 

 

4. Lobby.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
using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
 
public class Lobby : MonoBehaviour
{
    public UILobby uiLobby;
    public PhotonLobby photonLobby;
 
    public void Init()
    {
        this.uiLobby.Init();
    }
 
    private void Start()
    {
 
        this.uiLobby.joinBtn.onClick.AddListener(() =>
        {
            this.uiLobby.statText.text = "랜덤 방 접속 중...";
 
            this.photonLobby.JoinRandomRoom();
        });
 
 
        this.photonLobby.onJoinRandomRoom = () =>
        {
            this.uiLobby.statText.text = "랜덤 방 접속 성공!!";
 
            PhotonNetwork.LoadLevel("InGame");
        };
 
        this.photonLobby.onRandomFailed = () =>
        {
            this.uiLobby.statText.text = "새로운 랜덤 방 생성 중.";
            this.photonLobby.CreateRandomRoom();
        };
    }
}
 
cs

Lobby.cs 되겠습니다.

App씬에서 커넥팅이 완료된 후 Lobby 씬으로 자동으로 넘어가게 했습니다.

해당 Lobby씬의 메인 오브젝트 입니다.

 

Lobby씬의 역할은 랜덤하게 조인을 요청하고 방이 없다면 자동으로 만들어 들어가게 합니다.

성공적으로 들어갔다면 다음 InGame 씬을 로드하게 합니다.

 

역시나 App과 구조는 동일합니다. Lobby에서도 방에 들어가거나 생성시 상태를 Text로

보여줘야 하기 때문에 Lobby에서 PhotonLobby.cs의 내용을 정의했습니다.

 

 

 

5. PhotonLobby.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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using UnityEngine.Events;
using Photon.Realtime;
 
public class PhotonLobby : ConnectManager
{
    public UnityAction onJoinRandomRoom;
    public UnityAction onRandomFailed;
 
    public void JoinRandomRoom()
    {
        PhotonNetwork.JoinRandomRoom();
    }
 
    public void CreateRandomRoom()
    {
        RoomOptions opt = new RoomOptions();
        opt.MaxPlayers = ConnectManager.maxPlayer;
        PhotonNetwork.CreateRoom(null, opt);
    }
 
    public override void OnJoinedRoom()
    {
        this.onJoinRandomRoom();
    }
    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        this.onRandomFailed();
    }
}
 
 

PhotonLobby.cs 입니다.

역시나 On이 붙은 함수들은 Photon에서 제공하는 콜백함수 되겠습니다.

방을 생성하고 들어가는 것은 PhotonNetwork라는 클래스에서 미리 제공하고 있습니다.

PhotonNetwork.JoinRandomRoom() 은 자동으로 방에 들어가는 기능입니다.

나중에 PhotonNetwork.LoadLevel("레벨") 함수로 같은 방에 있는 유저들을 같은 씬으로 로드시킵니다.

 

PhotonNetwork.CreateRoom("방 이름", 방 옵션 클래스) 은 자동으로 방을 만들어 줍니다.

매개변수로 방 옵션을 받을 수 있는데 대표적으로 maxPlayer 되겠습니다.

ConnectManager에 maxPlayer를 가져와 최대 인원으로 넣어 방을 만들었습니다.

 

구조는 이렇습니다.

Join버튼 클릭시 랜덤방에 입장을 시도한다.

들어갈 방이 있으면 들어가고 없다면 새로운 방을 만들어 입장한다! 입니다.

여기의 콜백 내용은 Lobby.cs에 있으니 보시면 되겠습니다.

 

 

오늘은 여기까지 하겠습니다. 내일은 InGame을 포스팅 해야겠습니다.

내용이 아주..... 이해하는데 쬐끔 힘들었는데 벌써 막막합니다.

 

쓰다보니 코드를 다 올려버려서 나중에 프로젝트 모든 코드가 올라오진 않을까 걱정됩니다 ㅋㅋ

쓰는 방법과 기능만 간추려 올려야겠습니다.

 

랜덤 방 생성과 조인은 여기까지 마치겠습니다.

 

P.S UI쪽 스크립트 코드를 안올렸는데 공개가 꺼려지는게 아니라

내용이 없어요!! 버튼, 텍스트 퍼블릭으로 뚫어놓고 아무것도 안했습니다.

 

'C# > Server' 카테고리의 다른 글

Unity PhotonServer_01 - 프로젝트 세팅.  (0) 2020.06.11
1. Server공부 시작.  (0) 2020.05.30

관련글 더보기