UnityのRPCを理解する
前回書いたUnityでネットワーク通信をする(networkViewについて) - おもちゃラボでは、networkViewのコンポーネントをアタッチしたオブジェクトは「移動・回転・拡大縮小の操作が同期される」としつこく書いてきました。たしかに、networkViewをアタッチすると、これらの操作がネットワークを介して同期されるわけですが、逆を言うと、Unityではこれらの操作しか同期されません。つまり、Master側でコールした関数が自動的にClient側でもコールされるわけではないのです。
分かりにくいですねぇ。もうちょい、具体的に考えてみましょう。Master側のオリジナルキャラが武器を拾おうとしているとします。武器を拾うアニメーションを実行するため、MasterはGetHammer()という関数を呼ぶのですが、関数コールは同期されないため、Client側から見ると「武器の所までは歩いて行ったけど、その後もじもじしてる変なやつ」になってしまいます。
そこで、登場するのがRPC(Remote Procedure Call)と呼ばれる仕組みになります。これはネットワークを超えて相手空間の関数を呼び出すしくみで、これを使えば、簡単に自分のキャラと、自分のキャラのシャドウの間で同期をとることが出来ます。具体的なコードは次回説明しますが、関数の前に[RPC]というプレフィックスを付けることで、その関数はRPCとして扱われるようになります。
また、UnityではRPCでコールする範囲も、All(すべての端末)やOthers(自分以外の端末全て)と細かく指定することができるので、非常に便利です。
Network.Destoryで破棄する
最後に、オブジェクトをDestroyする場合を見ておきましょう。Network.Destroyを呼ぶことで通常のDestoryと同様にオブジェクトを破棄します。ただし、Network.Destroyを使った場合はネットワーク上で同期されているオブジェクトも同時に破棄されます。まー、Network.Instantiate()の逆の操作なので理解しやすいですねー!
すこしだけ注意が必要なのは、Network.Destroyをシャドウに対して使った場合です。この場合、影響範囲はClientだけではなくMasterのオブジェクトにまで及び、Masterのオブジェクトも破棄されます。
まとめ
とりあえず、UnityでnetworkViewを使うにあたって必要な要素の説明はひととおりしたと思います。次回は、実際にUnity上でサンプルコードを書いて動作を確かめてみますねー。
参考書籍
「ゲームの作り方 Unityで覚える遊びのアルゴリズム」
Unity中級者向けの参考書です。本にはUnityで使われるPrefabやComponentなどの仕組みが分かりやすく解説されています(一方で、ソースコードの解説は自分で読んで理解しろ方式です)2Dのゲームから3Dのゲームまで、ゲームのサンプルが10個もついており(しかもバンダイナムコスタジオの現役プログラマが作ったやつ!)タイトルには"遊びのアルゴリズム"と付いてるだけあって「どうやったら面白くなるのか?」ということがゲームの参考書としては珍しく解説されているので是非どーぞ。
ソフトバンククリエイティブ
売り上げランキング: 19,038