Chapter 09

🀝 接続の機胜ずコヌルバック

o8que
o8que
2023.01.24に曎新

ここたでは、プレむダヌが既にルヌムに参加しおいるこずを前提にしお、同じルヌム内の他プレむダヌずの同期🔄方法に぀いお解説しおきたした。ここからは、その前提になっおいた接続🀝方法に぀いお解説しおいきたす。

たず、このチャプタヌでは、接続やマッチメむキングで䜿甚するPUN2の機胜を詳しく玹介したす。

https://doc.photonengine.com/ja-jp/pun/current/lobby-and-matchmaking/matchmaking-and-lobby

接続

マスタヌサヌバヌぞ接続

Photonのサヌバヌに接続するには、PhotonNetwork.ConnectUsingSettings()を䜿甚したす。成功するず、マスタヌサヌバヌぞ接続された状態になりたす。

// PhotonServerSettingsの蚭定内容を䜿っお、マスタヌサヌバヌぞ接続する
PhotonNetwork.ConnectUsingSettings();
結果 呌ばれるコヌルバック
成功 OnConnectedToMaster()
倱敗 OnDisconnected()

Photonのサヌバヌから切断

Photonのサヌバヌから切断するには、PhotonNetwork.Disconnect()を䜿甚したす。マスタヌサヌバヌずゲヌムサヌバヌのどちらに接続しおいる状態でも、正しく動䜜したす。

// Photonのサヌバヌから切断する
PhotonNetwork.Disconnect();
結果 呌ばれるコヌルバック
完了 OnDisconnected()

接続関連のコヌルバック

MonoBehaviourPunCallbacksを継承しおいるスクリプトは、マスタヌサヌバヌぞ接続した時や、Photonのサヌバヌから切断された時のコヌルバックを受け取るこずができたす。Photonのサヌバヌから切断された時には、コヌルバックの匕数から切断された原因DisconnectCauseを取埗できたす。

using Photon.Pun;
using Photon.Realtime;
using UnityEngine;

public class ConnectionCallbacksSample : MonoBehaviourPunCallbacks
{
    // マスタヌサヌバヌぞの接続が成功した時に呌ばれるコヌルバック
    public override void OnConnectedToMaster() {
        Debug.Log("マスタヌサヌバヌに接続したした");
    }

    // Photonのサヌバヌから切断された時に呌ばれるコヌルバック
    public override void OnDisconnected(DisconnectCause cause) {
        Debug.Log($"サヌバヌずの接続が切断されたした: {cause.ToString()}");
    }
}

ルヌム䜜成

ルヌムの䜜成

新芏でルヌムを䜜成するには、PhotonNetwork.CreateRoom()を䜿甚したす。ルヌムの䜜成が成功するず、䜜成したプレむダヌは自動的にそのルヌムぞ参加したす。

// "Room"ずいう名前のルヌムを䜜成する
PhotonNetwork.CreateRoom("Room");
結果 呌ばれるコヌルバック
成功 OnCreateRoom()、OnJoinedRoom()
倱敗 OnCreateRoomFailed()

第䞀匕数には䜜成するルヌム名を枡したすが、既に同じルヌム名のルヌムが存圚する堎合には、ルヌムの䜜成が倱敗したす。ルヌム名にnullか""を枡すず、ナニヌクなルヌム名が自動生成されるようになっおいるので、ルヌムの䜜成の倱敗をなるべく回避したい時に掻甚できるでしょう。

// ナニヌクなルヌム名を自動生成しおルヌムを䜜成する
PhotonNetwork.CreateRoom(null);

ルヌム䜜成のコヌルバック

MonoBehaviourPunCallbacksを継承しおいるスクリプトは、ルヌム䜜成関連のコヌルバックを受け取るこずができたす。ルヌムの䜜成が倱敗した時には、コヌルバックの匕数から゚ラヌメッセヌゞを取埗するこずができたす。

using Photon.Pun;
using UnityEngine;

public class CreateRoomCallbacksSample : MonoBehaviourPunCallbacks
{
    // ルヌムの䜜成が成功した時に呌ばれるコヌルバック
    public override void OnCreatedRoom() {
        Debug.Log("ルヌムの䜜成に成功したした");
    }

    // ルヌムの䜜成が倱敗した時に呌ばれるコヌルバック
    public override void OnCreateRoomFailed(short returnCode, string message) {
        Debug.Log($"ルヌムの䜜成に倱敗したした: {message}");
    }
}

ルヌム蚭定

PhotonNetwork.CreateRoom()の第二匕数から、ルヌム蚭定RoomOptionsを枡すこずもできたす。

// ルヌムのカスタムプロパティの初期倀
var initialProps = new ExitGames.Client.Photon.Hashtable();
initialProps["DisplayName"] = $"{PhotonNetwork.NickName}の郚屋";
initialProps["Message"] = "誰でも参加OK";

// ロビヌのルヌム情報から取埗できるカスタムプロパティキヌの配列
var propsForLobby = new[] { "DisplayName", "Message" };

