テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

NetworkViewを使って通信対戦 その5

NetworkViewを使って通信対戦 その5
今回はスクリプトのパラメータ同期について。

UnityのNetworkViewは、Scriptだっての同期できる。
これを実現すれば、HPやパラメータ等の情報を簡単に同期できて超便利。

とはいえ、万能ではないみたい。
同期できるオブジェクトはScript一つにつき一つまで。
しかも下の9つの型しか同期できないらしい。
むむむ。

・bool
・char
・short
・int
・float
・Quaternion
・Vector3
・NetworkPlayer
・NetworkViewID


次は同期方法。

同期はOnSerializeNetworkViewメソッドで行う。
まずは記述すべきソース。
今回はキャラクターのHPを同期させてみる。

public int hp = 100;
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info) {
  int health = 0;
  if (stream.isWriting) {
   health = hp;
   stream.Serialize(ref health);
  } else {
   stream.Serialize(ref health);
   hp = health;
 }
}

まずOnSerializeNetworkViewについて。
これは定義しておけば勝手に実行するタイプのメソッドで、
ネットワークに接続したときに一定間隔で呼ばれるようになる。
呼び出す間隔は、計測したときは一秒間に18回くらい。(接続対象の呼び出しも含まれてるかも)
ここは環境に依存するような臭いがするので、一秒間に何回も呼ばれる程度の認識で良いと思う。

ちなみに接続対象が複数居ないと呼ばれないので注意。(ホストだけでは呼ばれない)

こういった処理はIF継承で定義されてると楽だけど、IF設定がわかりにくって噂も。むむむ。



次、stream.isWritingで書きこみ状況をチェックして、パラメータを同期する。
stream.isWritingが書き込み状態ならstream.Serializeでネットワーク上のオブジェクトを更新
stream.isWritingが読み込み状態ならstream.Serializeでネットワーク上のオブジェクトを取得を行う。
なおstream.Serializeの引数はref(参照渡し)なので、
渡した変数が変化して帰ってくる(事がある)

これでHPの同期ができた。
状態異常とかもビット演算とかで一括管理できるんじゃないかと密かに期待してたり。

とは言え、ネットワーク帯域はメモリ量の次に大切なもの。(動作>メモリ量>ネットワーク帯域>PGの命)
めったに変化しないようなパラメータなら、メッセージングで管理したほうが良い気もする。

てことで、次は任意のタイミングでメッセージを送信するRPCについてかなあ



調査ネタを募集中
フォローボタン