C#でnetworkViewを使う
前回までの記事(Unityでネットワーク通信をする(networkViewについて) - おもちゃラボとUnityでネットワーク通信をする2(RPCについて) - おもちゃラボ)で、Unityを使ったネットワーク同期の仕組みがだいたい理解できたかと思います。今回と次回はUnity上でnetworkViewを使ったC#のプログラムを書いていきたいと思います。今回は下図のようなネットワーク越しのインスタンス生成の同期をやろうとおもいます。
Unity4.3からは2Dが使えるようになったので、2Dを使って説明しますね〜(2Dの方が簡単!かも)おおまかに今回やることを説明すると、ネットワーク上で同期するオブジェクトの作成と、MasterかClientかを選択するネットワークマネージャの作成を行います。
同期オブジェクトの作成
UnityのツールバーのFile→New Projectを選択し、Project Wizardの下の方にあるSet up defaults forのドロップダウンを2Dにします。これだけで、Unity 2D用のプロジェクトが生成されます。
次に、ネットワークで同期したいオブジェクトをUnityのAssetフォルダにドラックします。ドラックした素材のTexture TypeがSpriteになっているかをインスペクタのウインドウで確認し(これは2Dの場合)Sceneにスプライトをドラッグしてください。
次に、いまドラッグしたスプライトにNetworkViewコンポーネントをアタッチします。まず、Sceneウインドウ内のスプライトを選択し、インスペクタのAdd Componentをクリック、Miscellaneous(種々雑多なものという意味!)からNetworkViewを選択してください。NetworkViewコンポーネントがアタッチされていることを確認したら、当該スプライトをPrefab化しておきましょう。Prefab化したあとはSceneビューのスプライトは消してしまって問題無いです。
ネットワークマネージャの作成
さて、次はMaster/Clientの選択画面の表示と、それぞれの動作を決定するネットワークマネージャを作成していきます。方針としては、ネットワークマネージャオブジェクトを作成し、そこにプログラムをアタッチする形で進めていきます。まずは、ツールバーからGameObject→Create Emptyを選択し、空のオブジェクトを作成します。名前はNetworkManagerに変更しておきます。次に、Asset内にC#のスクリプトを作成し、このスクリプトをNetworkManagerオブジェクトにD&Dしてアタッチしておきます。
NetworkManagerのC#プログラムは下記のようになります。内容の説明は次回にしたいと思うので、とりあえずはコピペして使ってください(おぼかた流w)まー、コピペはそんなに悪いことばっかりでもないですしね(笑)このプログラムもhttp://terasur.blog.fc2.com/blog-entry-69.htmlのサイトを参考にさせて頂いています。
ネットワークマネージャのC#プログラム
NetworkManager.cs
実行してみる
ここまでで、networkViewを使ったインスタンス生成の仕組みが完成したので、一度Unity上で実行してちゃんとインスタンスがネットワークを通じて同期して生成されるかを確かめてみましょう。ここで1台のパソコンでネットワークのテストをする裏ワザ!(という程のものではない)一台はUnity上で動かし、もう一台はネイティブアプリ(MacならMac用アプリ)として実行するだけです(笑)
ツールバーからFile→Build Settingsを選択し、書き出し先をPC Mac & Linuxに指定します。そしてBuild And Runを押せば自動的にコンパイルを行い、ネイティブアプリとして起動します。もう一台分はUnity上で再生ボタンをおして動かしておいてください。
実行すると、MasterかClientかを選択するボタンが表示されます。どちらかのウインドウでMasterを選択して下さい。するとオブジェクトが表示されると思います。この状態でもう一方のウインドウでClientを選択して下さい。うまくMasterに接続できれば、Client側のウインドウにもオブジェクトが表示されると思います。
Clientボタンを押してもClientボタンが消えずに何の反応もないようなら、Masterへの接続で失敗している可能性が高いです。ネットワーク上のルータの設定を見なおして見て下さい。また、Clientボタンは消えるけれども、オブジェクトが表示されないという方は一度Masterのウインドウにフォーカスを当ててから、Clientの画面にフォーカスを戻してみてください。これは、ネットワークの問題ではなくClientのボタンを押す時ににMaster側のタスクがバックグラウンドに回されて動作がストップしてしまうのが原因だと思います。
次回は、今回説明できなかったUnityのネットワークプログラムの内容を解説していきたいと思います。
参考書籍
「おもしろいのゲームデザイン」
ゲームの面白さとはなにか?ゲームを科学的に分析し、面白さの本質に迫った良書。非常に面白いし、良いことが書かれているし、絵がいっぱいあって読みやすいし、で三拍子そろったいい本だと思うのですが、なぜかAmazonのレビューは低い(笑)ぜひ、絶版になる前にどうぞ・・・
「ゲームの作り方 Unityで覚える遊びのアルゴリズム」
Unity中級者向けの参考書です。本にはUnityで使われるPrefabやComponentなどの仕組みが分かりやすく解説されています。2Dから3Dのゲームまでサンプルが10個もついており、タイトルには"遊びのアルゴリズム"と付いてるだけあって「どうやったら面白くなるのか?」ということが珍しく解説されている本になっています。