他のVisualに発生したイベント情報を伝えよう
皆さんこんにちは、Emulate3Dの技術担当の小嶋です。
昨今の情勢から、在宅勤務の推進が進んでいますが、悩みの種は報告・連絡・相談の「ホウレンソウ」です。報告や相談はできるのですが、連絡がうまくいっておらず伝わらなかった・・・という経験、皆さんはないでしょうか?
今回紹介するのは「Messageイベント」です。
あるVisualで発生したイベント情報を、Messageイベントを用いることで他のVisualに伝える機能です。イメージとしては下記イラストに近いです。
拡張性が高く、面白い機能なので、実際にモデルを作成しながら解説します。
モデルを作成する
下図のようなモデルを作成します。
今回やりたいことは、「赤色のBox(以降親Boxと表記)でコンベヤが搬送した数をカウントしたい」とします。コンベヤ側でカウントするのは以前こちらで説明した通りですが、親Box側でカウントする場合はちょっと工夫が必要です。
Messageイベントの設定
Messageイベントとは、あるVisualで発生した「クリックされた」「移動した」「ワークを受渡した」などのイベント情報を他のVisualにメッセージとして通知する機能です。
Messageイベントを用いれば、メッセージの受信先は、メッセージ送信元の状態を知ることができます。今回の例ではコンベヤで発生したMessageイベントを親Boxに伝えたいので、コンベヤにMessageイベントを設定します。
Messageイベントの設定の仕方は下記の通りです。
①Messages>Message Listeners EnabledをTrueにする
②表示されるMessageListenersの…をクリックすると出てくるVisual Reference コレクションエディターで追加をクリックし、OKをクリック(下図も参照してください)
③MessageListenersのプルダウンメニューから受信先のVisualを選択します。(今回の例では親BoxであるBox1、下図も参照してください)
ここまでの操作で、親Boxはコンベヤのイベント情報をメッセージイベントとして受け取れるようになりました。
補足・・・ScriptでMessageイベントを設定する方法
シンプルなモデルなら上記の手順でも問題ないですが、
モデル上に配置したVisualが増えてきたり、監視する対象が変わってくるとプルダウンメニューから探すのが大変です。
そこで、Scriptで設定する方法も紹介します。
親Boxに、以下のScriptを入力します。
[Auto] CustomPropertyValue ListeningTo;
// カスタムプロパティ「ListeningTo」の参照先が変わるたびに実行されるメソッド
[Auto]
void OnListeningToUpdated(Visual sender, VisualReference value, VisualReference oldValue)
{
// 参照先がある場合は、 MessageListenerEnabledをTrueにして
//メッセージイベントを設定・更新する
if (!value.IsNull)
{
value.Visual.MessageListenersEnabled = true;
value.Visual.AddMessageListener(sender);
}
// 前回参照していた参照先を削除する
if (!oldValue.IsNull)
{
oldValue.Visual.RemoveMessageListener(sender);
}
}
親BoxにVisualリファレンス「ListeningTo」ができました。下図のようにMessageイベントの送信元となるVisualを参照するだけで簡単にMessageイベントの設定が行えます。
Visualが多かったり、頻繁に送信元を変更する場合はこちらのほうがおすすめです。
親BoxでMessageイベントを処理しよう
次に、コンベヤから親Boxにメッセージイベントを受け取るScriptを入力します。
親Boxに、以下のScriptを入力します。
// 搬送数のカウントをするカスタムプロパティ
[Auto] CustomPropertyValue<int> PalletCount;
[Auto] void OnReset(Visual sender)
{
// リセット時、カウントをリセットする
PalletCount.Value = 0;
}
// ワークの搬送が完了したときにOnTxTransferCompleteイベントが発生する
// コンベヤからのOnTxTransferCompleteメッセージを受け取ってこのメソッドが実行される
[Message(“OnTxTransferComplete”)]
void OnTxTransferComplete(Visual sender, ScriptingObject message)
{
// カウントアップする
PalletCount.Value++;
}
Messageイベントは「ワークを受け取ったら」や、「コンベヤが動く/停止する」など無数に発生しています。
今回ワークの搬送数のカウントに使用したいのは、「搬送が完了したとき」です。
[Message(“OnTxTransferComplete”)]とすると、コンベヤの「搬送が完了した」というMessageイベントを受け取ったとき、メソッド内部の処理が実行されます。
そのため、Message送信元のコンベヤの搬送が完了するたびに OnTxTransferCompleteメソッドが実行され、カウントアップが行われるようになります。
コンベヤのScriptを変更せず、親Box側のScriptの入力だけで、ワークの搬送数をカウントできました。
おわりに
Messageイベントは、他のScriptと組み合わせることでより活用の幅が広がります。
次回はこのモデルを改良し、シミュレーション条件をScriptで設定する方法を紹介します。ご期待ください。
サポートサイトには、Scriptだけではなく、便利なEmulate3Dの使い方も掲載しています。こちらも併せてご活用ください。