3Dタスクロジックでの処理フローの使用
概要
「タスクを構築するツールと方法」のトピックで説明したように、タスク実行者にタスクを割り当てるには、主に2つのメインツール(処理フロー共有アセットまたは標準3Dロジック)を使用します。各ツールには、そのトピックで説明した独自の利点と欠点があります。
しかし、これら2つのツールを組み合わせて使うとしたらどうでしょうか。さまざまな理由で、シミュレーションモデルが両方の方法の要素を組み合わせることで利点を得られることに気付くかもしれません。両方を使用するタスクロジックの設計は確かに可能ですが、慎重な設定と特定の概念に関する知識が必要です。
以下は、このようなシステムの設定方法の大まかな概要です。
- グローバルタスクリストを作成する - ツールボックスで、処理フローが作成したタスクシーケンスを格納するタスクリストを作成します。
- 3Dモデルのタスク実行者にトリガーを追加する - [リソース利用可能時]トリガーをすべてのタスク実行者に追加します。このトリガーは、タスク実行者が空いてタスクを実行できるときにはいつでも起動します。トリガーの起動時にグローバルリストからタスクをプルするようタスク実行者に指示する命令を追加します。
- 処理フローでタスクシーケンスを作成する - タスクの完全なセットを作成し、それらをタスクシーケンス内に配置します。次に、作成したグローバルリストにタスクシーケンスを送付します。
- 標準3Dタスクロジックを設定する - 標準3Dタスクをタスク実行者に割り当てる方法を変更する必要はありません。このようなタスクは、通常の手順を使用して作成できます。
タスクシリーズとタスクシーケンスの違い
処理フロータスクロジックを標準の3Dロジックと組み合わせる場合は、タスク実行者によるタスクの処理方法が多少異なるため、タスクシリーズとタスクシーケンスの間のロジックの違いを知りたいと思うかもしれません。
タスクシリーズとは
あらためて確認すると、タスクとは、移動タスクやロードタスクなど、タスク実行者によって実行される単一の指示またはアクションです。タスクシリーズは、タスク実行者に1つずつ割り当てられる個々のタスクのセットです。タスクシリーズのタスクは互いに関連していませんが、通常、オペレーターは割り当てられた順序で各タスクを実行します。
たとえば、次の画像は、トークンが処理フロー内を移動するときにタスク実行者に1つずつ割り当てられる一連のタスクを示しています。
タスクシーケンスとは
タスクシーケンスは、1つのユニットにまとめられた一連のタスクです。標準の3Dタスクロジックを使用している場合、ほとんどのタスクはタスクシーケンスにグループ化されてからタスク実行者に割り当てられます。
タスクシーケンスは、オペレーターがジョブボードからプルする「やること」のアイテムの完全なリスト(グローバルリスト)と考えることができます。オペレーターは、タスクシーケンス内のすべてのタスクをリストされている順序で完了します。タスクシーケンスが完了すると、オペレーターはジョブボードに戻り、作業を行うための新しい「やること」リスト(タスクシーケンス)を取得します。
たとえば、次の画像は、固定リソースによってオペレーターに割り当てられた輸送タスクシーケンスのツリービューを示しています。
タスク実行者がタスクシーケンスを処理する方法
「タスク実行者がタスクを処理する方法」で説明したように、タスク実行者は以下の2つを追跡します。1)現在作業しているタスク、2)作業を割り当てられているタスクのキュー。タスク実行者がタスクシーケンスを処理するとき、それらは単一のタスクユニットとしてそのシーケンスを扱います。タスク実行者は、タスクシーケンスを受け取ると、次の手順を実行します。
- タスク実行者上で独自のタスクシーケンスが作成され、このタスクがアクティブタスクになります。このタスクシーケンスは名前で識別されます。
- そのタスクシーケンスに属するタスクはタスクシーケンスに追加されます。
- タスク実行者は、タスクシーケンスに追加された順序でタスクシーケンス内のタスクを完了します。
- タスク実行者がタスクシーケンスを完了し、そのタスクシーケンスに他に何も追加されていない場合、タスクシーケンスは削除されます。
- タスクシーケンスが削除された後、タスク実行者は他のタスクまたはタスクシーケンスを自由に処理できます。
タスク実行者に使用するプリエンプション設定によっては、タスク実行者が作業中であっても、タスク実行者をタスクシーケンスからプリエンプトできる場合があります。詳細については、「タスクの優先度とプリエンプトについて」を参照してください。
グローバルタスクリストを作成する
前述したように、タスクシーケンスは、ジョブボードに投稿される「やること」リストと考えることができます。グローバルタスクリストはジョブボードとして機能し、そこからタスク実行者が必要なタスクのリストをプルします。
グローバルタスクリストを設定するには:
- 左のペインで[ツールボックス]タブをクリックして、[ツールボックス]を開きます。
- [追加]ボタン をクリックして、メニューを開きます。[グローバルリスト]をポイントし、[タスクシーケンスリスト]を選択します。
- リストのプロパティで、リストの名前を「利用可能なタスク」など、覚えやすい名前に変更します。
- 必要に応じて、リストエントリの追跡に役立つカスタムフィールドを追加または削除します。
- [バックオーダー]タブをクリックし、[プッシュですべての値を再評価]チェックボックスをオンにします。
- [OK]ボタンを押して変更を保存し、ウィンドウを閉じます。
- 今作成したリストがツールボックスに表示されていることを確認します。
リストの一般的な情報については、「リストについての主要な概念」を参照してください。
リソース利用可能時トリガーを追加する
グローバルタスクシーケンスリストを作成したら、3Dモデル内のすべてのタスク実行者に[リソース利用可能時]トリガーを追加する必要があります。その後、タスク実行者が空いてタスクを処理できる場合はいつでもこのリストからプルするようにトリガーを設定します。このトリガーを追加するには:
- 3Dモデルで、タスク実行者をダブルクリックして、プロパティウィンドウを開きます。
- [トリガー]タブで[追加]ボタン をクリックして、メニューを開きます。[リソース利用可能時]を選択します。
- [リソース利用可能時]ボックスの横にある[追加]ボタン をクリックして、メニューを開きます。[リストを使用]をポイントし、[タスクシーケンスリストからプル]を選択します。
- ピックリストのプロパティウィンドウで、[リスト]メニューをクリックし、タスク実行者が使用するグローバルリストの名前を選択します。
- 必要に応じて、[クエリ]ボックスにクエリを追加して、どのタスクシーケンスを他のタスクシーケンスより先にプルするかをタスク実行者に指示します。
- 3Dモデル内のすべてのタスク実行者に対して前の手順を繰り返します。
トリガーの一般的な情報については、「イベントについての主要な概念」を参照してください。
処理フローでタスクシーケンスを作成する
処理フローライブラリのタスクアクティビティに、[タスクシーケンスを作成]アクティビティと[タスクシーケンスを送付]アクティビティの2つの追加アクティビティが含まれていることに気づくかもしれません。
これら2つのアクティビティを使用して、タスクシーケンスを作成し送付できます。一連の処理フロータスクの開始時に[タスクシーケンスを作成]アクティビティを使用してタスクシーケンスを作成し、タスクシーケンスに名前を割り当てます。次に、タスクアクティビティを完了させる順に追加します。
[タスクシーケンスを送付]アクティビティの追加はオプションです。タスクシーケンスを直接送付する場合は、このアクティビティを使用できます。ただし、タスクシーケンスをグローバルリストに送付する場合は、[リストにプッシュ]アクティビティを使用することをおすすめします。
処理フローでタスクシーケンスを作成し、それをグローバルタスクシーケンスリストにプッシュするには:
- リスト共有アセットを処理フローに追加します。[リスト]ボックスで、メニューを使用して、事前に作成したグローバルタスクシーケンスリストにリンクします。
- シミュレーションモデル内のどのイベントを介してトークンの作成がトリガーされ、それによってタスクシーケンスが作成されるかについて考えます。特定のイベントが発生するのをリッスンする[イベントトリガーソース]を使用することもできます。たとえば、輸送される必要があるキューに入るアイテムなどです。
- [タスクシーケンスを作成]アクティビティを処理フローに追加します。アクティビティのプロパティで、[タスク実行者/ディスパッチャー]ボックスの横にある[削除]ボタン をクリックして、現在選択されているタスク実行者がいないことを確認します。
- 必要に応じて、タスクシーケンス全体の[優先度]プロパティと[プリエンプト]プロパティに値を割り当てることができます。実際、[タスクシーケンスを作成]アクティビティは、処理フロー内のタスクに優先度やプリエンプトを割り当てる唯一の方法です。
- [割り当て先]オプションの下のボックスで、
taskSequence
というコード部分を削除し、それをタスクシーケンスに付けるカスタム名に置き換えます。たとえば、最終的なコードはtoken.MyTaskSequence
やtoken.TransportTasks
などとなります。 - 残りのタスクシーケンスを構成する残りのタスクアクティビティを追加します。各タスクアクティビティのプロパティで、[タスク実行者/ディスパッチャー]ボックスを先ほど作成したカスタムタスクシーケンスの名前に割り当てるように変更します。
- 各タスクアクティビティのプロパティで、[完了まで待機]チェックボックスをオフにしないと、シミュレーションの実行中にトークンがそのアクティビティに固定されます。
- タスクシーケンスに追加するタスクの最後に、完全なタスクシーケンスをグローバルタスクシーケンスリストにプッシュする[リストにプッシュ]アクティビティを追加します。アクティビティを処理フロー内のリストにリンクします(グローバルタスクシーケンスリストに関連付けられている必要があります)。
- [プッシュ値]ボックスで、先ほど作成したカスタムタスクシーケンスの名前に値が割り当てられていることを確認します。
このシステムの実例についてはタスクロジックチュートリアル1.4を完了してみてください。