こんにちは、開発Gの杉原です。
↑このあたりに意図しない改行がよく挿入されるんですが、どうなってるんですかね。
毎回1行あけてるつもりなんですが、先週は2行、先々週に至っては4行も空いていてびっくりです。
さて、今回はTransferのメインともいえる「受け渡し」についてお送りします。
(メインといいつつ、実は結構やることはしょぼいのですが)
今回の範囲は下図の赤枠内になります。
前回やった「前処理」によって、搬送元と搬送先はおおよその場合接近して、いざワークを受け渡すぞというところまで来ているはずです。
そこでまず発生するのが搬送元のTxTransferイベントです。
このイベントが発生したときに何をするかというと、たいていワークは搬送元の子オブジェクトになっていることが多いので、親子関係を排除します。
基本的にやることはこれだけです。
そのほかだと、例えばPeopleProgramを見てみると、「持っているワークを搬送先へ置く」処理をTxTransferイベントで行っています。
Forkliftも同様に、「フォークを下す」処理を行っています。
このように、「移動の動作」をTxBeforeTransferで行い、「設置の動作」をTxTransferで行うといったイメージです。
これは「設置の動作」はお互いの「移動の動作」がともに終わらなければ成立しない動きなので、双方のBeforeTransferの完了(=移動の完了)を待ってから実行されるTxTransferで行うことで、正しく同期がとれるためです。
注意したいのは、「親子関係を排除」するとワークが搬送元に追従しなくなるため、必ず「設置の動作」まで終えて、ワークが搬送先と接するような状態になってから「親子関係を排除」するようにしてください。
そして、搬送先が必ず後で親子関係を持つとも限らないので、この「親子関係の排除」は忘れずに行うようにしてください。
親子関係の排除は次のように行います。
function OnTxTransfer( visual : Demo3D.Visuals.Visual, transfer : Demo3D.Visual.Transfer ) { var load = transfer.Load; load.Unstick(); }
[Auto] void OnTxTransfer( Demo3D.Visuals.Visual visual, transfer : Demo3D.Visual.Transfer ) { Visual load = transfer.Load; load.Unstick(); }
親子関係の設定、ということでParentプロパティを変更してもいいのですが、通常はこのUnstickメソッドを呼び出して親子関係を排除します。
Unstickメソッドを呼び出すことで、対象のVisual(この場合搬送ワーク)の親がなくなり(厳密にはシーンになる)、キネマティックが解除され、物理が有効になります。
こうして搬送元のTxTransferイベント処理が終わると、次に搬送先のRxTransferイベントが発生します。
ここでやることは、TxTransferのときと真逆だといえば簡単でしょうか?
基本的には、搬送ワークの親を搬送先に設定しますし、必要に応じてワークを持ち上げるといった動作もここで行います(もちろん、持ち上げを後処理で行ってもかまいません)。
親子関係設定の処理は下記のように行います。
function OnRxTransfer( visual : Demo3D.Visuals.Visual, transfer : Demo3D.Visual.Transfer ) { var load = transfer.Load; load.Stick(visual); }
[Auto] void OnRxTransfer( Demo3D.Visuals.Visual visual, transfer : Demo3D.Visual.Transfer ) { Visual load = transfer.Load; load.Stick(visual); }
親子関係を排除するときにUnstickメソッドを使用したように、親子関係の設定にはStickメソッドを使うことが多いです。
Stickメソッドでは逆に、引数で指定されたVisualを親に設定し、キネマティックを有効、物理を無効に設定します。
そのため、搬送元の特性によってはStickメソッドを使わないほうがいいこともあります。
例えばコンベアの場合、モーターを動かしてコンベア上のワークを流していくため、物理は有効でなければなりません。
また、標準のフォークリフトではStickをしていますが、これによってフォークリフトの持っているワークから物理判定がなくなってしまいますので、それが不都合な場合はStickではなく、Parentプロパティを直接変更する方法を使用します。
function OnRxTransfer( visual : Demo3D.Visuals.Visual, transfer : Demo3D.Visual.Transfer ) { var load = transfer.Load; load.Parent = visual; }
[Auto] void OnRxTransfer( Demo3D.Visuals.Visual visual, transfer : Demo3D.Visual.Transfer ) { Visual load = transfer.Load; load.Parent = visual; }
こうしてワークの受け渡しが完了します。
またTxTransferイベントとRxTransferイベントの特徴として、ほかのイベント、例えばTxBeforeTransfer/RxBeforeTransferイベントとは違って、並列に処理されないというものがあります。
搬送元のTxBeforeTransferイベントと搬送先のRxBeforeTransferイベントは同時に実行が開始され、並列に動作し、互いのBeforeTransferが完了するまで待機するのですが、そのあとは搬送元のTxTransferが先に実行され、それが終わってから搬送先のRxTransferが実行されます。
そのため、「搬送先の親子関係設定がされた後に、搬送元が親子関係を解除してしまった」といった処理順逆転の可能性は考慮する必要はありません。
こうして受け渡しを終え、次は後処理を行います。
ということで次回の【How to Demo3D Scripting】は「Transferの流れ④:後処理」をお送りします。
更新は5/17(木)です。お楽しみに。
コメントをお書きください