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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答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 10:12
2026/08/17 13:05
2026/08/17 13:08