HDS#12 Transferの流れ③:受け渡し

 

こんにちは、開発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(木)です。お楽しみに。