Unity

【Unity】Photonを用いたサーバーログインシステムの作り方【シンプル設計】

本記事内には、アフィリエイトリンクを含む場合があります

先日、オンラインゲームのログインシステムを紹介しました↓

【Unityでオンラインゲーム】Photonサーバーを用いたルーム・ロビーの作り方【即使えるコードも公開】

おおまかにPhotonのサーバーに関する知識がわかったと思いますが、
もっとシンプルなものにカスタマイズする方法を、
ここではいくつか紹介していきます。

案①:ログイン後、全員1つのルームに入って即ゲーム(オープンワールド向け)

案②:後日追加予定・・・

案①:ログイン後、全員1つのルームに入って即ゲーム

シーンに準備するオブジェクトは、大きく3つのPanel。

a.ニックネームを入れてログインする画面(LoginPanel)
  子要素:
  ・InputField(ニックネーム入力)
  ・Button( ConnectToPhotonServer()を呼び出す)

b.接続中を示す画面(ConnectingPanel)
子要素:
・Text(Connecting...を表示)

c.接続完了後、クイックスタートする画面(QuickStartPanel)  
子要素:
・Button(JoinRandomRoom()を呼び出す)

本ログインシステムで使用するメソッドとコーディングで処理させる内容
#Unity Methods
・private void Start()

 PhotonNetwork.AutomaticallySyncScene = true;
 LoginPanelを SetActive(true) にする

#Public Methods
public void ConnectToPhotonServer()(仮名)←Loginボタンで呼ぶ
 PhotonNetwork.LocalPlayer.NickNameという変数に、
 InputFieldのtextを部分を入れる
   PhotonNetwork.ConnectUsingSettings()を呼ぶ

public void JoinRandomRoom()(仮名)←QuickStartボタンで呼ぶ       

  PhotonNetwork.JoinRandomRoom()を呼ぶ

#Photon Callbacks
・public override void OnConnectedToMaster()
 PhotonNetwork.ConnectUsingSettings()が呼ばれたら作動します

 CnnectingPanelを SetActive(true)にする

・public override void OnJoinRandomFailed(short returnCode, string message)

 CreateAndJoinRoom()を呼ぶ
 ※参加するルームがなければ自動作成させるため

・public override void OnJoinedRoom()

 PhotonNetwork.LoadLevel("○○")でゲームシーンに移動する

#Private Methods
 
void CreateAndJoinRoom()
 自動作成するルーム設定(roomNameやroomOptions)を記載し、 
 PhotonNetwork.CreateRoom(roomName, roomOptions)を呼ぶ

以上、
これらのコードを書いたScriptを
シーンの空のゲームオブジェクトにアタッチすれば出来上がります。

【参考】コード内容

案①のコード内容は、このようになっています。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;

public class QuickLobbyManager : MonoBehaviourPunCallbacks
{
    public GameObject EnterGamePanel;
    public InputField playerNameInput;

    public GameObject ConnectingPanel;
    public GameObject LobbyPanel;

    #region Unity Methods

    private void Start()
    {
        PhotonNetwork.AutomaticallySyncScene = true;
        EnterGamePanel.SetActive(true);
        ConnectingPanel.SetActive(false);
        LobbyPanel.SetActive(false);
    } 
    #endregion

    #region Public Methods

    public void ConnectToPhotonServer() //初期画面でボタンで読む(Name送信と接続)
    {
        if(!PhotonNetwork.IsConnected) //接続してたらニックネーム送信し、UI動かす
        {
            string playerName = playerNameInput.text;
            if(!string.IsNullOrEmpty(playerName))
            {
                PhotonNetwork.LocalPlayer.NickName = playerName;
                PhotonNetwork.ConnectUsingSettings();
                ConnectingPanel.SetActive(true);
                EnterGamePanel.SetActive(false);
            }
        }
        else{}
    }

    public void JoinRandomRoom() //ボタンでランダムに参加する
    {
        PhotonNetwork.JoinRandomRoom(); 
    }
    #endregion
    

    #region Photon Callbacks

    public override void OnConnectedToMaster() //サーバー接続処理
    {
        //Debug.Log(PhotonNetwork.NickName+ "Connected to Photon server");
        LobbyPanel.SetActive(true);
        ConnectingPanel.SetActive(false);

    }

    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        //Debug.Log(message);
        CreateAndJoinRoom();
    }

    public override void OnJoinedRoom()
    {
        //Debug.Log(PhotonNetwork.NickName+ "joined to"+ PhotonNetwork.CurrentRoom.Name);
        PhotonNetwork.LoadLevel("GameScene"); //シーンをロード
    }

    #endregion

    #region Private Methods
    void CreateAndJoinRoom()
    {
        string roomName = "Room" + Random.Range(0, 10000); //ルーム名
        RoomOptions roomOptions = new RoomOptions();
        roomOptions.IsOpen = true;
        roomOptions.IsVisible = true;
        roomOptions.MaxPlayers = 20; //定員
        PhotonNetwork.CreateRoom(roomName,roomOptions);
    }
    #endregion

}

参考まで^^

ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA