Photonでルームに参加しているメンバーの一覧を出してみる

木内智史之介(シャッチョー)
ミンカさんけっこんしてくださいおねがいします(ズザー SEGAさん、DIVAの筐体ください(ズザー

前回

Photonでルームの作成から入室まで

前回の記事では、ルームの作成や入室処理を実装してみました。
今回は、この流れで、ルームに参加しているメンバーの一覧を表示したいと思います。

今回の課題

  • 参加者の名前の設定
  • 参加者の一覧を出す
  • 入退室時のコールバックを活用する

今回の課題としてはこんな感じです。
レッツゴー!

参加者の名前の設定

参加者の一覧を出すには、まず、その参加者を特定するために、名前を仮でもいいので定義する必要性があります。

PhotonNetwork.playerName

PhotonNetwork.playerName

プレイヤーのニックネームを、入室したRoom内の全員に同期します。これはPhotonPlayer.nameを設定します。
playerNameはただのニックネームで、一意である必要はなく、アカウントと共にバックアップする必要もありません。
この値はいつ(たとえば接続前に)設定しても、プレイしている相手の誰に対しても有効です。
プレイヤー名には PhotonPlayer.name を使ってアクセスしてください。
PhotonNetwork.otherPlayersは他プレイヤーの一覧です。含んでいるどれもが、リモートプレイヤーが設定したplayerNameです。

一意である必要性はないんですね!
それであれば、適当に設定するんで大丈夫そうです。

今回は、こんな感じで適当に設定されるようにしておきます。

using UnityEngine;
namespace BEFOOL.PhotonTest
{
public class TestRoomController : MonoBehaviour
{
public void Awake()
{
PhotonNetwork.ConnectUsingSettings("0.0.1");
// 適当にニックネームを設定
PhotonNetwork.playerName = "guest" + UnityEngine.Random.Range(1000, 9999);
}
}
}

参加者の一覧を表示する

ルームへの他参加者は PhotonNetwork.otherPlayers 内に格納されているようです。

PhotonNetwork.otherPlayers

PhotonNetwork.otherPlayers

ローカルプレイヤーを含まない、他のPhotonPlayerです。

なるほど、自分は含んでいないんですね。

PhotonNetwork.playerList

PhotonNetwork.playerList

PhotonPlayerすべての一覧です。ローカルプレイヤーも含みます。

お!こちらはプレイヤー自身も含んでいるんですね!
今回は、こちらを使用する事にしましょう。

参加者の一覧を出すためのコーディング

参加者の一覧を表示するにあたって、ルーム入退出時に呼び出されるコールバックがあると便利そうですよね!
先ほどの、OnJoinedRoom はどうもローカルプレイヤーのみに反応しているようなので、 リモートプレイヤーに反応する OnPhotonPlayerConnected の方を使う必要がありそうです。

namespace BEFOOL.PhotonTest
{
public class TestRoomController : MonoBehaviour
{
[SerializeField]
Text joinedMembersText;
// <summary>
// リモートプレイヤーが入室した際にコールされる
// </summary>
public void OnPhotonPlayerConnected(PhotonPlayer player)
{
Debug.Log(player.name + " is joined.");
UpdateMemberList();
}
// <summary>
// リモートプレイヤーが退室した際にコールされる
// </summary>
public void OnPhotonPlayerDisconnected(PhotonPlayer player)
{
Debug.Log(player.name + " is left.");
UpdateMemberList();
}
public void UpdateMemberList()
{
joinedMembersText.text = "";
foreach (var p in PhotonNetwork.playerList)
{
joinedMembersText.text += p.name + "\n";
}
}
}
}

うん。大丈夫そうですね!

次回に向けて

次回は、他プレイヤーが接続してきている事をハッキリ確認できたので、 画面上にキャラクターモデルを配置して同期をとるところまで試してみようと思います。