本日は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が完成しました。

シーンを実行するとユーザー名の入力テキストボックスとボタンが表示されます。
ボタンをクリックすることでルームが呼び出されます。