🙌

Unity Photonチュートリアル その1

2021/09/15に公開

公式チュートリアル
https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/pun-basics-tutorial/intro

0. イントロダクション

https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/pun-basics-tutorial/intro

  • Assetsをインポート
  • AppIDを入力
  • それぞれの用語説明
    • バージョン
    • リージョン
    • ルーム
    • ロビー

バージョンを使ってクライアントごとのバージョンを判別することができる。
リージョンを統一することでオンライン動作の品質を上げる。
複数のプレイヤーは同一ルームでのみ相互に通信ができる。
ルームの一覧を管理しているのはロビー。ロビーでルームを取得/生成してルームに入る。

1. ロビー

https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/pun-basics-tutorial/lobby

シーンに空のオブジェクトを追加し、スクリプトをアタッチする。
まず、このスクリプトではロビーへの接続を行う。

ログレベルをフルに設定することで、接続完了したこと(UserIDを取得したこと)が確認できる。

MonoBehaviorPunCallbacksを実装することで様々なコールバックを受け取ることができる。

今回は、

  • 接続完了時にランダムなルームに入室する
  • 入室できるルームがない場合は新しいルームを作成する
  • ルームに入室したらログ出力

SerializeFieldを使うことで、インスペクタからフィールドの値を変更することができる。
今回は、SerializeFieldを使用してルームの定員を4人に設定し、この値をインスペクタから変更できるようにする。

2. ロビーのUIを作る

https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/pun-basics-tutorial/lobby-ui

ここまでの実装だと、起動時にそのままオンラインになってしまうため、プレイヤーが任意のタイミングでゲームに参加できるようにUIを整備していく。

メニューのUIからボタンのゲームオブジェクトを追加。
ボタンのOnClickコンポーネントにLauncherのスクリプトをアタッチして、Connectの関数を指定する。LauncherのStartでConnectを呼ぶ実装は削除する。
これで、プレイボタンを押したときにConnect関数がコールされるようになる。
この状態で実行してPlayボタンを押すと、ボタンを押したタイミングで接続行われるようになる(ログで確認)

メニューのUIからインプットフィールドのゲームオブジェクトを追加。
インプットフィールド用のスクリプトを追加してインプットフィールドのコンポーネントにアタッチする。
クラスにRquireComponent(typeof(T))を付けることで、このタイプのオブジェクトでないとスクリプトを実行できないようにすることができます。
インプットフィールドのOnValueChangeコンポーネントにオブジェクトにアタッチしたスクリプトをアタッチして、SetPlayerNameの関数を指定する。
これで、テキスト入力時にPlayerPrefsのPlayerNameに入力した値が保存され、開始時に保存したPlayerPrefsのPlayerNameの値を参照してInputFieldに設定するようになる。

最後に接続状態を表すラベルを追加する。
接続状態に合わせてUIの表示・非表示を切り替え、接続中にはConnecting...のラベルを表示する。
まずは、ボタンとインプットフィールドの非表示をしやすいように、オブジェクトをグルーピングする。

メニューのUIからパネルを追加。先ほど追加したボタンとインプットフィールドをドラッグアンドドロップしてパネル以下に配置。
パネル自体にはビジュアルは要らないのでコンポーネントからイメージとキャンバスを削除する。
メニューのUIからテキストを追加し、色やアラインメントの設定をしておく。

Launcherのスクリプトに二つのゲームオブジェクトのプロパティを追加する。

[Tooltip("The Ui Panel to let the user enter name, connect and play")]
[SerializeField]
private GameObject controlPanel;

[Tooltip("The UI Label to inform the user that the connection is in progress")]
[SerializeField]
private GameObject progressLabel;

Launcherのインスペクタから、スクリプトにあるそれぞれのプロパティに対応するゲームオブジェクトをドラッグアンドドロップで設定する。

スクリプトの接続イベントに合わせて、表示非表示の実装を入れて実行すると、接続時にインプットフィールドとボタンが消えてラベルが表示されるようになる。

その2へ続く、

Discussion