Unity

[포톤] 콜백 함수들

푸쿠이 2021. 9. 27. 18:00
포톤 튜토리얼 따라해보니

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

 

음.. 포톤 사이트에 있는 튜토리얼을 다 따라해보았는데, 게임 플로우에 필요한 기능이 쉽고 간단하게 정리되어있다.

그래서 이해하기에는 불편함이 없었고, 대충 개념은 다 이해가 되었다.

 

내가 느끼기에는 결국에는 플레이어 간의 동기화가 가장 핵심이다.

 

1. 누가 들어오거나 나갔을 때, 콜백 함수를 받아서 자연스럽게 처리하기.

밑에 콜백 함수만 따로 정리했다.

 

2. 오브젝트 생성 동기화하기.

Photon을 이용해 오브젝트를 생성할 경우, 동기화가 된다.

주의할 것은 프리팹의 name으로 찾기 때문에, Resources 폴더에 같은 이름의 프리팹이 존재해야한다.

PhotonNetwork.Instantiate(this.playerPrefab.name, new Vector3(0f, 5f, 0f), Quaternion.identity, 0);

 

3. PhotonView 컴포넌트에 등록해서 동기화하기.

다음 글에서 동기화에 대해 정리할 예정이다.

 

포톤 로그를 보려면, PhotonSetting에서 Logging 켜기.

 

콜백 함수들이 깔끔하게 정리되어있는 유튜브 영상

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

역시 한글로 설명해주는 게 가장 이해가 잘 된다!

 

깔끔하게 정리해주셔서 이해는 되었지만, 분명히!! 일주일만 포톤에 손 놓고 있어도 바로 까먹을 내 자신을 안다.

내가 보기 편하도록 한번 더 정리했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.UI;

public class NetworkManager : MonoBehaviourPunCallbacks
{
    public Text StatusText;
    public InputField roomInput, NickNameInput;

    void Update()
    {
        // 현재 어떤 상태인지. (정의로 올라가다보면, Enum으로 ClientState가 선언되어있다.)
        StatusText.text = PhotonNetwork.NetworkClientState.ToString();
    }

    #region Public Methods

    public void Connect()
    {
        // 처음에 Photon Online Server에 접속하는 게 가장 중요함!!
        // Photon Online Server에 접속하기.
        PhotonNetwork.ConnectUsingSettings();
    }

    public void Disconnect()
    {
        // 연결 끊기.
        PhotonNetwork.Disconnect();
    }

    public void JoinLobby()
    {
        // 로비에 접속하기.
        PhotonNetwork.JoinLobby();
    }

    // 방을 참가하려면, Connect 되어있거나 Lobby에 참가해있어야 한다.

    public void CreateRoom()
    {
        // 방 생성하고, 참가.
        // 방 이름, 최대 플레이어 수, 비공개 등을 지정 가능.
        PhotonNetwork.CreateRoom(roomInput.text, new RoomOptions { MaxPlayers = 2 });
    }

    public void JoinRoom()
    {
        // 방 참가하기.
        // 방 이름으로 입장 가능.
        PhotonNetwork.JoinRoom(roomInput.text);
    }

    public void JoinOrCreateRoom()
    {
        // 방 참가하는데, 방이 없으면 생성하고 참가.
        PhotonNetwork.JoinOrCreateRoom(roomInput.text, new RoomOptions { MaxPlayers = 2 }, null);
    }

    public void JoinRandomRoom()
    {
        // 방 랜덤으로 참가하기.
        PhotonNetwork.JoinRandomRoom();
    }

    public void LeaveRoom()
    {
        // 방 떠나기.
        PhotonNetwork.LeaveRoom();
    }

    #endregion


    #region Photon Callbacks

    /// <summary>
    /// Photon Online Server에 접속하면 불리는 콜백 함수.
    /// PhotonNetwork.ConnectUsingSettings()가 성공하면 불린다.
    /// </summary>
    public override void OnConnectedToMaster()
    {
        print("서버 접속 완료.");

        // 현재 플레이어 닉네임 설정.
        PhotonNetwork.LocalPlayer.NickName = NickNameInput.text;
    }

