特定のシステム イベントが発生するたびに実行されるスクリプトを作成することができます。これには scriptJob コマンドを使用します。Maya では、スクリプトにアタッチできるシステム イベントが多数定義されています。これらのイベントは、Maya を普通に使用しているときにトリガされます。選択が変更されたとき、新規のファイルが開かれたとき、および新規のツールが選択されたときに通知されるイベントです。
イベントすべての一覧を取得するには、scriptJob -listEvents; のように、scriptJob コマンドに -listEvents フラグをつけて使用します。これらのイベントの名前は通常、一目瞭然で、詳しい説明は scriptJob マニュアルに記載されています。
コンディションと呼ばれるシステム イベントもあります。コンディションはイベントとよく似ていますが、true(真)または false(偽)の値を持ちます。たとえば、選択が行われたことを表すコンディションや、アニメーションが再生されていることを表すコンディションなどがあります。scriptJob コマンドに -listConditions フラグを付けて実行すると、すべてのコンディションをリストに表示することができます。
scriptJob -listConditions;
状態が true から false、または false から true に変更されるたびに、コンディションにアタッチされたスクリプトがトリガされます。isTrue コマンドを使用して、いつでも状態をテストすることができます。
最後に、オブジェクトのアトリビュートの値が変更されたときに生成されるイベントがあります。イベント、またはコンディションにスクリプトをアタッチしても、すぐには実行されません。イベント、またはコンディションがトリガされると、スクリプトは待ち行列に追加され、次にシステムが待機状態になったときに実行されます。稼動中にイベントやコンディションが何度トリガされても、スクリプトは次にシステムが待機状態になったときに一度だけ実行されます。
重要な注: scriptJob は、Maya をグラフィック ユーザ インタフェースで実行しているときにのみ動作します。
バッチ モードやプロンプト モードでは動作しません。scriptJob はユーザ インタフェースのカスタマイズに使用するために用意されています。アニメーションを実行している間に、何かを実行するのに scriptJob を使用しないでください。再生中やバッチ レンダリング中にイベントは実行されません。代わりにエクスプレッションを使用します。
たとえば、何も選択されていないときには必ず特定のオブジェクトを選択するスクリプトを記述するとしましょう。オブジェクトを選択するためのスクリプトは次のとおりです。
select -r myObject;
何も選択されていないときには、必ずこのスクリプトが実行されるようにします。何かが選択されているときにだけ true になる「SomethingSelected」というコンディションがあります。このコンディションが false になったら、スクリプトが実行されるようにします。これを行うためのコマンドは次のとおりです。
scriptJob -conditionFalse "SomethingSelected" "select -r myObject";
また、別の例として、あるオブジェクトが常に選択されているようにしてみましょう。選択が変更されるたびに実行され、そのオブジェクトが必ず選択されるようにする scriptJob を記述できます。
scriptJob -event "SelectionChanged" "select -add myObject";
この例では、シーンにあるオブジェクトがあまり高く上がらないように気をつける必要があります。変更されるたびに、オブジェクトの移動 Y(Translate Y)の値がチェックされるようなスクリプトを作成します。
global proc checkY(){
float $y = `getAttr myObject.ty`;
if ( $y > 10.0 ){
window;
columnLayout;
text -l "Object is too far up!";
showWindow;
}
}
scriptJob -attributeChange "myObject.ty" "checkY";
scriptJob コマンドを使用して、スクリプトをイベントやコンディションにアタッチすると、このコマンドから固有の「ジョブ番号」が返されます。この番号を使用して作成したジョブを削除(kill)することができます。前述の例で、17 という数値が返されたとします。このスクリプトがこれ以上実行されないようにするには、次のように -kill フラグを付けて scriptJob コマンドを使用します。
scriptJob -kill 17;
システムで実行されている scriptJob の全リストを表示するには、-listJobs フラグを使用します。
scriptJob -listJobs;
このコマンドを実行すると、ジョブ番号と、最初にジョブを作成したときに scriptJob コマンドで使用されたすべてのフラグや引数の一覧が返されます。
ジョブがそれ自身を自動的に kill(削除)するようにするための方法はたくさんあります。-runOnce フラグを true に設定してジョブを作成すると、このジョブは 1 度だけ実行されたあと、ジョブ自身により削除されます。
-parent フラグを使用して、ジョブを UI の特定の要素にアタッチしておき、この UI 要素が削除されたときに、同時にジョブも削除されるようにすることができます。次の例では、ウィンドウを作成します。ウィンドウ内の選択の有無を表すテキストを更新するために scriptJob が使用されます。ウィンドウが削除されると、このジョブは自動的に削除されます。
global proc updateSelWind(){
if ( `isTrue SomethingSelected` ){
text -edit -label "Something is selected." selText;
} else {
text -edit -label "Nothing is selected." selText;
}
}
string $windowName = `window`;
columnLayout;
text selText;
updateSelWind;
showWindow $windowName;
scriptJob
-parent $windowName // attach the job to the window
-conditionChange "SomethingSelected" "updateSelWind";
通常、ジョブの実行はスクリプト エディタ(Script Editor)ウィンドウには表示されません。ただし、スクリプト エディタの編集(Edit)メニューで、すべてのコマンドのエコー(Echo All Commands)オプションをオンにすると表示することができます。