Field モジュールを初期化する方法

Field モジュールを使い始める際に記述する必要のあるコードについて解説します。

Field モジュールを利用するためには、クライアントから初期化する必要があります。

Field の初期化

m_field = new Diarkis.Modules.Field();
m_field.SetupAsUdp(m_udp);

初期状態で視界に入っている他のクライアントの同期データを受け取る

m_field.OnResponseSyncInit += DiarkisFieldOnResponseSyncInit;

Delegate を用いて、クライアントの同期データを受け取った際の処理を記述します。以下は Delegate する先のメソッド例です。
OnResponseSyncInit は、アプリケーション起動時に SyncInit() を1度呼び出す際にコールされます。

unsafe private void DiarkisFieldOnResponseSyncInit(List<byte[]> msgList)
{
  CreateCharacter(msgList);
}

このメソッドの内部で、送られてきたデータを用いて画面を初期化する処理を実装することを想定しています。

視界に入っている他のクライアントが送信する同期データを受け取る

m_field.OnSync += DiarkisSyncCharactersHandler;

Delegate を用いて、クライアントの同期データを受け取った際の処理を記述します。以下は Delegate する先のメソッド例です。
OnSync は、視界内の他のクライアントが Sync() を呼んだ時に発生するイベントを処理します。

unsafe private void DiarkisSyncCharactersHandler(byte[] payload)
{
    // ペイロードの先頭のGUIDを取得
    Guid guid = new Guid(payload.Take(16).ToArray());

    // 同期データの取得
    var data = payload.Skip(16).ToArray();

    // 新規参加プレイヤーからの初期状態同期 SyncInit() ならば無視する
    ushort id;
    Debug.Log("payload = " + string.Join(" ", payload));
    fixed (byte* p = payload) { id = *(ushort*)(p + 16); }
    Debug.Log("ID = " + id);
    if (id == 0xffff)
    {
        return;
    }

    // 以下アプリケーションロジックの記述
}

視界に入っている他のクライアントが、視界から外れたり切断された場合に発生するイベントを受け取る

m_field.OnDisappear += DiarkisOnDisappearSync;

Delegate を用いて、クライアントの同期データを受け取った際の処理を記述します。以下は Delegate する先のメソッド例です。
OnDisappear は、視界内の他のクライアントが視界から外れたり切断された際に発生するイベントを処理します。

private void DiarkisOnDisappearSync(string data)
{
    string otherCharacterUid = data;
    if (data.Length > 32) {
      // 最初の 52 byte がルームID
      otherCharacterUid = data.Substring(52, data.Length - 52);
    }

    // 以下アプリケーションロジックの記述
}