おもちゃラボ

Unityで遊びを作ってます

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

Unityでネットワークゲームを作るにはUnetというライブラリを利用します。このUnetを使うことで簡単(?)にネットワークゲームを作ることができます。

簡単にハテナがついているのは、それほど簡単じゃないからです(笑)

Unetには様々なネットワークの専門用語が出てきて、どうやって作ったら良いのか混乱しがちです。ただ、基本的なパターンはある程度決まっているので、それを紹介してからインベーダーゲームづくりに取り掛かりましょう。

f:id:nn_hokuson:20190303132538p:plain:w600

今回の目次は次のようになります。

ネットワークゲームの基本パターン

Unetを使ってネットワークゲームを作る場合、基本になるのは次のようなサーバとクライアントがあるパターンです。
f:id:nn_hokuson:20180617131709p:plain:w380

2人以上の対戦ゲームでは、1台がサーバーとクライアントを兼ねた「ホスト」と呼ばれる役割になります。ときどきホストという言葉がでてくるので、覚えておきましょう。

オブジェクトの生成と移動

さて、いよいよネットワークゲームの作り方について考えていきます。いきなり、とても大切なことですが、Unetを使ったネットワークゲームを作る場合には、サーバーでオブジェクトを生成するのが基本になります。

サーバーでオブジェクトを生成すると、それが各クライアントでも自動的に生成されます。

f:id:nn_hokuson:20180617131801p:plain:w380

サーバーでオブジェクトを動かすと、各クライアントでも自動的に移動します。

f:id:nn_hokuson:20180617131852p:plain:w360

超簡単ですね(笑)

クライアント側でオブジェクトを動かす

上のように動きが決まった敵などはサーバー上で動かせばよいですが、プレイヤなどユーザーが操作するものをこの仕組で動かすのは基本的にNGです。

クライアントからの入力をうけてサーバー経由で動かそうとすると次のようになります。

f:id:nn_hokuson:20180617131941p:plain:w500

ただ、この仕組でプレイヤを動かすと、ボタン入力してからプレイヤが動くまでに、サーバーに行って来ての通信ラグ(②〜④)が発生してしまいます。これではゲームになりません。

そこで、プレイヤだけは特別扱いしてクライアント側で動かせる「Local Player Authority」というチェックボックスがあります。Unetを使ってプレイヤを動かす場合には、基本的にこの方法を使います。

f:id:nn_hokuson:20180617132138p:plain:w500

Unetの基本スタイル

さて、まとめると・・・

  1. 基本的にネットワークで同期したいオブジェクトはサーバーで生成する。また、移動するのもサーバー側で行う。
  2. ただしプレイヤだけは、通信のラグを考えてクライアント側で動かす

この2つをおさえておけば、今後Unetを使ってネットワークゲームを作る場合に役立つこと間違いなし!です。たぶん(笑)

今回作るUnet対応インベーダーゲーム

今回作るインベーダーゲームのイメージは次のような感じになります。

敵が左右に移動しているのば通常のインベーダーゲームと同じですが、今回作るゲームではプレイヤの機体が2台表示されています。

f:id:nn_hokuson:20190303132538p:plain:w400

各プレイヤが1台1台の機体を操って、インベーダーを破壊します。機体はネットワークで同期されているので、一人が機体を動かすと、相手の画面でも同じ動きをします。機体を動かすにはAキーとSキー、弾を打つにはスペースキーを押します。

だいたい、今回作るインベーダーゲームのイメージは掴めたでしょうか。ではプログラムを作っていきましょう。

プロジェクトの作成

では、今回はUnetでインベーダーゲームを作る下準備だけしておきましょう。ここではUnity2018.1.0f3を使って紹介しますが、Unity2017以前のものでも、ほぼ同じ方法で動作できると思います。

まずはUnityを起動し、プロジェクト名をInvader、Templateを2Dにしておきます。Unetは2Dでも3Dでも問題なく動作します。

f:id:nn_hokuson:20180618151600p:plain:w500

つづいて必要なアセットをプロジェクトビューにドラッグ&ドロップしてください。今回使用するアセットは↓からダウンロード可能です。

https://app.box.com/s/2v7zmz7hdttiyaxe4t9yi4af7xsi4z6m

このような状態になればOKです。

f:id:nn_hokuson:20190303133459j:plain

画面の背景を設定しておきます。プロジェクトウィンドウからbackgroundをシーンビューにドラッグしてください。再背面に表示するため、インスペクタから「Order in Layer」を「-1」に設定します。

f:id:nn_hokuson:20190303133842j:plain

今回はここまでにしておきましょう。次回はネットワーク同期したプレイヤを動かすところまでを作っていきたいと思います。