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

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

前回

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

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

今回の課題

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

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

参加者の名前の設定

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

PhotonNetwork.playerName

PhotonNetwork.playerName

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 の方を使う必要がありそうです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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";
            }
        }
    }
}

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

次回に向けて

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