HoloLensのSharingに自作のCustomMessagesを追加する方法
HoloLens開発につかえる HoloToolkit-Unityの複数台での空間共有機能 Sharing において自作オブジェクトを同期したり自作メッセージを飛ばし あうための方法のメモ。
- 前提がいろいろぶっ飛んでますが、自分用のメモに書いたものを公開。
- エミュレーターと実機でシェアリングのテストもできます。
- OSCの開発に慣れている人には、結構簡単かも。ほぼOSCっぽい仕様です。
CustomMessages.cs のカスタマイズ手順
イベントの送信方法(オリジナルのイベントメッセージを追加)
1. 新しTestMessageID を定義する
//(CustomMessages.cs) TestMessageID を追加する。
public enum TestMessageID : byte
{
HeadTransform = MessageID.UserMessageIDStart,
//ここ(HeadTransform とMaxの間)に
//追加したいイベントのメッセージIDを追加する。
StageTransform,//追加したメッセージID
Max
}
2. 追加したいメッセージのメソッドを追加する。
//(CustomMessages.cs) にメソッドを追加
public void SendStageTransform(Vector3 position, Quaternion rotation)
{
// If we are connected to a session, broadcast our head info
if (this.serverConnection != null && this.serverConnection.IsConnected())
{
// Create an outgoing network message to contain all the info we want to send
NetworkOutMessage msg = CreateMessage((byte)TestMessageID.StageTransform);
AppendTransform(msg, position, rotation);
// Send the message as a broadcast, which will cause the server to forward it to all other users in the session.
this.serverConnection.Broadcast(
msg,
MessagePriority.Immediate,
MessageReliability.ReliableOrdered,
MessageChannel.Avatar);
}
}
3. イベントを発生させたい別のスクリプトで CustomMessagesのメソッドを呼び出す
//(AnotherScript.cs) CustomMessages.Instance.SendStageTransform(transform.localPosition, transform.localRotation);
イベント受信について
- 受信側のスクリプトの先頭に以下を追加する必要もあります。
//(AnotherScript.cs) using HoloToolkit.Sharing; using HoloToolkit.Sharing.Tests;
- イベントの受信はCustomMessages.csのOnMessageReceivedを経由して、コールバックを受け取ります。
//(CustomMessages.cs) に、このコードは存在しています。
void OnMessageReceived(NetworkConnection connection, NetworkInMessage msg)
{
byte messageType = msg.ReadByte();
MessageCallback messageHandler = MessageHandlers[(TestMessageID)messageType];
if (messageHandler != null)
{
messageHandler(msg);
}
}
- イベントを受信したいスクリプトのStart()メソッドでにコールバックを設定します。
//(AnotherScript.cs)
void start(){
// ......
CustomMessages.Instance.MessageHandlers[CustomMessages.TestMessageID.StageTransform] = this.OnStageTransfrom;
// ......
}
- 実際のコールバックを受け取るメソッドを定義します。
//(AnotherScript.cs)
/// <summary>
/// When a remote system has a transform for us, we'll get it here.
/// </summary>
/// <param name="msg"></param>
void OnStageTransfrom(NetworkInMessage msg)
{
// We read the user ID but we don't use it here.
msg.ReadInt64();
transform.localPosition = CustomMessages.Instance.ReadVector3(msg);
transform.localRotation = CustomMessages.Instance.ReadQuaternion(msg);
//add any scripts you want.
}
- 上記の受信メソッドの例では、CustomMessages.Instance.ReadXXXを使ってメッセージを読み取っていますが、直接msg.ReadXXX()を使って値を取得することもできます。
//(AnotherScript.cs)
//receive event
void OnStageValues(NetworkInMessage msg){
// We read the user ID but we don't use it here.
msg.ReadInt64();
H = msg.ReadInt32 ();
D = msg.ReadInt32 ();
T = msg.ReadInt32 ();
selected = msg.ReadInt32 ();
}
参考にした情報
MixedRealityToolkit-Unity/README.md at master · Microsoft/MixedRealityToolkit-Unity · GitHub
