他のVisualに発生したイベント情報を伝えよう

皆さんこんにちは、Emulate3Dの技術担当の小嶋です。

昨今の情勢から、在宅勤務の推進が進んでいますが、悩みの種は報告・連絡・相談の「ホウレンソウ」です。報告や相談はできるのですが、連絡がうまくいっておらず伝わらなかった・・・という経験、皆さんはないでしょうか?

今回紹介するのは「Messageイベント」です。
あるVisualで発生したイベント情報を、Messageイベントを用いることで他のVisualに伝える機能です。イメージとしては下記イラストに近いです。

情報伝達 イメージ

拡張性が高く、面白い機能なので、実際にモデルを作成しながら解説します。

モデルを作成する

下図のようなモデルを作成します。

Emulate3D 作成するモデル

今回やりたいことは、「赤色のBox(以降親Boxと表記)でコンベヤが搬送した数をカウントしたい」とします。コンベヤ側でカウントするのは以前こちらで説明した通りですが、親Box側でカウントする場合はちょっと工夫が必要です。

Messageイベントの設定

Messageイベントとは、あるVisualで発生した「クリックされた」「移動した」「ワークを受渡した」などのイベント情報を他のVisualにメッセージとして通知する機能です。
Messageイベントを用いれば、メッセージの受信先は、メッセージ送信元の状態を知ることができます。今回の例ではコンベヤで発生したMessageイベントを親Boxに伝えたいので、コンベヤにMessageイベントを設定します。

Messageイベントの設定の仕方は下記の通りです。
①Messages>Message Listeners EnabledをTrueにする
②表示されるMessageListenersの…をクリックすると出てくるVisual Reference コレクションエディターで追加をクリックし、OKをクリック(下図も参照してください)

Emulate3D VisualReferenceコレクションエディター 追加画面

③MessageListenersのプルダウンメニューから受信先のVisualを選択します。(今回の例では親BoxであるBox1、下図も参照してください)

Emulate3D プロパティ Message送信先設定

ここまでの操作で、親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が多かったり、頻繁に送信元を変更する場合はこちらのほうがおすすめです。

Emulate3D 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の入力だけで、ワークの搬送数をカウントできました。

Emulate3D 完成例

おわりに

Messageイベントは、他のScriptと組み合わせることでより活用の幅が広がります。
次回はこのモデルを改良し、シミュレーション条件をScriptで設定する方法を紹介します。ご期待ください。

サポートサイトには、Scriptだけではなく、便利なEmulate3Dの使い方も掲載しています。こちらも併せてご活用ください。