ネットワーク・スナップショット
ネットワークスナップショットは、ゲームセッション中に誰かが参加した時に、何かしら必要なデータをを初期化するために使用されます。NetworkIdentity
は、最新の利用可能なホストからの情報でNetworkIdentity
を含んだGameObject
の位置と回転値を初期化します。インスタンス化の途中でさらなるデータが必要になった時に、ネットワークスナップショットは有用です。
ネットワークスナップショットの実装
ネットワークスナップショットの実装にあたっては、最初にISnapshot
インターフェースを見る必要があります。
public interface ISnapshot
{
void EnqueueSnapshot(BaseHostMessageHandler hostMsg);
void RegisterSnapshotCallback(BaseHostMessageHandler hostMsg);
}
ネットワークスナップショットをセットアップするには、ISnapshot
インターフェースを実装する必要があります。EnqueueSnapshot
メソッドとRegisterSnapshotCallback
メソッドの実装が必要です。
同じプロジェクト内に、異なるプレイヤー同士のID管理に責任を持つPlayerIdManager
クラスがあります。このIDはゲームロジック中のそれぞれのプレイヤーを表すものであり、Player.UserNumber
とは異なるものであることに注意してください。このIDはプレイヤーに色を割り当てるために使用されます。
これらがどのように使用されているかは、PlayerIdManager
クラスを参照してください。
using PretiaArCloud.Networking;
using MessagePack;
// Define a network message type for the snapshot
[NetworkMessage]
[MessagePackObject]
public class PlayerIdSnapshotMsg : BaseNetworkMessage
{
[Key(0)]
public uint?[] UserNumbers;
}
public class PlayerIdManager : MonoBehaviour, ISnapshot
{
private uint?[] _userNumbers;
// The actual player id management implementation is omitted for brevity.
// Implements EnqueueSnapshot
public void EnqueueSnapshot(HostToPlayerMessageHandler hostToPlayerMsg)
{
// Within this function, developers only need to call hostMsg.Enqueue
// followed with the snapshot message.
hostToPlayerMsg.Enqueue(new PlayerIdSnapshotMsg { UserNumbers = _userNumbers });
}
public void RegisterSnapshotCallback(HostToPlayerMessageHandler hostToPlayerMsg)
{
// Within this function, developers only need to register an initialization callback
// to the snapshot message type
hostToPlayerMsg.Register<PlayerIdSnapshotMsg>(SetupUserNumbers);
}
private void SetupUserNumbers(PlayerIdSnapshotMsg msg)
{
// Do initialization process
}
}