    /// <summary>
    /// 연결이 끊기면 불리는 콜백 함수.
    /// PhotonNetwork.Disconnect()가 성공하면 불린다.
    /// </summary>
    /// <param name="cause">끊기는 이유를 알려준다.</param>
    public override void OnDisconnected(DisconnectCause cause)
    {
        print("연결 끊김.");
    }

    /// <summary>
    /// 로비에 접속하면 불리는 콜백 함수.
    /// PhotonNetwork.JoinLobby()가 성공하면 불린다.
    /// 대형 게임이 아니면, 하나의 로비에 여러 개의 방으로 커버가 될 듯하다. 하나의 로비만 필요하면, 굳이 JoinLobby할 필요는 없는 듯.
    /// </summary>
    public override void OnJoinedLobby()
    {
        print("로비 접속 완료.");
    }

    /// <summary>
    /// 방 생성하면 불리는 콜백 함수.
    /// PhotonNetwork.CreateRoom()가 성공하면 불린다.
    /// </summary>
    public override void OnCreatedRoom()
    {
        print("방 만들기 완료.");
    }

    /// <summary>
    /// 방 참가하면 불리는 콜백 함수.
    /// PhotonNetwork.CreateRoom(), PhotonNetwork.JoinedRoom()가 성공하면 불린다.
    /// </summary>
    public override void OnJoinedRoom()
    {
        print("방 참가 완료.");
    }

    /// <summary>
    /// 방 생성 실패하면 불리는 콜백 함수.
    /// PhotonNetwork.CreateRoom()를 호출할 떄, 방 이름이 같은 게 있으면 실패할 수 있다.
    /// </summary>
    /// <param name="returnCode"></param>
    /// <param name="message"></param>
    public override void OnCreateRoomFailed(short returnCode, string message)
    {
        print("방 만들기 실패.");
    }

    /// <summary>
    /// 방 참가 실패하면 불리는 콜백 함수.
    /// PhotonNetwork.JoinRoom()를 호출할 때, 방 인원수가 모두 찼거나 방이 존재하지 않으면 실패할 수 있다.
    /// </summary>
    /// <param name="returnCode"></param>
    /// <param name="message"></param>
    public override void OnJoinRoomFailed(short returnCode, string message)
    {
        print("방 참가 실패.");
    }

    /// <summary>
    /// 방 랜덤 참가 실패하면 불리는 콜백 함수.
    /// PhotonNetwork.JoinRandomRoom()를 호출할 때, 방 인원수가 모두 차있거나 존재하지 않으면 실패할 수 있다.
    /// 다른 사람이 더 빠르게 들어갔거나, 방을 닫았을 수 있다.
    /// </summary>
    /// <param name="returnCode"></param>
    /// <param name="message"></param>
    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        print("방 랜덤 참가 실패.");
    }

    #endregion


    [ContextMenu("정보")]
    void Info()
    {
        if (PhotonNetwork.InRoom)
        {
            print("현재 방 이름 : " + PhotonNetwork.CurrentRoom.Name);
            print("현재 방 인원수 : " + PhotonNetwork.CurrentRoom.PlayerCount);
            print("현재 방 최대인원수 : " + PhotonNetwork.CurrentRoom.MaxPlayers);

            string playerStr = "방에 있는 플레이어 목록 : ";
            for (int i = 0; i < PhotonNetwork.PlayerList.Length; i++) playerStr += PhotonNetwork.PlayerList[i].NickName + ", ";
            print(playerStr);
        }
        else
        {
            print("접속한 인원 수 : " + PhotonNetwork.CountOfPlayers);
            print("방 개수 : " + PhotonNetwork.CountOfRooms);
            print("모든 방에 있는 인원 수 : " + PhotonNetwork.CountOfPlayersInRooms);
            print("로비에 있는지? : " + PhotonNetwork.InLobby);
            print("연결됐는지? : " + PhotonNetwork.IsConnected);
        }
    }
}