本日は hololens の技術調査枠です。
以下の記事を参考に、Sharing で共有する情報を追加します。
bril-tech.blogspot.jp
以下の Sharing 環境の構築を行ったプロジェクトを前提とします。
bluebirdofoz.hatenablog.com
初めに CustomMessages.cs に新しい MessageID を追加します。
今回は3つのTransform情報と2つのモード情報を転送します。
・CustomMessages.cs
public enum TestMessageID : byte { HeadTransform = MessageID.UserMessageIDStart, MainTransform, // MainオブジェクトのTransform情報 SimulationTransform, // SimulationオブジェクトのTransform情報 PanelTransform, // PanelオブジェクトのTransform情報 PanelMode, // PanelオブジェクトのMode情報 TapMode, // Tap操作のMode情報 Max }
次に、追加したIDに対応する SendMessage 関数を作成します。
一例としてMainTransform情報の送信関数は以下のようなメソッドを追加します。
・CustomMessages.cs
public void SendMainTransform(Vector3 position, Quaternion rotation, Vector3 scale) { // If we are connected to a session, broadcast our head info if (serverConnection != null && serverConnection.IsConnected()) { // Create an outgoing network message to contain all the info we want to send NetworkOutMessage msg = CreateMessage((byte)TestMessageID.MainTransform); AppendTransformScale(msg, position, rotation, scale); // Send the message as a broadcast, which will cause the server to forward it to all other users in the session. serverConnection.Broadcast( msg, MessagePriority.Immediate, MessageReliability.UnreliableSequenced, MessageChannel.Avatar); } } private void AppendTransformScale(NetworkOutMessage msg, Vector3 position, Quaternion rotation, Vector3 scale) { AppendVector3(msg, position); AppendQuaternion(msg, rotation); AppendVector3(msg, scale); }
またMode情報の送信関数は以下のようなメソッドを追加します。
・CustomMessages.cs
public void SendPanelMode(byte val) { // If we are connected to a session, broadcast our head info if (serverConnection != null && serverConnection.IsConnected()) { // Create an outgoing network message to contain all the info we want to send NetworkOutMessage msg = CreateMessage((byte)TestMessageID.PanelMode); msg.Write(val); // Send the message as a broadcast, which will cause the server to forward it to all other users in the session. serverConnection.Broadcast( msg, MessagePriority.Immediate, MessageReliability.UnreliableSequenced, MessageChannel.Avatar); } }
後は作成した関数を送信したいタイミングで実行します。
・GameManager.cs
public void SetTapObjectMode(ETapObjectMode a_ETapObjectMode) { if (p_ETapObjectMode != ETapObjectMode.Locked) { p_ETapObjectMode = a_ETapObjectMode; HoloToolkit.Sharing.Tests.CustomMessages.Instance.SendTapMode((byte)p_ETapObjectMode); } }
・EGameManager.cs
public enum ETapObjectMode : byte { Neutral = 0, Nothing = 1, Locked = 2, MainObject = 3 }
送信側の実装はこれで完了です。
次に受信側の設定を行います。
追加した MessageID 毎にコールバックの設定を追加します。
・GameManager.cs
private void Start() { // Sharingコールバックの設定 CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.MainTransform] = SharingMainTransform; CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.SimulationTransform] = SharingSimulationTransform; CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.PanelTransform] = SharingPanelTransform; CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.PanelMode] = SharingPanelMode; CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.TapMode] = SharingTapMode; }
MainTransform情報の受信関数は以下のようなメソッドを指定します。
・GameManager.cs
/// <summary> /// MainオブジェクトのTransformコールバック関数 /// </summary> /// <param name="msg">受信メッセージ</param> private void SharingMainTransform(NetworkInMessage msg) { // Parse the message long userID = msg.ReadInt64(); Vector3 transformPosition = CustomMessages.Instance.ReadVector3(msg); Quaternion transformRotation = CustomMessages.Instance.ReadQuaternion(msg); Vector3 transformScale = CustomMessages.Instance.ReadVector3(msg); // set Transform Transform transformObject = p_ViewerMainObject.transform; transformObject.position = transformPosition; transformObject.rotation = transformRotation; transformObject.localScale = transformScale; }
PanelMode情報の受信関数は以下のようなメソッドを指定します。
・GameManager.cs
/// <summary> /// PanelオブジェクトのModeコールバック関数 /// </summary> /// <param name="msg">受信メッセージ</param> private void SharingPanelMode(NetworkInMessage msg) { // Parse the message long userID = msg.ReadInt64(); int modeByteVal = msg.ReadByte(); EShowPanelMode panelMode = (EShowPanelMode)System.Enum.ToObject(typeof(EShowPanelMode), modeByteVal); // set Mode p_EShowPanelMode = panelMode; // 状態を反映する p_ActiveManager.SetActiveEShowPanelMode(p_EShowPanelMode); }
以上で Sharing 情報の追加は完了です。