今回はUnityの公式チュートリアルのマルチプレイヤーネットワーキングを勉強してみました。
Unityの公式サイトからマルチプレイヤーネットワーキングのトップページ をWebサイトのページを開くといきなり英語ばかりで「あ、なんだか難しそうだからやっぱりやめとこ」と一瞬思いました。
しかし、それぞれのステップのページを開くと日本語で解説されているので一安心。
英語タイトルの見出しを、それぞれのページの日本語の見出しに置き換えてみるとこのようになりました。
- 簡単なマルチプレイヤーサンプルのご紹介
- ネットワークマネージャー
- Player プレハブのセットアップ
- プレイヤープレハブを登録する
- Player の動きを作成する(シングルプレイヤー)
- プレイヤーの動きをオンラインでテストする
- プレイヤーの動きをネットワーク化する
- マルチプレイヤーの動きをテストする
- ローカルプレイヤーの特定
- シューティング(シングルプレイヤー)
- マルチプレイヤーシューティングを追加する
- プレイヤーの体力【シングルプレイヤー】
- プレイヤーの体力をネットワーク化する
- 死と再生成
- 非プレイヤーオブジェクトをハンドルする
- 敵の破壊
- 生成と再生成
- サンプルゲームに関するまとめ
簡単なマルチプレイヤーサンプルのご紹介
公式サイトのチュートリアルページ 簡単なマルチプレイヤーサンプルのご紹介
最初のステップはUnityでマルチプレイヤーネットワーキングを使用したゲーム開発についての紹介と、これから進めていくチュートリアルについての概要が書かれています。
まず最初の行う内容は次の2点だけです。
- Unity で、空の 3D プロジェクトを 1 つ新規作成
- デフォルトのシーンを “Main” として保存
ネットワークマネージャー
公式サイトのチュートリアルページ ネットワークマネージャー
このステップから具体的な作業に入ります。
- 空のゲームオブジェクトを 1 つ作成して名前を “Network Manager” に変更
- オブジェクト Network Manager を選択した状態で、Network > NetworkManager コンポーネントを追加
- さらにNetworkManagerHUD コンポーネントを追加
ゲームを再生すると[Game]ビューの右上にヘッドアップディスプレイが常時されます。
Player プレハブのセットアップ
公式サイトのチュートリアルページ Player プレハブのセットアップ
このステップではプレイヤーキャラクターの作成です。基本オブジェクトを組み合わせてキャラクターを作成してプレハブに変換します。
- 基本3Dオブジェクト Capsule を作成して名前を “Player” に変更
- 基本3Dオブジェクト Cube を作成して新規名前を “Visor” に変更
- オブジェクト Visor を Player ゲームオブジェクトの子にする
- オブジェクト Visor の Scale を x 0.95, y 0.25, z 0.5 に設定
- オブジェクト Visor の Position を x 0.0, y 0.5, z 0.24 に設定
- マテリアルを作成して名前を “Black” に設定してアルベドカラーを黒に変更
- オブジェクト Visor のマテリアルを Black マテリアルに設定
- オブジェクト Player を選択して Network > NetworkIdentity コンポーネントを追加
- NetworkIdentity > Local Player Authority のチェックボックスをオンにする
- オブジェクト Player を Project ウィンドウ内にドラッグして新しいプレハブアセットを作成
- シーンから Player ゲームオブジェクトを削除してシーンを保存
完成したプレハブ Player の[Inspector]ウィンドウを見るとこのようになります。
プレイヤープレハブを登録する
公式サイトのチュートリアルページ プレイヤープレハブを登録する
このステップでプレイヤーオブジェクトをネットワークゲームのシーンに登場させる設定を行います。
- [Hierarchy]ウィンドウ > Network Manager を選択
- [Inspector]ウィンドウ > Spawn Info のドロップダウンメニューを開いて[Project]ウィンドウのプレハブ Player を Player Prefab フィールドにドラッグ
Player の動きを作成する(シングルプレイヤー)
公式サイトのチュートリアルページ Player の動きを作成する(シングルプレイヤー)
このステップではプレイヤーオブジェクトを制御するためのスクリプトを作成します。
- “PlayerController” という名前のスクリプトを新規に作成し、プレハブPlayer に追加
- スクリプト PlayerController を開いて編集
- シーンを保存
スクリプトコードにコメントを付けて内容を確認しました。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { // ゲーム実行中の繰り返し処理 void Update() { // 左右方向の入力値を変数 x に代入 var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f; // 前後方向 入力値を変数 z に代入 var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f; // オブジェクトの方向転換の制御 // (変数 xの値をオブジェクトのY軸回転に代入) transform.Rotate(0, x, 0); // オブジェクトの前進、後退の制御 // (変数 z の値をオブジェクトのZ座標に代入) transform.Translate(0, 0, z); } }[Project]ウィンドウを確認。スクリプトファイルが増えました。
プレイヤーの動きをオンラインでテストする
公式サイトのチュートリアルページ プレイヤーの動きをオンラインでテストする
このステップではこれまで作成した内容の動作確認を行います。エディタ上で動作確認を行い、次にゲームのビルドを行ってネットワーキングの動作確認を行います。
エディタ上でプレイヤーの動きをテスト
はじめにエディタ上でプレイヤーオブジェクトの動きを確認します。
- [Play]ボタンをクリックしてゲームを再生
- ゲーム内 UI の LAN Host ボタンをクリックしてホストとしてゲームを開始
- WASD キーまたは方向キーを押してプレイヤーの移動と方向転換を確認
- [Stop]ボタンをクリックして Play モードを終了
ゲームをビルドしてプレイヤーの動きをテスト
今度はゲームのビルドを行ってゲームを実行します。
- Build Settingsウィンドウに シーン Main を追加してプロジェクトを保存
- スタンドアロンのアプリケーションとして[Build and Run]をクリック
- ビルドファイルが完成するとゲームが実行される
- ゲーム実行設定ウィンドウで Windowed チェックボックスを選択し、解像度はエディタ側の[Game]ビューと同時に表示できるように低めに設定
- ゲーム内 UI から [LAN Host(H)] ボタンをクリックしてホストとしてゲームを開始
- WASD キーまたは方向キーを押してプレイヤーの移動と方向転換を確認
ゲームのビルドファイルが完成するビルドしたゲームが自動的に実行されます。ゲーム実行の設定画面が表示されたら解像度は低めということで 720 x 480 にしました。
ゲームが実行されたら [LAN Host(H)] ボタンをクリックすると Windows のセキュリティ警告の画面が表示されたので “プライベートネットワーク” の許可を選択しました。
エディタ側で再生したのと同じようにプレイヤーオブジェクトが表示されて操作できます。
ビルドしたゲームを実行したままエディタ側でプレイヤーの動きをテスト
次に、ビルドしたゲームは実行したままで、エディタ側でもゲームを再生してネットワーキングの動作の状態を確認する手順になります。
- Unity のエディタ側でゲームを再生
- ゲーム内 UI から [LAN Client(C)] ボタンをクリックしてクライアントとしてゲームを開始
- WASD キーまたは方向キーを押してプレイヤーの移動と方向転換を確認
- プレイヤーオブジェクトの位置が、ホスト上とクライアント上で異なることを確認
- スタンドアロンプレイヤーを終了し、エディタ側でPlay モードを終了
ビルドしたゲームの方でプレイヤーを移動していた場合、エディタの[Game]ビューでこのように見えます。中央に表示されているのがエディタ側のプレイヤーオブジェクトになります。
キーボードで操作するとスタンドアロンプレイヤー(ホスト)とエディタ側(クライアント)両方のプレイヤーオブジェクトが同時に操作できるのでおかしなことになっています。
今回のステップではホストとクライアントでゲームが実行できることが確認できましたが、プレイヤーオブジェクトの位置が同期されておらずホスト側とクライアント側のプレイヤーで別々に操作できない状態ということが分かりました。
というわけで、次のステップに進みたいところですが、記事が長くなってきたので、チュートリアルの続きのステップは別の記事で紹介したいと思います。