夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Photonのチュートリアルをやる その④ ルームへの接続UI

本日はPhotonのチュートリアル記事です。

〇Photonとは?

PhotonはUnityでのマルチユーザーアプリの実現のためのSDKとその仕組みを指します。

オリジナルのチュートリアルは下記になります。

doc.photonengine.com

〇UIの作成

これまでの状態でルームに接続し、ルームを退出する機能を作成しています。

しかしほとんどの場合のゲームではルームに接続するタイミングをユーザー自身に選択させる必要があります。(アプリを起動したときにいきなりルームに接続してマルチプレイヤーになることはよくない)

今回はルームに接続するためのUIを作成します。

①Launcherシーンを開きます。

②hierarchyウィンドウから右クリック、[UI]→[Button]でボタンを作成し[Play Button]という名前を付けます。

f:id:Holomoto-Sumire:20210118162705j:plain

これによって[Canvas]と[Button]が作成されました。

③[Play Button]のインスペクターウィンドウから[Button]の[OnClick()]にイベントを追加します。

f:id:Holomoto-Sumire:20210118163438j:plain

④[Launcher]の[connect()]を指定します。

f:id:Holomoto-Sumire:20210118163713j:plain

これでButtonをクリックすることでルームに接続されるようになりました。

⑤[Launcher]コンポーネントのStart関数から[Connect()]をコメントアウトします。

        void Start()
        {
            //Connect();
        }

Unityでシーンを実行してボタンを押すことで接続されることを確認します。

f:id:Holomoto-Sumire:20210118164551j:plain

〇プレイヤー名

マルチプレイヤーゲームにおいて必要なことの一つに相手の名前がわかることです。

これは、誰が今ルームに入っているのかを確認するうえでも大切な要素になります。

プレイヤー情報を管理するスクリプトを書きます。

①新規スクリプトを作成して[PlayerNameInputField]と名付けます。

f:id:Holomoto-Sumire:20210118165836j:plain

②[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():

PlayerPrefsKey、Valueでデータを保存するものでプレイヤー名を保存する際に使用します。

プレイヤー名が既に存在している場合ユーザーは新たに入力することなく以前使用したプレイヤー名がそのまま使用されます。

PhotonNetwork.NickName:はPhotonのネットワーク上でニックネームを指定します。

〇プレイヤー名のUIを作成

①hierarchyウィンドウから[UI]→[Input Field]を選択し新規[Input Field]を作成し、その名前を[Name InputField]にします。

f:id:Holomoto-Sumire:20210119224741j:plain

②[Name InputField]の子オブジェクト[Placeholder]の[Text]に[Enter your Name...]を入力します。

f:id:Holomoto-Sumire:20210119224344j:plain

③[Name InputField]に[PlayerNameInputField]コンポーネントをアタッチします。

④[Name InputField]オブジェクトの[On Value Changed (String)]イベントに自身の[PlayerNameInputField]をアタッチします。

f:id:Holomoto-Sumire:20210119225135j:plain

⑤イベントに[SetPlayerName]を指定します。

f:id:Holomoto-Sumire:20210119225257j:plain

シーンを保存します。 以上でUIが完成しました。

f:id:Holomoto-Sumire:20210119225504j:plain

シーンを実行するとユーザー名の入力テキストボックスとボタンが表示されます。

ボタンをクリックすることでルームが呼び出されます。