おもちゃラボ

Unityで遊びを作ってます

【Unity】インベーダ作りで学ぶUnet超入門2

前回はUnetを使ったプログラムの作り方の概要を紹介し、プログラムを作るための準備をしました。今回はプレイヤの動きを作っていきましょう。

nn-hokuson.hatenablog.com

Network Managerのはたらき

まずはネットワーク関係の準備をすべて受け持ってくれるNetwork Managerについて説明します。Network Managerの主な役割には次のようなものがあります。

  • サーバーになるかクライアントになるかを選択
  • プレイヤを人数ぶん自動的に生成
  • ネットワーク同期するオブジェクトを生成

このようにNetwork Managerはネットワークに必要な作業全般を受け持ちます。

色々あってややこしそうですが、Network Mangerコンポーネントが基本的に全部やってくれるので、プログラマがやることは次の2つです。

  1. プレイヤのPrefabオブジェクトの登録
  2. ネットワーク上で動的に生成するPrefabの登録

プレイヤのPrefabを登録しておくと、人数分のプレイヤをゲーム開始時に自動生成してくれます。

f:id:nn_hokuson:20190303134321j:plain:w400

また、ネットワーク上で動的に生成したいPrefabもNetwork Managerに登録しておく必要があります(こちらは敵を作るときに説明します)。

Network Managerを作る

では早速NetworkManagerコンポーネントをアタッチするところから作っていきましょう。まずはヒエラルキービューでCreate→Create Emptyを選択し、空のオブジェクトを作成します。オブジェクト名はNetworkManagerにしておきましょう。

f:id:nn_hokuson:20190303134946p:plain:w270

作成したNetworkManagerオブジェクトにネットワーク用のコンポーネントをアタッチします。インスペクタからAdd Componentボタンをクリックし、Network → NetworkManagerコンポーネントとNetwork → NetworkManagerHUDオブジェクトをアタッチして下さい。NetworkManagerHUDはサーバーになるかクライアントになるかを、ゲーム実行時にGUIで選択できるようにするための、お助けコンポーネントです。

f:id:nn_hokuson:20190303140310j:plain

ここまでで、一度実行してみましょう。次のような画面が表示されて、ホスト(サーバー)かクライアントかを選択できるようになっています。

f:id:nn_hokuson:20190303135520p:plain:w400

ネットワーク対応のプレイヤを作る

次にプレイヤ(自機)を作っていきましょう。ネットワークゲームといっても、普通のゲームと作り方はそんなに変わりません。

プレイヤのスプライトをシーンウインドウにドラッグ&ドロップします。続いてプレイヤの位置をネットワークで同期するためNetworkTransformコンポーネントをアタッチします。Playerオブジェクトを選択した状態でインスペクタのAdd Componentボタンを押し、Network→Network Transformを選択してください。

f:id:nn_hokuson:20190303140505j:plain

前回の記事で説明したとおり、Unetではプレイヤはクライアントの入力を受けてサーバーを更新するという順番で動かします。そのため、PlayerオブジェクトのNetwork Identityコンポーネントの「Local Player Authority」にチェックを入れます。

f:id:nn_hokuson:20190303140546p:plain:w350

キー入力に応じてプレイヤを移動させるスクリプトを作成します。名前を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をチェックすることで、自分のプレイヤだけを動かすことができるようになります

f:id:nn_hokuson:20190303140817p:plain:w500

作成したPlayerControllerは、Playerゲームオブジェクトにドラッグしてアタッチしておきましょう。

f:id:nn_hokuson:20190303141151j:plain

普通のUnityプロジェクトなら、これで実行すればPlyerを動かせますね。ただ、Unetを使ったプロジェクトではプレイヤはNetwork Managerに作成してもらう必要があります。

プレイヤをNetworkManagerで生成してもらう

では、作成したプレイヤをNetworkManagerに生成してもらう部分を作ります。まずはNetwork Managerに登録するためのPrefabを作ります。

ヒエラルキーウインドウのPlayerをプロジェクトウィンドウにドラッグして、名前をplayerPrefabに変更してください。作成したplayerPrefabをNetworkManagerのSpawn Info→Player Prefabにドラッグしてください。

f:id:nn_hokuson:20190303142732j:plain

Player PrefabにセットすることでNetworkManagerがゲーム開始時に人数分のプレイヤを自動生成してくれます。したがって、現在ヒエラルキーウインドウにあるPlayerは不要です。deleteで消しておいて下さい。

f:id:nn_hokuson:20190303142909j:plain:w200

2台の端末で仮想的に通信する

実際にゲームを実行してちゃんと動くか試してみましょう。2台で通信するのは手間がかかるので、通常はPC/Mac用の実行ファイルとして書き出したアプリと、Unityエディタ間の通信で動作確認します。

 書き出した実行ファイルを実行してHostを選択、エディタではClientを選択します。HostでA/Sキーを使ってプレイヤを動かすと、それにあわせてClientのプレイヤも移動します。また逆にClientでプレイヤを動かすと、Hostのプレイヤが左右に移動します。それぞれでプレイヤを動かしてみて、同期して動くか確かめてください。

f:id:nn_hokuson:20190303143347g:plain:w400

プレイヤの作り方まとめ

プレイヤの生成とネットワーク対応はこれで終了です。やったことをまとめておきましょう。

  1. プレイヤオブジェクトにNetworkIdentityコンポーネントとNetworkTransformコンポーネントをアタッチ
  2. クライアントで移動を制御するためLocalAuthorityにチェックを入れる
  3. isLocalPlayerで自分のプレイヤだけを移動させるスクリプトを作成
  4. NetworkManagerにプレイヤのPrefabを登録する

次回はネットワークで同期して動くインベーダーを作っていきます。
nn-hokuson.hatenablog.com