MAXScript は、次のようにスクリプト プラグインのレベルをいくつかサポートしています。
スクリプト プラグインは、新しいクラスとしてユーザ インタフェースに表示されますが、シーン内のクラスのインスタンスにはなりません。シーン内の他のオブジェクトを作成するマウス ツールを定義できますが、一度作成を完了すると、修正や保存を行うためのクラスのインスタンスはシーン内に残りません。3ds Max の例では、RingArray などの System クラスがあります。
スクリプト プラグインは、既存のプラグイン用のコマンド パネル パラメータ ロールアウトを追加したり置き換えて、既存のプラグインを拡張します。たとえば、新しい「ガラス」のマテリアルを作成する場合があります。このマテリアルは StandardMaterial を拡張し、カスタム化したより小さなマテリアル エディタ ロールアウトを提供します。[マテリアル エディタ](Material Editor)ロールアウトにはガラス プロパティがあり、元となるマテリアル プラグインを適切に設定および修正します。あるいは、実際に対応付けられたライトのシステムで、「制御用」ダミー オブジェクトもある新しいライト タイプを作成する場合があります。この制御用ダミー オブジェクトには、システム内のライトを記録し、システムに対応する操作を行うためのロールアウトが[作成](Create)パネルや[修正](Modify)パネルにあります。この場合、ダミーを拡張し、ライトを格納するローカルを持ち、更にロールアウトを定義する新規ヘルパー プラグインを作成します。また、システムを構築する作成ツールを使用して、新しいライト プラグインを作成することもできます。
スクリプト プラグインは、スクリプトの作成者によって一意で永久的なクラス ID 値が与えられ、シーンでインスタント化したり、シーン ファイルに保存したりすることができます。すべての3ds Max プラグインには、一意のクラス ID が与えられます。3ds Max はこのクラス ID を使い、シーン ファイルを開くたびに保存されたシーン オブジェクトをシーン オブジェクトが処理されるコードに関連付けます。このため、クラス ID は一意に、固定されていなければなりません。このため、クラス ID は一意に、固定されていなければなりません。上記のレベル 1 のスクリプト プラグインでは、MAXScript は 3ds Max の実行に永久的でない一時的なクラス ID を割り当てているため、シーンでインスタンス化を行うことができません。
スクリプト プラグインは、複数のパラメータ ブロックを定義します。ここには、シーン ファイルに保存されたり、そこから復元される直接アニメート可能なパラメータが含まれます。これらは、プラグイン用の永久的なパラメータで、上記の例のような作成中にのみ使用できるローカル変数とは区別されます。
パラメータ ブロックは、パラメータ ブロックのパラメータ用ユーザ インタフェースを表示するスクリプト プラグインのロールアウトに関連付けられます。このように関連付けられている場合、パラメータは該当するスピナーやチェックボックスなどに「関連付け」られ、変更時に自動的に更新されます。
スクリプト化されたプラグインの一般的なフォームを次に示します。
<superclass>とは、現在サポートされているプラグイン スーパークラスの 1 つです。
Geometry SimpleObject Shape Light Camera Helper Modifier SimpleMod TrackViewUtility Material TextureMap RenderEffect Atmospheric
<varname> は、このプラグイン クラスを含むグローバル変数に与えられる名前です。このクラス値は、通常のプラグイン クラス(ボックスや球など)と同じで、クラス値を適用して MAXScript にプラグインのインスタンスを作成することができます。
{keyword:val} はオプションであり、プラグインのオプションを定義するキーワードと値の一連のペアです。次のようなペアがあります
オプションの name: パラメータでは、3ds Max ユーザ インタフェースに表示されるプラグイン名を指定します。たとえば、プラグインのスーパークラスが geometry または light である場合、この名前は[作成](Create)パネルのプラグインのボタンに表示されます。プラグインのスーパークラスが modifier である場合、この名前は[修正](Modify)パネルのプラグインのボタンに表示されます。そして、プラグインのスーパークラスが material または textureMap である場合、この名前はマテリアル/マップ ブラウザに表示されます。既定値の名前はプラグインの <varname> です。
3ds Max 2014 以前のバージョンでは、クラス インスタンスとシーン オブジェクトの名前付けの定義には name: パラメータが使用されていました。これは 3ds Max 2014 で変更されました。<varname> はクラス インスタンスおよびシーン オブジェクトの名前を定義するために使用され、name: パラメータは UI の(ローカライズ可能な)作成ボタン/エントリにのみ使用されます。
たとえば、スクリプトによって記述されたジオメトリ プラグインの <varname> が myCuboid で name: が "Supa Cuboid" の場合、その作成ボタンには "Supa Cuboid" と表示されます。ただし、モディファイヤ スタックには "myCuboid" というベース オブジェクトが表示され、シーン ノードの名前は "myCuboid001" になります。 以前の 3ds Max のバージョンでは、モディファイヤ スタックには "Supa Cuboid" と表示され、シーン ノードの名前は "Supa Cuboid001" でした。
オプションの category: パラメータは、プラグインが表示されるオブジェクト カテゴリ(オブジェクト カテゴリ リストからアクセスする)を指定します。このパラメータは、[作成](Create)パネルに表示されるプラグインのみに適用されます。既定値のカテゴリは、「標準」です。各カテゴリの[作成](Create)パネルでは、使用可能なボタンの数が固定されていることに注意してください。このパラメータは、[作成](Create)パネルに表示されるプラグインのみに適用されます。
プラグインをシーンに作成および保存できるようにする場合は、 classID:#(<integer>,<integer>)パラメータを指定します。この ID は、クラスの永久的な ID で、シーンに保存したり読み込むときにオブジェクトを識別するために 3ds Max に使用されます。プラグインがシーン内に異なるオブジェクト タイプのみを作成する System オブジェクトと同じ場合は、クラス ID 値を指定する必要はありません。クラス ID は、基本的に番号をペアで表示したもので、他のプラグインと競合しないようにランダムに選択されます。MAXScript では、実行のたびに新しいランダム クラス ID を生成するメソッドを使用します。
このメソッドは、#(0x9b7ea231, 0xb6db86ef)のようなランダム クラス ID を生成し、それを既定値ではリスナーに印刷します。このクラス ID を切り取ってスクリプトに貼り付け、生成された ID を使用することができます。
3ds Max 6 以降では、 returnValueL が True の場合、クラス ID はリスナーに出力されず、クラス ID の 2 つの部分を含む 2 つの要素配列が返されます。
extends:<maxClass> パラメータは、既存のプラグインに新しいプラグインを使用する場合に指定します。これにより基本的には、拡張するクラスと内部的にまったく同じように機能する新しいクラスを追加することができます。なお、ユーザ インタフェースは拡張されたり置き換えられたりします。指定するクラスには、スクリプト プラグイン ヘッダで指定したのと同じスーパークラスが必要です。現行の制限により、特にカスタム作成マネージャなどを含むような特定のプラグインは拡張できないようになっています。プラグインが拡張できない場合は、新しいロールアウトが表示されません。
別のオブジェクトを拡張するスクリプト プラグインのオブジェクトを作成すると、MAXScript によって extends: プラグインの内部オブジェクトが作成され、3ds Max のほとんどの操作がプラグインとともに内部オブジェクトに渡されます。これは「デレゲート」と呼ばれ、内部の extends: プラグイン オブジェクトがデレゲートに相当します。デレゲートはトラック ビュー内のプラグインのオブジェクトに表示されます。必要に応じ、スクリプト内のデレゲートにアクセスしてコントロールできます。詳細は、次のローカルのセクションを参照してください。replaceUI:true が指定されている場合、デレゲートはテレビに表示されません。
replaceUI: パラメータは、 extends: を指定して、プラグイン内のロールアウトを追加するか、あるいは拡張プラグインのロールアウトを置き換えるかを示す場合にのみ使用されます。既定値は false です。これは、ロールアウトが拡張プラグインの最後に追加されることを意味します。オブジェクトが[作成](Create)パネルで作成されるプラグインを拡張する場合は、別の現行の制限により、[モディファイヤ](Modifier)パネルでユーザ インタフェースの置き換えのみが可能となり、オリジナルのプラグインのロールアウトは常に、スクリプト化されたロールアウトとともに[作成](Create)パネルに表示されます。
オプションの version: パラメータでは、スクリプト プラグインのバージョン番号を指定します。このパラメータに割り当てられた値は、スクリプト プラグインの定義を更新するときに使用されます。このパラメータの既定値は 1 です。このパラメータの詳細は、「スクリプト プラグインの更新」を参照してください。
オプションの invisible: パラメータは、プラグインを、[作成](Create)パネルの[オブジェクト タイプ](Object Type)ロールアウトまたは[マテリアル/マップ ブラウザ](Material/Map Browser)などで表示させるかどうかをコントロールします。これは、独自で作成できない System 型プラグインなど、グループの一部として作成されたコンポーネントや制御オブジェクトで使用する場合に便利です。このパラメータを true に設定すると、プラグインが非表示になります。
オプションの silentErrors: パラメータは、スクリプト プラグインでハンドラを実行するときに MAXScript のランタイム エラー メッセージを表示させるかどうかをコントロールします。このパラメータを true に設定すると、エラー メッセージは表示されなくなります。これは、MAXScript エラー メッセージによってユーザが混乱するかもしれないスクリプト プラグインが配布された場合に使用すると便利です。
usePBValidity:<boolean>
オプションの usePBValidity: 引数は、既存のクラスを拡張するスクリプト プラグインに適用されます。usePBValidity がfalse (既定。元の動作と一致)の場合、スクリプト プラグインの有効な間隔にはスクリプト プラグイン内のコントローラの有効性は含まれず、使用されるデレゲートの有効性のみが含まれます。true の場合、有効性の間隔は、デレゲートの有効性の間隔とスクリプト プラグインで定義したパラメータ ブロックの有効な間隔との交差になります。
この引数は整数で、このうち 32 ビットは[作成](create)パネルと[修正](modify)パネルの両方のロールアウトのロールアップ状態を初期化するために使用されます。ただし、これら 2 つのパネルではセマンティクスが異なります。[作成](create)タブでロールアップが作成される場合、ロールアップの状態は常にこの値によって指定されたものになります。[修正](modify)タブでは、このタイプのオブジェクトが最初に修正されるときの状態はこの値で指定されたものですが、それ以降は直前に設定された状態が維持されます。この値のビットは、対応するロールアウトのページがロールアップされている(閉じられている)ことを示します。ゼロ ビットはプラグインの最初のロールアウトに、1 つ目のビットは 2 番目のロールアウトにと、順に対応していきます。既定値の 0x7fffffff は、この値が上書きできないことをコマンド パネルが検出できるようにして、ロールアウトを現状維持するために使用されます。たとえば、値 0x07 の結果、最初の 3 つのロールアウトがロールアップされ、残りのロールアウトが開きます。
3ds Max 6 以降では、オプションの autoPromoteDelegateProps: パラメータは、プラグイン上でプロパティへのアクセスが行われたがプロパティがプラグインによって定義されていない場合に、デレゲートのプロパティを自動的に検索するかどうかをコントロールします。既定値は false です。
このキーワードによって、既存の定義を更新するときに、定義内のパラメータ名を変更できます。
このキーワードは 2 要素配列を引数にとります。それぞれの要素には、文字列リテラルまたは名前値の配列が含まれます。2 つの配列のサイズは同じにする必要があります。
最初の配列内の名前は既存のパラメータ名で、2 番目の配列内の名前は新しいパラメータ名になります。既存のプラグイン インスタンスの移行中にパラメータ名が読み込まれるため、パラメータ名は最初の配列内で検索されます。名前が見つかった場合、このパラメータに関連するデータは、2 番目の配列内の対応する場所にあるパラメータ名に移されます。パラメータ名が最初の配列内で見つからなかった場合、パラメータ名は再マップされません。2 番目の配列内のパラメータ名が、新しい定義のパラメータ名に一致しない場合、このパラメータ データは、新しい定義には移されません。
<plugin_body> はカッコに囲む必要があり、プラグインを定義するローカル変数、関数、パラメータ、ユーザ インタフェース アイテム、およびイベント ハンドラを定義する一連の句です。これらの句の詳細は「スクリプト プラグイン句」を参照してください。
レベル 3 以上のスクリプト プラグインを使用するシーン ファイルのロード時にこのスクリプト プラグインを定義していなかった場合は、スクリプト プラグイン用の定義がないことを示す「DLL が見つかりません」というダイアログ ボックスがロード後に表示されます。さらに、DLL 定義のない他のオブジェクトに対する場合と同様に、定義のないオブジェクト用のスタンドインを使用してファイルがロードされます。3ds Maxでは、C++ プラグインに対する場合と同様にスクリプト ファイルが処理され、定義が適切な場所に存在する必要があります。定義は、3ds Max 起動時にプラグイン ディレクトリ内のスクリプト ファイル内にあるか、またはファイルのロード前に適切なスクリプトを実行して定義しておく必要があります。