Unity

【Unity】オンラインFPSゲームの作り方#2【Photonサーバーにログイン&ルーム参加】

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

前回、2つのシーンを作りました。

【Unity】オンラインFPSゲームの作り方#1【デモとアセットの準備】本記事では、Unityを用いたオンラインで遊べるFPSゲームの作り方を紹介していきます。 これに従えば、次のようなゲームが作れます...

本記事では、
その1つの”LauncherScene”というサーバーログインを完成させます。

オンラインで対戦するには、
まず共有サーバーに接続し、ログインしなければなりません。

そのためのシーンですが、
特別な機能をもったロビーやルームを作成する必要はありません。

ここでは、シンプルな方法で実装します。
ログインした人は、皆同じルーム、同じゲームシーンで戦ってもらいます。

個々にルーム作成し、それぞれ条件を設定するようなロビーを作りたい場合は、
以下の記事をご参考ください。

【Unityでオンラインゲーム】Photonサーバーを用いたルーム・ロビーの作り方【即使えるコードも公開】Unityでは、個人でもオンライン対戦ゲームを作ることができます。 特に、ここでは”Photon”というサーバーを用いる方法を紹介...

1.オブジェクトの作成

1-1.ログイン画面

LauncherSceneに、UIの「Panel」を作成します。
(LoginPanelと名付ける)

その配下に、同じくUIの「InputField」「Button」を作成します。
(Panelを右クリックしてUIから作成)

「InputField」はプレイヤーの名前を入力するため、
「Button」はそれをサーバーに送信するためのものです。

なお、Button配下にあるTextには、Loginという内容に変えます。

 

1-2.接続中を示す画面

同様に「Panel」を作成し、その配下に「Text」を作成します。
内容は「Connecting ...」で良いでしょう。

サーバーに名前が送信され、ログインが成功するまで、この画面を表示させます。

 

1-3.ゲームを始める画面

最後に、ルームに入ってゲームを始める画面を作成します。

「Panel」を作成し、配下に「Button」を設置します。
一応ルームに入る前の段階なので、"LobbyPanel"とでも名付けましょう。

冒頭で述べたように、複数のルームが存在することなく、
ただ1つのルームで遊ぶゲームです。

もし自分が初めのプレイヤーでルームがまだ作成されていない場合は、
ルームを自動で作成して入室する
という処理が走るように設計する予定です。
そして、以降のプレイヤーは、そのルームを検出して、入室することになります。

※これをPhotonの用語では、JoinAndCreateRoomです。
「あったら入り、なければ作る」クイックプレイを実装する際に使われるメソッドです。

2.サーバー処理を行うスクリプトの作成

シーンに必要なオブジェクトが作られたということで、
次に、これらのPanelやButtonが機能するようにコーディングします。

Assetsフォルダ内に「Scripts」というフォルダを作り、
そこに「LauncherManager.cs」という名のC#Scriptを作成します。

スクリプトの内容は、次の通り。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
 
public class LauncherManager : MonoBehaviourPunCallbacks
{
    public GameObject LoginPanel;
    public InputField playerNameInput;
 
    public GameObject ConnectingPanel;
    public GameObject LobbyPanel;
 
    #region Unity Methods
 
    private void Start()
    {
        PhotonNetwork.AutomaticallySyncScene = true;
        LoginPanel.SetActive(true);
        ConnectingPanel.SetActive(false);
        LobbyPanel.SetActive(false);
    } 
    #endregion
 
    #region Public Methods
 
    public void ConnectToPhotonServer() //LoginButtonで呼ぶ
    {
        if(!PhotonNetwork.IsConnected) //サーバーに接続していたら
        {
            string playerName = playerNameInput.text;
            if(!string.IsNullOrEmpty(playerName))
            {
                PhotonNetwork.LocalPlayer.NickName = playerName;
                PhotonNetwork.ConnectUsingSettings();
                ConnectingPanel.SetActive(true);
                LoginPanel.SetActive(false);
            }
        }
        else{}
    }
 
    public void JoinRandomRoom() //StatButtonで呼ぶ
    {
        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 = 100; //ルームの定員
        PhotonNetwork.CreateRoom(roomName,roomOptions);
    }
    #endregion
}

LauncherSceneに
空のゲームオブジェクトを作り(「--LauncherManager--」を名付ける)、
そこに、LauncerManager.csをアタッチします。

すると、
publicで宣言したPanelやInputFieldを紐づけられるようになっているので、対応するオブジェクトを紐づけさせます。

次に、LoginのButton、StartのButtonの「OnClicked()」を設定します。
「+」を押し、LauncherManagerを紐づけ、
そのLauncherManager.csを選び、その中のメソッドを選択します。

選択するメソッドは
Loginの
Button ConnectToPhotonServer()
StartのButton JoinRandomRoom() 

ここまでくれば、「Ctrl」+SキーでSceneの内容を保存します。

再生ボタンよりゲームを実行してみて、
ログインできるか、
StartButtonをクリックすればGameSceneに移るか、確認しましょう。
(Scene in Buildに2つのシーンを入れてあること【#1の最後の方に解説済み】)

もしエラーが起きた場合は、
Debug.Log("任意の分");
というコードをメソッドの中に挿入してみて、
読まれていない箇所を探して、改善しましょう。

 

それでは、次の記事でゲームシーンを実装していきます!

【Unity】オンラインFPSゲームの作り方#3【ゲームシーンの構築】本記事では、GameSceneの構築、 ステージや配置するオブジェクトを作成する方法を解説していきます。 1.シーンの構築 1-1...
ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

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

CAPTCHA