読者です 読者をやめる 読者になる 読者になる

おもちゃラボ

Unityで遊びを作っていきます

Unityでネットワーク通信をする2(RPCについて)

Unity

UnityのRPCを理解する

前回書いたUnityでネットワーク通信をする(networkViewについて) - おもちゃラボでは、networkViewのコンポーネントをアタッチしたオブジェクトは「移動・回転・拡大縮小の操作が同期される」としつこく書いてきました。たしかに、networkViewをアタッチすると、これらの操作がネットワークを介して同期されるわけですが、逆を言うと、Unityではこれらの操作しか同期されません。つまり、Master側でコールした関数が自動的にClient側でもコールされるわけではないのです。

分かりにくいですねぇ。もうちょい、具体的に考えてみましょう。Master側のオリジナルキャラが武器を拾おうとしているとします。武器を拾うアニメーションを実行するため、MasterはGetHammer()という関数を呼ぶのですが、関数コールは同期されないため、Client側から見ると「武器の所までは歩いて行ったけど、その後もじもじしてる変なやつ」になってしまいます。

f:id:nn_hokuson:20140407231417j:plain

そこで、登場するのがRPC(Remote Procedure Call)と呼ばれる仕組みになります。これはネットワークを超えて相手空間の関数を呼び出すしくみで、これを使えば、簡単に自分のキャラと、自分のキャラのシャドウの間で同期をとることが出来ます。具体的なコードは次回説明しますが、関数の前に[RPC]というプレフィックスを付けることで、その関数はRPCとして扱われるようになります。

f:id:nn_hokuson:20140408224317j:plain

また、UnityではRPCでコールする範囲も、All(すべての端末)やOthers(自分以外の端末全て)と細かく指定することができるので、非常に便利です。

Network.Destoryで破棄する

最後に、オブジェクトをDestroyする場合を見ておきましょう。Network.Destroyを呼ぶことで通常のDestoryと同様にオブジェクトを破棄します。ただし、Network.Destroyを使った場合はネットワーク上で同期されているオブジェクトも同時に破棄されます。まー、Network.Instantiate()の逆の操作なので理解しやすいですねー!

f:id:nn_hokuson:20140421225825j:plain

すこしだけ注意が必要なのは、Network.Destroyをシャドウに対して使った場合です。この場合、影響範囲はClientだけではなくMasterのオブジェクトにまで及び、Masterのオブジェクトも破棄されます。

f:id:nn_hokuson:20140421230027j:plain

まとめ

とりあえず、UnityでnetworkViewを使うにあたって必要な要素の説明はひととおりしたと思います。次回は、実際にUnity上でサンプルコードを書いて動作を確かめてみますねー。

参考書籍

「ゲームの作り方 Unityで覚える遊びのアルゴリズム

Unity中級者向けの参考書です。本にはUnityで使われるPrefabやComponentなどの仕組みが分かりやすく解説されています(一方で、ソースコードの解説は自分で読んで理解しろ方式です)2Dのゲームから3Dのゲームまで、ゲームのサンプルが10個もついており(しかもバンダイナムコスタジオの現役プログラマが作ったやつ!)タイトルには"遊びのアルゴリズム"と付いてるだけあって「どうやったら面白くなるのか?」ということがゲームの参考書としては珍しく解説されているので是非どーぞ。