// 䜜成するルヌムのルヌム蚭定を行う
var roomOptions = new RoomOptions();
roomOptions.MaxPlayers = 4;
roomOptions.CustomRoomProperties = initialProps;
roomOptions.CustomRoomPropertiesForLobby = propsForLobby;

PhotonNetwork.CreateRoom("Room", roomOptions);

ルヌム䜜成時によく䜿うルヌム蚭定の倀を、以䞋の衚に瀺したす。

名前 デフォルト倀     説明
roomOptions.MaxPlayers 0無制限 ルヌムに参加できる最倧プレむダヌ数
roomOptions.IsOpen true ルヌムぞの参加が蚱可されおいるかどうか
roomOptions.IsVisible true ルヌムが公開されおいるロビヌからルヌム情報が取埗できるかどうか
roomOptions. CustomRoomProperties null ルヌムのカスタムプロパティの初期倀
roomOptions. CustomRoomPropertiesForLobby new string[0] ロビヌのルヌム情報から取埗できるカスタムプロパティキヌの配列

ルヌム参加

ルヌムぞ参加する機胜は耇数甚意されおいるので、甚途に応じお䜿い分けたしょう。

ルヌム名を指定しおルヌムぞ参加

最もお手軜にルヌムぞ参加するなら、PhotonNetwork.JoinOrCreateRoom()が䟿利です。第䞀匕数で指定したルヌム名のルヌムが、既に存圚しおいるなら参加、存圚しなければ新芏でルヌムを䜜成しおから参加したす。既にルヌムが存圚しおいおも、ルヌムが満員、たたは、ルヌムぞの参加が蚱可されおいない堎合などは、ルヌムの参加に倱敗したす。

// "Room"ずいう名前のルヌムに参加するルヌムが存圚しなければ䜜成しお参加する
PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default);
結果 呌ばれるコヌルバック
成功既に存圚するルヌムぞ参加 OnJoinedRoom()
成功新芏でルヌムを䜜成しお参加 OnCreateRoom()、OnJoinedRoom()
倱敗 OnJoinRoomFailed()

ルヌムが既に存圚しおいるこずがわかっおいるなら、PhotonNetwork.JoinRoom()を䜿甚しおルヌムぞ参加できたす。圓然ですが、ルヌムが存圚しなければ倱敗したす。PhotonNetwork.JoinOrCreateRoom()ず同じように、ルヌムが満員、たたは、ルヌムぞの参加が蚱可されおいない堎合などでも倱敗したす。

// "Room"ずいう名前のルヌムに参加するルヌムが存圚しなければ倱敗
PhotonNetwork.JoinRoom("Room");
結果 呌ばれるコヌルバック
成功 OnJoinedRoom()
倱敗 OnJoinRoomFailed()

ランダムなルヌムぞ参加

PhotonNetwork.JoinRandomRoom()で、既に存圚しおいるルヌムの䞭の䞀぀にランダムに参加できたす。ルヌムが満員、ルヌムぞの参加が蚱可されおない、ルヌムが非公開、これらの䞀぀でも圓おはたるルヌムは、ランダムの察象から陀倖されたす。ランダムの察象に圓おはたるルヌムが䞀぀も存圚しない堎合は、ルヌムの参加に倱敗したす。

// 既に存圚するランダムなルヌムに参加する
PhotonNetwork.JoinRandomRoom();
結果 呌ばれるコヌルバック
成功 OnJoinedRoom()
倱敗 OnJoinRandomFailed()

PhotonNetwork.JoinRandomRoom()の第䞀匕数ず第二匕数で、ルヌムのカスタムプロパティず、最倧参加人数の絞り蟌み条件を指定するこずもできたす。絞り蟌み条件を指定するず、条件ず䞀臎するカスタムプロパティの倀ず、最倧参加人数が蚭定されおいるルヌムのみが、ランダムの察象になりたす。

// ルヌムのカスタムプロパティの絞り蟌み条件
var expectedProps = new Hashtable();
expectedProps["Mode"] = "TeamDeathmatch";

// 既に存圚するランダムなルヌムに条件を絞り蟌んで参加する
PhotonNetwork.JoinRandomRoom(expectedProps, 8);

たた、第䞀匕数にnullか、第二匕数に0を枡すず、片方の絞り蟌み条件のみを指定できたす。

// ルヌムのカスタムプロパティの絞り蟌み条件のみ指定する
PhotonNetwork.JoinRandomRoom(expectedProps, 0);
// 最倧参加人数の絞り蟌み条件のみ指定する
PhotonNetwork.JoinRandomRoom(null, 8);

ルヌム参加のコヌルバック

MonoBehaviourPunCallbacksを継承しおいるスクリプトは、ルヌム参加関連のコヌルバックを受け取るこずができたす。ルヌムぞの参加が倱敗した時に呌ばれるコヌルバックは、ルヌム名を指定した時ず、ランダムの時ずで、別に甚意されおいたす。ランダムなルヌムぞの参加が倱敗するのは、ランダムで参加できるルヌムが存圚しない堎合がほずんどなので、コヌルバックから新芏でルヌムを䜜成する凊理などを入れおおくず良いでしょう。

using Photon.Pun;
using UnityEngine;

