前回、2つのシーンを作りました。
本記事では、
その1つの”LauncherScene”というサーバーログインを完成させます。
オンラインで対戦するには、
まず共有サーバーに接続し、ログインしなければなりません。
そのためのシーンですが、
特別な機能をもったロビーやルームを作成する必要はありません。
ここでは、シンプルな方法で実装します。
ログインした人は、皆同じルーム、同じゲームシーンで戦ってもらいます。
個々にルーム作成し、それぞれ条件を設定するようなロビーを作りたい場合は、
以下の記事をご参考ください。
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("任意の分");
というコードをメソッドの中に挿入してみて、
読まれていない箇所を探して、改善しましょう。
それでは、次の記事でゲームシーンを実装していきます!