UNET④ NetworkManagerを使ってみる
いよいよUNETを使い始めます。
NetworkManagerとNetworkManagerHUDを使って、サクっとゲーム同士を接続します。
準備
適当に3Dのプロジェクトを新規作成します。
あと、今回作るのは適当なサンプルなので、キャラクターはただのCubeとかでも別に構わないのですが、キャラクターっぽいものを使ったほうが雰囲気出るので、大人気のゆるキャラぱっちぃを使います。ここからダウンロードしてプロジェクトに放り込みましょう。
https://github.com/ymotoyama/Samples/raw/master/Pacchi.unitypackage
プレイヤーオブジェクトを作る
プレイヤーの分身となるプレイヤーオブジェクトを作りましょう。
- 上記でインポートしたpacchiでもCubeでも何でも良いので、3Dオブジェクトをシーンに追加する
- オブジェクト名を「Player」としておく
- Add Component>Network>NetworkIdentity をアタッチ
- Playerオブジェクトをプレハブ化する
- シーンからPlayerオブジェクトを削除する
NetworkIdentityをアタッチするのがミソです。ネットワークを通じて、複数の端末間で同期して動くオブジェクトにはNetworkIdentityが必須です。逆に、同期する必要のないオブジェクト(動かない背景とか、使い捨てのパーティクルとか)には不要です。
NetworkManager
UNETのHLAPIを使ってネットワークゲームを作る場合は、大抵NetworkManagerというコンポーネントを使います(使わずに実装することも可能ですが)。公式リファレンスはこちらです。
では使ってみましょう。
- 空のオブジェクトを生成する(名前は「NetworkManager」としておく)
- 生成したNetworkManagerオブジェクトに対して Add Component>Network>NetrowkManagerをアタッチする
- アタッチしたNetworkManagerコンポーネントのSpawn InfoのPlayerPrefab欄にPlayerのプレハブを登録する
とりあえず、この状態でゲームを起動してみましょう。
はい、何も起きません。NetworkManagerが存在するだけでは何も起きないということを覚えておいてください。
NetworkManagerHUD
さて、あとはNetworkManagerの持つ各種メソッドを呼び出すだけで、別々のマシン上のゲームが接続されるのですが、まあその各種メソッドを呼び出すのがめんどくさいわけです。しかし素晴らしいことに、そこを簡単にやってくれる機能をUNETは提供してくれています。NetworkManagerHUDというコンポーネントです。早速使いましょう。
- NetworkManagerオブジェクトに対して Add Component>Network>NetworkManagerHUD をアタッチする
以上です。
ではゲームを起動してみてください。
ダサいUIが表示されます。
とりあえず「LAN Host(H)」ボタンを押してみてください。
プレイヤーオブジェクトが出現します。
ネットワークゲームが開始され、プレイヤーオブジェクトが登場したのです!!!!
・・・って、全然嬉しくないですね😅
自分一人しかいないのでは、ネットワークゲームである意味皆無なので。
UNETゲームの動作確認
では、いよいよ複数のゲームを接続してみましょう!
本当は別々の端末から、ネットワークを通じて接続するのが一番ですが、面倒なので、同じPCの中でゲームを2個起動し、それらを接続します。
- メニューのFile>Build&Run または Ctrl+B でexeをビルドします。保存先や名称は何でも良いです。
- ビルドが終わったらゲームが起動し、設定ダイアログが出ると思います。この際、フルスクリーンだと並べて表示させられないので、Windowモードを指定しましょう。解像度は、大きすぎると画面を複数並べられないので、小さくしたほうが良いかと思います。
- Unityエディターのほうでもゲームを起動します
- 二つのゲーム画面を並べてください
- 片方で「LAN Host(H)」を押し、もう片方で「LAN Client(C)」を押してください。
両方の画面にプレイヤーオブジェクトが出現しました。ネットワークゲーム感はまだ全く無いですが、一応、既に始まっているのです・・・!
エディターのHierarchyビューを見てください。Playerオブジェクトが、ちゃんと2体いるでしょう!?
全く同じ位置に生成されたために1体に見えますが、この通り・・・
ちゃんと2体います!
このまま、3人目のプレイヤーも接続してみましょう!
ビルド済みのexeからゲームをもう1つ起動すればOKです。
起動したら「LAN Client(C)」を押します。
新規プレイヤーとして、ゲームの世界に3人目のキャラクターが追加されます!
ちなみに、切断するとちゃんと消えます。最後に起動したゲームのStopボタンを押すか、ウィンドウを閉じるかしてみてください。キャラクターが1体消えるはずです。
あとは、HostとClientを入れ替えて起動したり、どちらもHostで起動しようとしたり、どちらもClientで起動しようとしたりしてみてください。
・・・とまあ、こんな感じで、NetworkManagerを使えば、ネットワークゲームを作る土台が簡単に整うのです。バンザーイ🙌
同期されてないじゃん
「え、キャラは出たけど、位置とか全く同期されてないじゃん」と思ったあなたは鋭い。素晴らしい洞察力です。
現状、エディターのSceneビューでキャラクターの位置を動かした場合、エディター上のゲームではキャラクターの位置が動きますが、他のウィンドウ内のキャラクターは初期位置のままピクリとも動きません。
はい。NetworkManagerがやってくれるのはここまでで、位置の同期やら、攻撃を行ったことの通知やら、ダメージを受けたことの通知やら、その他あれやこれすべてはプログラマーが実装しなくてはなりません😱
・・・ちょっと盛りました。位置を同期してくれる機能はUNETに用意されています。NetworkTransformというコンポーネントです。しかし、さほど使い勝手が良くないため、アクション性の強いネットワークゲームをガチで作るなら、位置の同期機能は自作することになるかと思います。
まとめ
- UNETでネットワークゲームを作る際はNetworkManagerを使う
- NetworkManagerHUDを使うと、NetworkManagerを制御するためのGUIが出現して、すぐに使えるようになる
- プレイヤーオブジェクトにはNetworkIdentityをアタッチする必要がある
- プレイヤーオブジェクトはプレハブにし、NetworkManagerに登録しておく必要がある
なお、NetworkManagerHUDのソースコードはこちらで見れます。ゆくゆくは、このソースコードを参考に、自分でGUIを作成して、このダサいUIを置き換えることになります。