本日はPhotonのチュートリアル記事です。
〇Photonとは?
PhotonはUnityでのマルチユーザーアプリの実現のためのSDKとその仕組みを指します。
オリジナルのチュートリアルは下記になります。
〇UIの作成
これまでの状態でルームに接続し、ルームを退出する機能を作成しています。
しかしほとんどの場合のゲームではルームに接続するタイミングをユーザー自身に選択させる必要があります。(アプリを起動したときにいきなりルームに接続してマルチプレイヤーになることはよくない)
今回はルームに接続するためのUIを作成します。
①Launcherシーンを開きます。
②hierarchyウィンドウから右クリック、[UI]→[Button]でボタンを作成し[Play Button]という名前を付けます。
これによって[Canvas]と[Button]が作成されました。
③[Play Button]のインスペクターウィンドウから[Button]の[OnClick()]にイベントを追加します。
④[Launcher]の[connect()]を指定します。
これでButtonをクリックすることでルームに接続されるようになりました。
⑤[Launcher]コンポーネントのStart関数から[Connect()]をコメントアウトします。
void Start() { //Connect(); }
Unityでシーンを実行してボタンを押すことで接続されることを確認します。
〇プレイヤー名
マルチプレイヤーゲームにおいて必要なことの一つに相手の名前がわかることです。
これは、誰が今ルームに入っているのかを確認するうえでも大切な要素になります。
プレイヤー情報を管理するスクリプトを書きます。
①新規スクリプトを作成して[PlayerNameInputField]と名付けます。
②[PlayerNameInputField]コンポーネントを開き編集します。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Photon.Pun; using Photon.Realtime; using System.Collections; using ADBannerView = UnityEngine.iOS.ADBannerView; namespace Com.MyCompany.MyGame { ///<summary> ///Player name input field.Let the user input his name,will appear above the player in the game. /// </summary>> [RequireComponent(typeof(InputField))] public class PlayerNameInputField : MonoBehaviour { #region Private Constants //Store the PlayerPref Key to avoid types private const string playerNamePrefKey = "PlayerName"; #endregion #region MonoBehaviour CallBacke void Start() { string defaultName = string.Empty; InputField _inputField = this.GetComponent<InputField>(); if (_inputField != null) { if (PlayerPrefs.HasKey(playerNamePrefKey)) { defaultName = PlayerPrefs.GetString(playerNamePrefKey); _inputField.text = defaultName; } } PhotonNetwork.NickName = defaultName; } #endregion #region Public Methods public void SetPlayerName(string value) { if (string.IsNullOrEmpty(value)) { Debug.LogError("Player Name is null orempty"); return; } PhotonNetwork.NickName = value; PlayerPrefs.SetString(playerNamePrefKey,value); } #endregion } }
プレイヤー名は各自が必ず持っていることが必要です。
RequireComponent(typeof(InputField));
ではInputFieldを強制的に追加する処理を行います。
PlayerPrefs.HasKey()、 PlayerPrefs.GetString() と PlayerPrefs.SetString():
PlayerPrefsはKey、Valueでデータを保存するものでプレイヤー名を保存する際に使用します。
プレイヤー名が既に存在している場合ユーザーは新たに入力することなく以前使用したプレイヤー名がそのまま使用されます。
PhotonNetwork.NickName:はPhotonのネットワーク上でニックネームを指定します。
〇プレイヤー名のUIを作成
①hierarchyウィンドウから[UI]→[Input Field]を選択し新規[Input Field]を作成し、その名前を[Name InputField]にします。
②[Name InputField]の子オブジェクト[Placeholder]の[Text]に[Enter your Name...]を入力します。
③[Name InputField]に[PlayerNameInputField]コンポーネントをアタッチします。
④[Name InputField]オブジェクトの[On Value Changed (String)]イベントに自身の[PlayerNameInputField]をアタッチします。
⑤イベントに[SetPlayerName]を指定します。
シーンを保存します。 以上でUIが完成しました。
シーンを実行するとユーザー名の入力テキストボックスとボタンが表示されます。
ボタンをクリックすることでルームが呼び出されます。