メインコンテンツまでスキップ

ネットワーク・スナップショット

ネットワークスナップショットは、ゲームセッション中に誰かが参加した時に、何かしら必要なデータをを初期化するために使用されます。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
}
}