Unity C#とPUN2で参加人数に応じてボタンを無効化する方法|Photonネットワーク管理の基本

C言語関連

UnityでPUN2を使ったオンラインゲームを制作していると、参加人数や生成されたネットワークオブジェクトの状態によって、UIボタンの操作可否を切り替えたい場面があります。例えば、最初に入室したプレイヤーだけがゲーム開始ボタンを押せるようにし、2人目以降のプレイヤーはボタンを押せない状態にする仕組みです。

この記事では、Photon PUN2でルーム内のプレイヤー数やネットワークオブジェクトの生成状態を確認し、Unity UIのButtonのinteractableを制御する方法について解説します。

PUN2でボタン操作を制限する基本的な考え方

PUN2を利用したマルチプレイでは、各クライアントが同じゲーム状態を共有する必要があります。そのため、単純に自分の端末だけでボタンを無効化すると、他のプレイヤー側ではまだ押せる状態になる可能性があります。

今回のように「最初に入ったプレイヤーだけボタンを押せる」という仕様の場合、Photon側で管理しているルーム情報を利用するのが一般的です。

PUN2ではPhotonNetwork.PlayerListやPhotonNetwork.CurrentRoom.PlayerCountを使うことで、現在の参加人数を取得できます。この値を利用してボタンの有効・無効を切り替えます。

ルーム参加人数でButtonのinteractableを変更する方法

Unity UIのButtonにはinteractableというプロパティがあります。この値をfalseに設定すると、ボタンを表示したままクリックできない状態にできます。

例えば、ルーム内の人数が1人の場合だけボタンを有効にする場合は、以下のような処理になります。

using Photon.Pun;
using UnityEngine;
using UnityEngine.UI;

public class MenuButtonController : MonoBehaviour
{
public Button startButton;

void Update()
{
if (PhotonNetwork.InRoom)
{
startButton.interactable = PhotonNetwork.CurrentRoom.PlayerCount == 1;
}
}
}

この処理では、ルーム参加者が1人ならボタンを押せる状態になり、2人以上になると自動的に押せなくなります。

ゲーム開始権限をMasterClientに持たせる方法

PUN2では、ルーム内で最初に入ったプレイヤーがMasterClientになります。ゲーム開始やオブジェクト生成などの管理はMasterClientだけが行う設計にすると、同期処理が安定します。

そのため、ボタン制御では人数判定よりもMasterClient判定を使う方法もよく利用されます。

if (PhotonNetwork.IsMasterClient)
{
startButton.interactable = true;
}
else
{
startButton.interactable = false;
}

この方法では、2番目以降に参加したプレイヤーは自動的にボタン操作ができなくなります。ゲーム開始ボタンや部屋管理用のボタンでは、この方式が特に適しています。

ネットワークオブジェクトAの生成状態で管理する方法

質問のように、ゲームシーンへ移動すると自動的にネットワークオブジェクトAを生成する仕組みの場合、そのオブジェクトの存在を確認してボタン制御する方法もあります。

PUN2ではPhotonNetwork.FindObjectsOfType<PhotonView>などを利用してネットワークオブジェクトを確認できます。ただし、単純な参加人数制御ならPlayerCountやMasterClientを利用した方が処理は簡単です。

例えば「部屋に1つしか存在できないプレイヤーキャラクターを生成する」という場合は、MasterClientだけがPhotonNetwork.Instantiateを実行する設計にすると重複生成を防げます。

シーン移動時の同期で注意するポイント

PUN2ではシーン移動のタイミングによって、参加者全員の状態が一致しない場合があります。そのため、PhotonNetwork.LoadLevelを利用してシーン同期を行うことが重要です。

また、ゲーム開始ボタンを押した直後にPhotonNetwork.Instantiateを実行する場合も、生成処理はMasterClient側で管理する方が安全です。

例えば、全員がゲームシーンに移動した後、MasterClientだけがネットワークオブジェクトAを生成し、その生成完了を他プレイヤーへ同期するという流れにすると、予期しない重複生成を防げます。

まとめ

UnityとPUN2で最初のプレイヤーだけがボタンを操作できるようにする場合、PhotonNetwork.CurrentRoom.PlayerCountやPhotonNetwork.IsMasterClientを利用してButtonのinteractableを制御する方法が一般的です。

特にゲーム開始やネットワークオブジェクト生成など、ルーム全体に影響する処理はMasterClientに権限を持たせる設計がおすすめです。

PUN2では各プレイヤーの端末だけで判断するのではなく、Photonのルーム情報を基準に処理することで、複数人が参加する環境でも安定したオンラインゲームを作成できます。

コメント

タイトルとURLをコピーしました