前回はUnetを使ったプログラムの作り方の概要を紹介し、プログラムを作るための準備をしました。今回はプレイヤの動きを作っていきましょう。
Network Managerのはたらき
まずはネットワーク関係の準備をすべて受け持ってくれるNetwork Managerについて説明します。Network Managerの主な役割には次のようなものがあります。
- サーバーになるかクライアントになるかを選択
- プレイヤを人数ぶん自動的に生成
- ネットワーク同期するオブジェクトを生成
このようにNetwork Managerはネットワークに必要な作業全般を受け持ちます。
色々あってややこしそうですが、Network Mangerコンポーネントが基本的に全部やってくれるので、プログラマがやることは次の2つです。
- プレイヤのPrefabオブジェクトの登録
- ネットワーク上で動的に生成するPrefabの登録
プレイヤのPrefabを登録しておくと、人数分のプレイヤをゲーム開始時に自動生成してくれます。
また、ネットワーク上で動的に生成したいPrefabもNetwork Managerに登録しておく必要があります(こちらは敵を作るときに説明します)。
Network Managerを作る
では早速NetworkManagerコンポーネントをアタッチするところから作っていきましょう。まずはヒエラルキービューでCreate→Create Emptyを選択し、空のオブジェクトを作成します。オブジェクト名はNetworkManagerにしておきましょう。
作成したNetworkManagerオブジェクトにネットワーク用のコンポーネントをアタッチします。インスペクタからAdd Componentボタンをクリックし、Network → NetworkManagerコンポーネントとNetwork → NetworkManagerHUDオブジェクトをアタッチして下さい。NetworkManagerHUDはサーバーになるかクライアントになるかを、ゲーム実行時にGUIで選択できるようにするための、お助けコンポーネントです。
ここまでで、一度実行してみましょう。次のような画面が表示されて、ホスト(サーバー)かクライアントかを選択できるようになっています。
ネットワーク対応のプレイヤを作る
次にプレイヤ(自機)を作っていきましょう。ネットワークゲームといっても、普通のゲームと作り方はそんなに変わりません。
プレイヤのスプライトをシーンウインドウにドラッグ&ドロップします。続いてプレイヤの位置をネットワークで同期するためNetworkTransformコンポーネントをアタッチします。Playerオブジェクトを選択した状態でインスペクタのAdd Componentボタンを押し、Network→Network Transformを選択してください。
前回の記事で説明したとおり、Unetではプレイヤはクライアントの入力を受けてサーバーを更新するという順番で動かします。そのため、PlayerオブジェクトのNetwork Identityコンポーネントの「Local Player Authority」にチェックを入れます。
キー入力に応じてプレイヤを移動させるスクリプトを作成します。名前をPlayerControllerに変更しましょう。変更できたら次のスクリプトを入力してください。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; public class PlayerController : NetworkBehaviour { void Start () { transform.position = new Vector3(0, -4, 0); } void Update () { if (!isLocalPlayer) return; if (Input.GetKey(KeyCode.A)) transform.Translate(-0.1f, 0, 0); if (Input.GetKey(KeyCode.S)) transform.Translate( 0.1f, 0, 0); } }
通常のスクリプトとほぼ同じですね。ただ、普通のクラスがMonoBehaviorクラスを継承しているのに対して、ネットワークオブジェクトの場合にはNetworkBehaviorクラスを継承します。
Updateメソッドの中で、キー入力を受け取る前にisLocalPlayerかどうかをチェックしています。Unetでは、自分のプレイヤを「ローカルプレイヤ」として他人のプレイヤとは区別します。isLocalPlayerをチェックすることで、自分のプレイヤだけを動かすことができるようになります。
作成したPlayerControllerは、Playerゲームオブジェクトにドラッグしてアタッチしておきましょう。
普通のUnityプロジェクトなら、これで実行すればPlyerを動かせますね。ただ、Unetを使ったプロジェクトではプレイヤはNetwork Managerに作成してもらう必要があります。
プレイヤをNetworkManagerで生成してもらう
では、作成したプレイヤをNetworkManagerに生成してもらう部分を作ります。まずはNetwork Managerに登録するためのPrefabを作ります。
ヒエラルキーウインドウのPlayerをプロジェクトウィンドウにドラッグして、名前をplayerPrefabに変更してください。作成したplayerPrefabをNetworkManagerのSpawn Info→Player Prefabにドラッグしてください。
Player PrefabにセットすることでNetworkManagerがゲーム開始時に人数分のプレイヤを自動生成してくれます。したがって、現在ヒエラルキーウインドウにあるPlayerは不要です。deleteで消しておいて下さい。
2台の端末で仮想的に通信する
実際にゲームを実行してちゃんと動くか試してみましょう。2台で通信するのは手間がかかるので、通常はPC/Mac用の実行ファイルとして書き出したアプリと、Unityエディタ間の通信で動作確認します。
書き出した実行ファイルを実行してHostを選択、エディタではClientを選択します。HostでA/Sキーを使ってプレイヤを動かすと、それにあわせてClientのプレイヤも移動します。また逆にClientでプレイヤを動かすと、Hostのプレイヤが左右に移動します。それぞれでプレイヤを動かしてみて、同期して動くか確かめてください。
プレイヤの作り方まとめ
プレイヤの生成とネットワーク対応はこれで終了です。やったことをまとめておきましょう。
- プレイヤオブジェクトにNetworkIdentityコンポーネントとNetworkTransformコンポーネントをアタッチ
- クライアントで移動を制御するためLocalAuthorityにチェックを入れる
- isLocalPlayerで自分のプレイヤだけを移動させるスクリプトを作成
- NetworkManagerにプレイヤのPrefabを登録する
次回はネットワークで同期して動くインベーダーを作っていきます。
nn-hokuson.hatenablog.com