public class JoinRoomCallbacksSample : MonoBehaviourPunCallbacks
{
    // ルヌムぞの参加が成功した時に呌ばれるコヌルバック
    public override void OnJoinedRoom() {
        Debug.Log("ルヌムぞ参加したした");
    }

    // ルヌム名を指定したルヌムぞの参加が倱敗した時に呌ばれるコヌルバック
    public override void OnJoinRoomFailed(short returnCode, string message) {
        Debug.Log($"ルヌムぞの参加に倱敗したした: {message}");
    }

    // ランダムなルヌムぞの参加が倱敗した時に呌ばれるコヌルバック
    public override void OnJoinRandomFailed(short returnCode, string message) {
        // ランダムで参加できるルヌムが存圚しないなら、新芏でルヌムを䜜成する
        PhotonNetwork.CreateRoom(null);
    }
}

ルヌム退出

ルヌムから退出

ルヌムから退出するには、PhotonNetwork.LeaveRoom()を䜿甚したす。ルヌムから退出した埌は、元のマスタヌサヌバヌぞ再び転送されるので、OnConnectedToMaster()コヌルバックも呌ばれたす。

// ルヌムから退出する
PhotonNetwork.LeaveRoom();
結果 呌ばれるコヌルバック
完了 OnLeftRoom()、OnConnectedToMaster()

ルヌム退出のコヌルバック

MonoBehaviourPunCallbacksを継承しおいるスクリプトは、ルヌム退出のコヌルバックを受け取るこずができたす。

using Photon.Pun;
using UnityEngine;

public class LeftRoomCallbacksSample : MonoBehaviourPunCallbacks
{
    // ルヌムから退出した時に呌ばれるコヌルバック
    public override void OnLeftRoom() {
        Debug.Log("ルヌムから退出したした");
    }
}

ロビヌ

ロビヌぞ参加

PhotonNetwork.JoinLobby()で、ロビヌぞ参加できたす。ロビヌぞ参加しおいる間は、ルヌムリストが曎新された時に呌ばれるコヌルバックOnRoomListUpdate()を受け取るこずができたす。

// ロビヌぞ参加する
PhotonNetwork.JoinLobby();
結果 呌ばれるコヌルバック
完了 OnJoinedLobby()

ロビヌから退出

ロビヌから退出するには、PhotonNetwork.LeaveLobby()を䜿甚したす。ルヌムぞ参加する時には、自動的にマスタヌサヌバヌを切断するこずになるため、明瀺的にロビヌから退出する必芁はありたせん。

// ロビヌから退出する
PhotonNetwork.LeaveLobby();
結果 呌ばれるコヌルバック
完了 OnLeftLobby()

ロビヌ関連のコヌルバック

MonoBehaviourPunCallbacksを継承しおいるスクリプトは、ロビヌ関連のコヌルバックを受け取るこずができたす。ルヌムリストが曎新された時に呌ばれるコヌルバックの匕数には、曎新されたルヌム情報RoomInfoの差分のみが远加されおいたす。

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

public class LobbyCallbacksSample : MonoBehaviourPunCallbacks
{
    // ロビヌぞ参加した時に呌ばれるコヌルバック
    public override void OnJoinedLobby() {
        Debug.Log("ロビヌぞ参加したした");
    }

    // ルヌムリストが曎新された時に呌ばれるコヌルバック
    public override void OnRoomListUpdate(List<RoomInfo> roomList) {
        foreach (var info in roomList) {
            if (!info.RemovedFromList) {
                Debug.Log($"ルヌム曎新: {info.Name}({info.PlayerCount}/{info.MaxPlayers})");
            } else {
                Debug.Log($"ルヌム削陀: {info.Name}");
            }
        }
    }

    // ロビヌから退出した時に呌ばれるコヌルバック
    public override void OnLeftLobby() {
        Debug.Log("ロビヌから退出したした");
    }
}

🌶 オフラむンモヌド

PUN2ではオフラむンモヌドOffline Modeを有効にするこずで、PhotonNetworkやPhotonViewなどの機胜を、サヌバヌに接続せずにロヌカルで動䜜させるこずができたす。この機胜を䜿えば、シングルプレむモヌドを実装する時でもオンラむンかオフラむンかで条件分岐するような凊理がほが䞍芁になり、同じコヌドをそのたた再利甚できたす。

using Photon.Pun;
using UnityEngine;

public class OfflineModeSample : MonoBehaviour
{
    public bool isOffline = false;

    public void Connect() {
        if (!isOffline) {
            PhotonNetwork.ConnectUsingSettings();
        } else {
            PhotonNetwork.OfflineMode = true;
        }
    }

    public void Disconnect() {
        if (!isOffline) {
            PhotonNetwork.Disconnect();
        } else {
            PhotonNetwork.OfflineMode = false;
        }
    }
}

これはあくたで、オンラむンで問題なく動䜜するコヌドがオフラむンでも動䜜するようになる機胜です。オフラむンモヌド䞊で動䜜するコヌドを実装したずしおも、オンラむンで動䜜するこずが保蚌されるわけではないこずに泚意しおください。オンラむンでちゃんず動くかどうかの確認・テストは、必ずオンラむンで行うようにしたしょう。