simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Unity:UNETの基礎と実装

最近素晴らしい UNET の記事を見つけました。
nn-hokuson.hatenablog.com

ネットワークゲームには二種
Peer-to-Peer 型と Client-Server 型があります。

数万人がアクセスするような商業成功タイプは Client-Server 型ですが、UNET は残念?ながら数人がリアルタイムに同じゲームを楽しむ Peer-to-Peer 型をサポートするシステムです。
UNET でオブジェクトの動きが同期するのはサーバー側の動きを複数のクライアントに共有するからですが、難しくなるのはクライアント側での動きを、他のクライアントに伝える仕組みです。

これを直感的に説明してくれたのが、冒頭で紹介したおもちゃラボさんの記事でした。
その記事で出てくる Local Player Authority というものをどのように実装するか示して、UNET の全体像をつかんでもらおうと思います。

Unity で UNET を利用したい場合に、絶対に必要になるコンポーネントは二つあります。
一つ目:NetworkManager コンポーネント
f:id:simplestar_tech:20180627080438j:plain
二つ目:NetworkIdentity コンポーネント
f:id:simplestar_tech:20180627080706j:plain

またプロジェクトの設定も一か所いじる必要があります。
最近だと設定項目なくてもいけるようですが、もしビルド対象プラットフォームの publishing settings を開いて Internet Client Server のチェックが外れていたら、チェックを入れてください。
f:id:simplestar_tech:20180627081524j:plain

後は追加したコンポーネントのインスペクタを編集する作業に集中します。

まず初めに作るのが PlayerPrefab です。
Network Identity コンポーネントを追加したゲームオブジェクトを Prefab 化します。(Prefab化っていうのは、シーンのヒエラルキーからプロジェクトビューにドラッグ&ドロップする操作です。)
こんな見た目のものがプロジェクトに作られれば OK
f:id:simplestar_tech:20180627082259j:plain

おもちゃラボさんの説明に出てくる Local Player Authority というのは、この Player オブジェクトのインスペクタを見たときに表示される Network Identity のパラメータのことを指します。
インスペクタでチェックを入れたら、次の見た目になります。
f:id:simplestar_tech:20180627082614j:plain

最後の基本ステップは、この Player オブジェクトを Player Prefabとして登録する作業です。
Network Manager コンポーネントを追加したオブジェクトをシーンに作成し、これのインスペクタを確認します。
先ほどの Player オブジェクトを Player Prefab を設定すると、このようになります。
f:id:simplestar_tech:20180627083058j:plain

あとは続けてこの Network Manager にOnline Scene とサーバーのアドレスを書き込むだけで、ひとまずローカル環境でチェックできます。
シーンの登録はビルドに含まれるシーンでなければ選択できませんのでご注意ください。(ビルド登録→Network Manager に登録の順番を開発者が守る必要がある)
f:id:simplestar_tech:20180627084144j:plain

最後の最後に、サーバーとしての待ち受けとクライアントとしての接続という処理が必要でした…
適当なスクリプトを作成してシーンオブジェクトに登録します。

using UnityEngine;
using UnityEngine.Networking;

public class InternetClientServer : MonoBehaviour {

	void Start () {
#if UNITY_EDITOR
        NetworkManager.singleton.StartServer();
#else
        NetworkManager.singleton.StartClient();
#endif
    }
}

エディタ実行するとサーバーとして機能し、それ以外のビルド成果物はクライアントとして機能するというコードです。
エディタ実行後、ビルド成果物を実行すると Player オブジェクトがエディタ側のヒエラルキーに追加されます。(確認風景)
f:id:simplestar_tech:20180627085247j:plain

プレイヤー(クライアント)から、ネットワークオブジェクト(Network Identityが追加されたオブジェクト)の情報を更新したい時
UNET の構造上、必ずネットワークコマンドを実行します。
そのコマンドを実行するスクリプトは、必ずこの Player (Clone) オブジェクトに追加されたスクリプトコンポーネントでなければならないということに注意してください。

あとは、UNET のコマンドや Sync Var 属性、Network Transform コンポーネント、Network Animator コンポーネントの公式ドキュメントを読み進めて習熟度を上げていけば、UNET でやりたいことができるようになると思います。
以上、数年ぶりに UNET の基礎を確認する作業でした。

おもちゃラボさんのUNET記事に感謝です!