Unity、対戦プレイの同期をとるために

リファレンスページ

http://docs-jp.unity3d.com/Documentation/ScriptReference/Network.OnSerializeNetworkView.html

http://docs-jp.unity3d.com/Documentation/Components/net-RPCDetails.html

問題

ボールの衝突のカウントがラグのせいでたまに同期を取れていなかった。

解決策

NetworkViewコンポーネントはStateSynchronizationのObservedに設定したオブジェクトのTrasnformやrigidbodyの情報の同期を自動で取ってくれるが、スクリプトはスクリプト内のプロパティ(メンバ変数)は自動で同期を取ってくれない。同期を取るにはnetworkview.RPC関数かOnSeriallizeNetworkView関数を使う。

自分が作成したC#スクリプトの抜粋

  1. リモート関数操作(RPC)。
  2. OnSerializeNetworkViewでスクリプトのメンバ変数の状態同期を取っている。
using UnityEngine;
using System.Collections;

public class PlayerLife : MonoBehaviour
{

	public int damagedCount = 0;

	void OnCollisionEnter (Collision collisionInfo)
	{
		if (collisionInfo.gameObject.tag == "GameBall") {
			if(Network.isServer){
				networkView.RPC("DamagedCount",RPCMode.All);
			}
		}
	}

	[RPC]
	void DamagedCount(){
		damagedCount++;
	}

    void OnSerializeNetworkView(
              BitStream stream,
              NetworkMessageInfo info) {
        int tmp = 0;
        if (stream.isWriting) {
            tmp = damagedCount;
            stream.Serialize(ref tmp);
        } else {
            stream.Serialize(ref tmp);
            damagedCount = tmp;
        }
    }

}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です