こんにちは。ヤマヤタケシです。
ネットワークのプログラムは、まあややこしいです。
Unityのネットワークも低レイヤは完璧に隠蔽されていてすぐ使えてすごいのです! が、高レイヤで実装されているためそれが想定している使い方に沿わないとうまくいきません。
頭がこんがらがってくるぜ・・・。
Unityは1つの命令 Network.Instantiate で、ネットワークのこっちがわと向こう側の両方にオブジェクトを生成できます。
同じものが出来上がるのですが、これはどうやって操作するんだい?NetworkView が勝手に同期してくれる。うん、しかし、同期するってのは同じにするってことで、あっちで生成したものも、こっちにあるし、こっちで生成したものも、あっちにある。 こっちでいじったら、あっちはどうなんの?あとからいじった値になるのか?
うーん・・・・
結論
一方通行な同期でした。
つまり・・・ こっちで Network.Instantiate したものは、こっちで動かすと、あっち側も同じ動きをする。
あっちで Network.Instantiate したものは、こっでで動かしても、あっち側の値に上書きされるから、動かない。
あれ?最初からあるやつは?
Network.isServer が生成したものとしての動作になるようです。理に適っているけれども、理を体得するまでは苦しいぜ!
あんまり自信はない!
そういう理解で矛盾なく動作しているようなので書きました。
俺の勘違いがあれば、ビシバシ指導していただければ!と思います。
まとめ
サーバー側処理とクライアント側の処理の分担が柔軟にできるので、サーバーだけがクソ重いというのが避けられそうです。柔軟さはカオスの入り口です。その処理は両方で行っているのか、片方の値を同期しているのかが、クライアント、サーバーそれぞれでどちらもできます。ポリシーをもって作らない把握ができなくなります。
基本的には最低限の通信で成立させるべきですが、その線引がなんとも難しいのです。
そんじゃまた。