Sharing

概要

NRSDK (Nreal Light の Software Developer Kit) の Observer View を理解するために、 サンプルとして提供されている Sharing (Scene) のソースコードを解読してみます。 個人的な読解結果であるため誤りが含まれている可能性があることをご了承ください。

目次

確認環境

  • NRSDK 1.2.1

解説

Sharing (Scene) の Hierarchy とそこで使われている Scripts を網羅して確認しました。

Sharing 機能は NetWorkSession (Prefab) を Hierarchy に追加して使用します。 NetWorkSession (Prefab) には SharingManager (Component) が設定されており、SharingManager のプロパティでは Player と ObjectPool を設定します。 Player, ObjectPool のいずれにも NetworkBehaviour (Component) を設定した Prefab を設定します。

ObjectPool には共有データを定義した Prefab を登録します。 共有データを NetObject と呼ぶとすると、他ユーザーから受け取る NetObject と自分から送信する NetObject を登録します。 Player には自分が生成する NetObject を定義した Prefab を登録します。

ObjectPool には複数の Prefab が登録されます。 登録する際には NetworkBehaviour を継承したクラスを作成し、作成したクラスを Component にもつ Prefab を作成します。 ObjectPool は NetworkBehaviour を継承したクラスのクラス名を Key、Prefab を Value とする辞書を保持します。 Key は NetObjectInfo.Key として使われます。

Player には単一の Prefab が登録されます。 ObjectPool に登録した Prefab のいずれか 1 つを登録します。 ObjectPool に複数の Prefab を登録するケースは理解できませんでした。 SharingManager は NetWorkSession のシングルトンインスタンスを使用しているため、SharingManager を複数使用してはいけないのではないかと思います。 そのため、Player に登録される Prefab は 1 つだけです。

NetworkBehaviour を継承したクラスの例として TestNetBehaviour が用意されています。 TestNetBehaviour では、共有データを管理します。 共有データはシリアライズして送受信します。 SynObject を継承させたクラスを独自に定義すれば任意のデータを共有できます。 標準では以下の SynObject を継承したクラスが用意されています。

  • SynTransform
  • SynInt
  • SynVector2
  • SynVector3
  • SynQuaternion

また、NetworkBehaviour.IsOwner は自身のセッションで作成した NetObject である場合には true になります。 つまり、Player に指定して生成されたインスタンスでは IsOwner が true になります。

Hierarchy

  • Sharing

    • Main Camera
      • [C] Camera
      • [C] Audio Listener
    • Directional Light
      • [C] Light
    • NetWorkSession (Prefab)
  • NetWorkSession (Prefab) (in Scripts/Sharing/Prefabs)

  • Player (Prefab) (in Demos/Sharing/Prefabs)

Scripts

  • SharingManager (in Scripts/Sharing/Scripts)

    • MonoBehaviour を継承している
    • Inspector の設定項目
      • Player : NetworkBehaviour (Demos/Sharing/Prefabs/Player)
      • Object Pool : NetWorkObjectPool (Scripts/Sharing/Prefabs/NetWorkObjectPool)
    • OnEnable
    • Start
      • Wraper.Initialize
      • ObjectPool.Init
      • NetObjectManager.Init
      • NetWorkSession.SearchLocalServer
        • LocalServerSearcher.Search
          • IP 255.255.255.255 port 1989 UDP に RequestForServerIP を送信する
          • IP:port を受信する
          • LocalServerSearcher.m_LocalServer に IPEndPoint(IP, port) を設定する
    • NetWorkSession.OnGetServerIP
      • EasyClient.ConnectAsync(EndPoint)
    • NetWorkSession.OnClientConnected
      • MsgGroup.LoginEvent.Request(GUID)
      • SharingManager.OnNetConnected
    • OnNetConnected
      • Player が設定されている場合は CreateNetObjRequest(NetworkBehaviour) を呼び出す
    • CreateNetObjRequest
      • MsgGroup.CreateNetObjectEvent.Request(NetworkBehaviour.GetType().Name)
      • OnCreateNetObjectResp
        • NetObjectManager.Create
          • NetWorkObjectPool から NetObjectInfo.Key で NetworkBehaviour を検索する
          • NetworkBehaviour が見つかったら NetworkBehaviour を Instantiate して、Initialize を呼び出す
            • NetObjectInfo.Owner が NetWorkSession.GUID と一致したら、NetworkBehaviour.IsOwner を true にする
          • Instantiate で生成された NetworkBehaviour の GameObject の name を NetObjectInfo.Key に設定する
        • SynContextRequest
          • MsgGroup.SynContextEvent.Request();
    • SynContextRequest
      • MsgGroup.SynContextEvent.Request()
      • OnSynContextResp
        • NetObjectManager.SynObjects
          • 受け取った NetObjectInfo 毎に以下を行う
            • NetObjectInfo.Identify 毎に NetObjectManager.Create を呼び出して NetworkBehaviour インスタンスを生成する
              • NetObjectInfo.Identify が NetworkBehaviour インスタンスの識別子になる
              • 既にインスタンスが生成されている場合は NetObjectManager.Create を呼び出さない
    • SynDataRequest
      • MsgGroup.SynDataEvent.Request(bytes, Data.RequestType.Others)
      • OnSynDataResp
        • NetMsgType が SynValue なら NetworkBehaviour.DeserializeData
        • NetMsgType が Commond なら NetworkBehaviour.ReplyCommond
  • MsgGroup

    • SynContextEvent
    • CreateRoomEvent
    • CreateNetObjectEvent
    • DestroyNetObjectEvent
    • GetRoomStateEvent
    • JoinRoomEvent
    • LeaveRoomEvent
    • LoginEvent
    • DownLoadCommondListEvent
    • UpLoadCommondListEvent
    • SynDataEvent
  • TestNetBehaviour (in Demos/Sharing/Scripts)

    • NetworkBehaviour を継承している
    • Inspector の設定項目
      • SynTransform
      • SynInt
      • SynVector2
      • SynVector3
      • SynQuaternion
    • Update
      • IsOwner が true ならば SynObject を更新する
      • Space キー押下時、MsgGroup.SynDataEvent.Request(bytes, Data.RequestType.Everyone))
  • NetworkBehaviour (in Scripts/Sharing/Scripts/RunTime)

    • Updater コルーチン
      • MsgGroup.SynDataEvent.Request(bytes, Data.RequestType.Everyone))
  • NetWorkObjectPool (in Scripts/Sharing/Prefabs)

    • ScriptableObject を継承している
    • Inspector の設定項目
      • NetObjects : List
    • NetworkBehaviour (のサブクラス) の Type Name をKey、NetworkBehaviour (のサブクラス) を Component に持つ GameObject を Value とした Dictionary を持つ