質問するログイン新規登録

Q&A

1回答

185閲覧

【Unity】Photon Fusionで 2~3人用のロビーを製作したい

takoyaki0911

総合スコア0

Photon Cloud

Photon Cloudは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つです。ネットワーク通信によるオンラインゲームを開発・運営するために必要なツールがサーバー環境に構築されています。

Photon Server

Photon Serverは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つで、サーバにインストールして使うサーバアプリケーションです。全てカスタマイズが可能で権限管理もできます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2026/08/16 01:52

0

0

実現したいこと

PhotonFusionで
2~3人用のロビーを製作したいです。

ボタンが1つ用意しているロビーシーンと
カメラだけのゲームシーンがあって

ボタンを押すと、ゲームシーンへ遷移します。
そこのシーンのプレイヤー人数が上限になると

ロビーシーンのボタンが押せなくなる様にしたいなと思っています。

発生している問題・分からないこと

ロビーの作り方を知りたい。

該当のソースコード

using Fusion; using FusionIntroShared; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class メニュースクリプト : MonoBehaviour { // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { } // Update is called once per frame void Update() { } public void Botton() { SceneManager.LoadScene("ゲームシーン"); } }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

実現方法がわかりません。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答1

0

こんにちは。以下のコードでどうでしょうか。

using System.Collections.Generic; using Fusion; using Fusion.Sockets; using UnityEngine; using UnityEngine.UI; public class メニュースクリプト : MonoBehaviour, INetworkRunnerCallbacks { [Header("UI設定")] [SerializeField] private Button joinButton; [Header("Fusion設定")] [SerializeField] private NetworkRunner runnerPrefab; [SerializeField] private string targetRoomName = "GameRoom"; // 対象の部屋名 [SerializeField] private int maxPlayers = 3; // 上限人数(2〜3人) [SerializeField] private string gameSceneName = "ゲームシーン"; private NetworkRunner runner; private async void Start() { // NetworkRunnerの生成・初期化 runner = FindFirstObjectByType<NetworkRunner>(); if (runner == null) { runner = Instantiate(runnerPrefab); } runner.AddCallbacks(this); // セッションロビーに参加してルーム一覧の更新を受け取れるようにする await runner.JoinSessionLobby(SessionLobby.Shared); } // ボタンのOnClickイベントに登録するメソッド public async void Botton() { joinButton.interactable = false; // 連続押下防止 // Fusionの機能でゲームへ参加&シーン遷移 var result = await runner.StartGame(new StartGameArgs() { GameMode = GameMode.Shared, // または AutoHostOrClient SessionName = targetRoomName, PlayerCount = maxPlayers, Scene = SceneRef.FromIndex(UnityEngine.SceneManagement.SceneUtility.GetScenePathByBuildIndex(1) != "" ? 1 : 0), // または SceneManager参照 SceneManager = runner.GetComponent<INetworkSceneManager>() }); if (!result.Ok) { Debug.LogError($"参加失敗: {result.ShutdownReason}"); joinButton.interactable = true; } } // --- INetworkRunnerCallbacks の実装 --- // ロビー内のセッション情報が更新されたときに呼ばれる public void OnSessionListUpdate(NetworkRunner runner, List<SessionInfo> sessionList) { bool isFull = false; foreach (var session in sessionList) { if (session.Name == targetRoomName) { // 現在の人数が上限に達しているか確認 if (session.PlayerCount >= maxPlayers) { isFull = true; } break; } } // 人数が上限ならボタンを無効化 if (joinButton != null) { joinButton.interactable = !isFull; } } // 以下、インターフェースの必須メソッド(空でOK) public void OnPlayerJoined(NetworkRunner runner, PlayerRef player) { } public void OnPlayerLeft(NetworkRunner runner, PlayerRef player) { } public void OnInput(NetworkRunner runner, NetworkInput input) { } public void OnInputMissing(NetworkRunner runner, PlayerRef player, NetworkInput input) { } public void OnShutdown(NetworkRunner runner, ShutdownReason shutdownReason) { } public void OnConnectedToServer(NetworkRunner runner) { } public void OnDisconnectedFromServer(NetworkRunner runner, NetDisconnectReason reason) { } public void OnConnectRequest(NetworkRunner runner, NetworkRunnerCallbackArgs.ConnectRequest request, byte[] token) { } public void OnConnectFailed(NetworkRunner runner, NetAddress remoteAddress, NetConnectFailedReason reason) { } public void OnUserSimulationMessage(NetworkRunner runner, SimulationMessagePtr message) { } public void OnSessionOffer(NetworkRunner runner, SessionOffer offer) { } public void OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary<string, object> data) { } public void OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken) { } public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ReliableKey key, System.ArraySegment<byte> data) { } public void OnReliableDataProgress(NetworkRunner runner, PlayerRef player, ReliableKey key, float progress) { } public void OnSceneLoadDone(NetworkRunner runner) { } public void OnSceneLoadStart(NetworkRunner runner) { } }

投稿2026/08/17 07:05

yuyafujiwara

総合スコア124

takoyaki0911

2026/08/17 10:12

丁寧な回答ありがとうございます!
takoyaki0911

2026/08/17 13:05

インターフェースの必須メソッドが不足していたので、何個か追加しました。
takoyaki0911

2026/08/17 13:08

ゲームシーンへの遷移についてhば SceneManager.LoadScene("ゲームシーン"); というような感じとかにはできるんでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問