PUN Classic (v1)、PUN 2、Boltはメンテナンスモードとなっております。Unity2022についてはPUN 2でサポートいたしますが、新機能が追加されることはありません。お客様のPUNプロジェクトおよびBoltプロジェクトが停止することはなく、将来にわたってパフォーマンス性能が落ちることはありません。 今後の新しいプロジェクトについては、Photon FusionまたはQuantumへ切り替えていただくようよろしくお願いいたします。

EnableLanBroadcastと例

Lan Broadcast処理は、自分のLAN上でのみゲームセッションをパブリッシュするための興味深い方法で同じネットワーク上のプレイヤーのマッチが可能です。
セッションブロードキャストは、プレイヤーをローカルで参加させたいが、たとえばゲーム情報を公開したくない場合に最適な方法です。また、Proバージョンを使用している場合には、接続時にサーバーIPの入力が不要となります。

ユーティリティメソッドBoltNetwork.EnableLanBroadcast() (APIリンク)を呼び出すだけで、ブロードキャスター内のビルトを使用してゲームセッションをパブリッシュし、アクティブなサーバーからのセッションをリッスンできます。これによって内部ブロードキャスターが初期化されるため、サーバーを実行し続け、またクライアント上のセッションについて確認する必要があります。

Photon Bolt Free

Photon Bolt Freeを使用した以下のコードでは、Photonセッションをプライベートで作成し、LAN経由でパブリッシュする方法を示しています。これは、非表示のルームを作成し、LANブロードキャストを有効化することによって実行されます。
このケースには2つの主要な点があります:(1)ルームが非表示でも、LAN外のクライアントも含めて、IDを持つすべてのクライアントはセッションに通常どおり参加できます。これは、セッションは常にCloudサービスにパブリッシュされるためです。(2)Freeバージョンを使用しているため、プレイヤーがローカルのみでも常にインターネット接続が必要です。

以下のスクリプトでは、ピアをサーバーまたはクライアントとして開始するボタンを含む、単純なMenuUIを示しています。
起動するとすぐに、サーバーは新規のPhotonセッションを作成し、それを私達が非表示にしたか(props.IsVisible = false;)、そしてそれをPhoton Cloudにパブリッシュしたかを監視します。
いずれの場合でも、BoltStartDone()の最後にBoltNetwork.EnableLanBroadcast()が呼び出され、セッションブロードキャスターがトリガーされます。

最終的には、ルーターのブロードキャストポートにクライアントがブロードキャスト検索を送信するのを確認します。
同じLAN上で実行中のアクティブなサーバーがある場合、そのサーバーは固有のセッション情報と共に応答するはずです。
UIはJoin ボタンとともに追加され、このボタンはゲームサーバーとの接続を開始します。
この時点で、パブリックノPhotonセッションに参加するのと全く同様に接続が発生します。
このため、繰り返しになりますが、ルームに入室するにはインターネットに接続する必要があります。

C#

using System;
using Bolt.Matchmaking;
using Bolt.Photon;
using UdpKit;
using UdpKit.Platform;
using UnityEngine;

public class MenuLanBroadcast : Bolt.GlobalEventListener
{
    private Rect _labelRoom = new Rect(0, 0, 140, 75);
    private GUIStyle _labelRoomStyle;

    private void Awake()
    {
        Application.targetFrameRate = 60;
        BoltLauncher.SetUdpPlatform(new PhotonPlatform());

        _labelRoomStyle = new GUIStyle()
        {
            fontSize = 20,
            fontStyle = FontStyle.Bold,
            normal =
                {
                    textColor = Color.white
                }
        };
    }

    public override void BoltStartBegin()
    {
        BoltNetwork.RegisterTokenClass<PhotonRoomProperties>();
    }

    public override void BoltStartDone()
    {
        if (BoltNetwork.IsServer)
        {
            string matchName = Guid.NewGuid().ToString();

            var props = new PhotonRoomProperties();

            props.IsOpen = true;
            props.IsVisible = false; // Make the session invisible

            props["type"] = "game01";
            props["map"] = "Tutorial1";

            BoltMatchmaking.CreateSession(
                sessionID: matchName,
                sceneToLoad: "Tutorial1",
                token: props
            );
        }

        // Broadcast and Listen for LAN Sessions
        BoltNetwork.EnableLanBroadcast();
    }

    public override void SessionListUpdated(Map<Guid, UdpSession> sessionList)
    {
        BoltLog.Info("Session list updated: {0} total sessions", sessionList.Count);
    }

    // GUI

    public void OnGUI()
    {
        GUILayout.BeginArea(new Rect(10, 10, Screen.width - 20, Screen.height - 20));

        if (BoltNetwork.IsRunning == false)
        {
            if (ExpandButton("Start Server"))
            {
                BoltLauncher.StartServer();
            }

            if (ExpandButton("Start Client"))
            {
                BoltLauncher.StartClient();
            }
        }
        else if (BoltNetwork.IsClient)
        {
            SelectRoom();
        }

        GUILayout.EndArea();
    }

    private void SelectRoom()
    {
        GUI.Label(_labelRoom, "Looking for rooms:", _labelRoomStyle);

        if (BoltNetwork.SessionList.Count > 0)
        {
            GUILayout.BeginVertical();
            GUILayout.Space(30);

            foreach (var session in BoltNetwork.SessionList)
            {
                UdpSession udpSession = session.Value;

                var label = string.Format("Join: {0} | {1}", udpSession.HostName, udpSession.Source);

                if (ExpandButton(label))
                {
                    BoltMatchmaking.JoinSession(udpSession);
                }
            }

            GUILayout.EndVertical();
        }
    }

    private bool ExpandButton(string text)
    {
        return GUILayout.Button(text, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
    }
}

Photon Bolt Pro

Photon Bolt Proを使用して、同様の挙動を実現することも可能です。
以下のスクリプトは前述のスクリプトと非常に似ています。ただし、今回はProバージョンの直接接続機能が使用されています。
この場合、ゲームセッションデータもリッスンしますが、このデータはLAN上でのみ利用できます。
複製したコードのほとんどを削除し、主な変更点のみをハイライトしています。スクリプトの残りの部分は同一です。

C#

public class MenuLanBroadcastPro : Bolt.GlobalEventListener {

    private void Awake()
    {
        //...
        // Change the target Udp Platform
        BoltLauncher.SetUdpPlatform(new DotNetPlatform());
        // ...
    }

    public override void BoltStartDone()
    {
        if (BoltNetwork.IsServer)
        {
            // There is no need to setup the properties of the Game Session
            // just create one normally

            string matchName = Guid.NewGuid().ToString();

            BoltMatchmaking.CreateSession(
                sessionID: matchName,
                sceneToLoad: "Tutorial1"
            );
        }

        // Broadcast and Listen for LAN Sessions
        BoltNetwork.EnableLanBroadcast();
    }

    // ...
}

補足

Androidデバイスで作業している場合、デフォルトではOSはブロードキャストメッセージの送信やリッスンを許可しません。このため、この許可を
Androidマニフェストファイルに追加する必要があります:<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">

Back to top