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

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

Photonについて

Photonとは?

Photonとは、リアルタイム通信に関する、ホスティングサービスの一つです。
SDKも整備されており、また、最小の単位であれば無料で試すことができるのでお手軽です。

Photonでできること

  • ルームの作成
  • ルームの検索
  • ルームへの入室
  • プレイヤーのマッチング
  • ネットワークを介した他端末との通信
  • WebHook

その他、もっといろいろな事ができると思いますが、一つ一つ試していきたいなと思っています。

初期設定

アカウントの取得

Photon realtime 公式ホームページ

なにはともあれ、アカウントの取得を行わないと何もできません。
まずは、無料アカウントで試してみましょう。

アカウントを取得すると、ほぼ自動的にAppIDが割り当てられます。
このAppIDは後ほどUnityの方に設定するので、控えておいてください。

Photon Assetの導入

UnityからPhotonへ接続するためのライブラリを導入する必要性があります。
UnityのAsset Storeからダウンロードして、インポートするだけなので、簡単です!

無料版で問題ないはずです

インポートが完了したら、AppIDの設定をしておきます。

これで、事前準備は完了です。
早速、いろいろ試してみましょう!

ルームの作成

まずは、ルームの作成を試してみます。
ざっくりと、コードはこんな感じです。

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
36
using UnityEngine;
using UnityEngine.UI;
using UniRx;

namespace BEFOOL.PhotonTest
{
    public class TestRoomController : MonoBehaviour
    {
        [SerializeField]
        Button buttonCreateRoom;

        private string roomName = "test";

        public void Awake()
        {
            // ここでPhotonに接続している
            // 0.0.1はゲームのバージョンを指定
            // (異なるバージョン同士でマッチングしないように?)
            PhotonNetwork.ConnectUsingSettings("0.0.1");
        }

        public void Start()
        {
            buttonCreateRoom.onClick.AsObservable().Subscribe(
                x => CreateRoom(roomName)
            );
        }


        public void CreateRoom(string roomName)
        {
            bool result = PhotonNetwork.CreateRoom(roomName);
            Debug.Log(result);  // 成功すれば「true」を出力
        }
    }
}

これだけですが、しっかりと「true」の出力を確認できると思います。
正直、まだ全然つながってる感じがしないですが(笑)

ルームへの入室

ルームへの入室までできたら、きっと繋がってる感じが出るに違いない!
続いて、ルームへの入室を試してみましょう。

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
// 先ほどとの差分だけ記載しています
namespace BEFOOL.PhotonTest
{
    public class TestRoomController : MonoBehaviour
    {
        [SerializeField]
        Button buttonCreateRoom, buttonJoinRoom;

        public void Start()
        {
            buttonCreateRoom.onClick.AsObservable().Subscribe(
                x => CreateRoom(roomName)
            );
            buttonJoinRoom.onClick.AsObservable().Subscribe(
                x => JoinRoom(roomName)
            );
        }

        public void JoinRoom(string roomName)
        {
            bool result = PhotonNetwork.JoinRoom(roomName);
            Debug.Log(result);  // 成功すれば「true」を出力
        }
    }
}

さて、これで「join」ボタンを押せば、trueが出力…

JoinRoom failed. Client is not on Master Server or not yet ready to call operations. Wait for callback: OnJoinedLobby or OnConnectedToMaster.

されなーい!
されないどころか、なんかエラー出てる!

エラーで指定されたコールバックを定義しても解決されず、、、 その他のコールバックを入れ込んでみると、原因が判明しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 先ほどとの差分だけ記載しています
namespace BEFOOL.PhotonTest
{
    public class TestRoomController : MonoBehaviour
    {
        public void OnCreatedRoom()
        {
            Debug.Log("room created.");
        }
        public void OnJoinedRoom()
        {
            Debug.Log("joined room.");
        }
    }
}

上記のようなコールバックを定義して、createボタンを押してみると…

room created.
joined room.

なるほど!

roomは作成と同時に参加処理が走っているようですね〜。

試しにもう一つUnityを立ち上げて、片方でcreate、片方でjoinを行ったところ、両方とも成功しました!
しっかりと、photonに接続できているようです。

次回に向けて

次回は、ルームに参加しているメンバーの一覧とか出してみようと思っています。
ではでは!