スクリプト オペレータのコーディング時の注意点

 
 
 

スクリプト オペレータのコードを記述するにあたり、注意しなければならない特殊な問題があります。この問題について以下に説明します。

注:小数点にカンマを使用すると、スクリプト エンジンは数値定数を認識しません。小数点にピリオドを使用するようにオペレーティング システムを設定してください。

スクリプト オペレータ コードに関する制限

スクリプト オペレータ コードには、次の制限があります。

  • 使用できるのはオブジェクト モデル ステートメントだけです。スクリプト コマンドは使用できません。

  • メソッドとプロパティのサブセットに制限されます。こうした制限については、『SDK ガイド』の「スクリプト リファレンス」に詳しく説明されています。

  • 明示的に接続が作成されたデータにだけアクセスできます。

  • 一般的に、評価サイクルを呼び出す可能性がある処理はすべて実行できません。これには、他のフレームでのパラメータの値の取得が含まれます。

サブルーチン、変数、名前の競合

Scripted Operator Editor の下部ペインでは、グローバル変数を保持するサブルーチンを記述できます。サブルーチンは、コードをコントロールするために使用できるヘルパ関数です。サブルーチンは、メイン アップデート ルーチンまたは他のサブルーチンから複数回呼び出すことができます。

しかし、速度と効率の理由から、スクリプト エンジンのインスタンスは言語ごとに 1 つしか用意せず、それがすべてのスクリプト オペレータに対して使用されます。これは、異なるオペレータの 2 つのサブルーチンまたは変数が同じ名前の場合、どちらが解析または最後に設定されても両方に使用されることを意味します。この問題は名前の競合と呼ばれ、更新が正しく行われなかったり、オペレータを破壊する場合があります。

問題を回避するには、名前の前に、スクリプト オペレータ作者のイニシャルあるいはオペレータ固有のプリフィックスなど、他のオペレータと区別するための識別子を追加するとよいでしょう。複数のオペレータの使用、シーンのマージ、あるいは他のユーザとのファイルの共有などを行う場合には特に重要です。たとえば、次のように記述します。

me_MyDeform_CalculateVals(i_par1, i_par2, o_par)
注:メイン アップデート ルーチンの中では名前の競合の問題はありません。これは、名前が内部で一意の値に再マップされるためです。メイン アップデート ルーチンの最初と最後の行が読み取り専用になっているのはこのためです。

複数のスクリプト言語を併用する

同一のシーン内で、さまざまなスクリプト言語のさまざまなスクリプト オペレータを記述することができます。しかし、同一スクリプト オペレータ内で使用できる言語は一言語のみです。特定のスクリプト オペレータの解析に使用される言語は、スクリプト オペレータを最初に作成した際に[設定](Preferences)ウィンドウの[スクリプト](Scripting)ページで設定した言語です。

グローバル スクリプト変数を使用する

エディタの下部ペインで、スクリプト オペレータに対してグローバルな変数を宣言できます。しかしこれらの変数が使用できるのは、スクリプト オペレータが呼び出されて出力接続が更新されるときに限られます。したがって、たとえば、これらの変数をエクスプレッションなどで使用することはできません。

さらに、名前が競合する問題が発生する場合があります。詳細については、「サブルーチン、変数、名前の競合」を参照してください。また呼び出しと呼び出しの間では変数値は維持されません。永続的なデータを使用する必要がある場合は、スクリプト オペレータ用にカスタムパラメータ(「新しい変数を追加する」を参照)を作成し、この変数を読み取り専用にします。読み取り専用のカスタム変数もスクリプト コマンドを通じて設定できます。

スクリプト オペレータとコンストレイントを結合する

エクスプレッションと同様、スクリプト オペレータは同じオブジェクト上のコンストレイントより前に計算されます。スクリプト オペレータ内で被コンストレイント パラメータを使用すると、希望通りの結果が得られない場合があります。

たとえば、オブジェクトの位置に基づく向きをコントロールするスクリプト オペレータを記述する場合、オブジェクトにパス コンストレイントがあると、各フレームで位置が更新される前に向きが計算されるため、オペレータでは以前の値が使用されることになります。

希望の結果を得るためには、ヌルなどの中間オブジェクトをパスに拘束してから、オブジェクトの位置をヌルに拘束します。新しい方向を計算する際、オブジェクトの位置ではなくヌルの位置を使用します。

スクリプト オペレータと他のアニメーションを結合する

スクリプト オペレータを、キーあるいはエクスプレッションなど、他のアニメーションと結合できます。しかし、オペレータの入力接続と出力接続の両方に特定のパラメータを使用し、後でそのパラメータをアニメートすると、入力接続は現在のフレームで更新される前のファンクション カーブまたはエクスプレッションからパラメータの値を取得します。

  • [この問題を解決するには](To solve this problem)、他のアニメーションを定義した後にスクリプト オペレータを再適用します。

  • [この問題を回避するには](To avoid the problem)、スクリプト オペレータを適用する前に、パラメータのエクスプレッションを作成するか、キーを設定します。

スクリプト オペレータで列挙値を使用する

オブジェクト モデルで定義された列挙値は、スクリプト オペレータでは正しく計算されません。したがって、整数値を直接使用する必要があります。

たとえば次のようになります。

LogMessage "Closed in U: " & bClosed(0)(0)
LogMessage "Closed in V: " & bClosed(1)(0)

代わりに、以下を使用します。

LogMessage "Closed in U: " & bClosed(siUDirection)(0)
LogMessage "Closed in V: " & bClosed(siVDirection)(0)