スクリプト カスタム アトリビュートは、シーン ファイルに正しく保存され、シーン ファイルから正しくロードされます。
固定のグローバル定義 ID をアトリビュート定義に割り当てることができます。
これは、スクリプト プラグインでのクラス ID と同じように作用します。このような定義はカスタム アトリビュートがあるシーン全体にわたってグローバルであるため、グローバル定義のカスタム アトリビュートのインスタンスはすべて同じ形状を持つことになります。この ID は新しいヘッダ パラメータ attribID: を使用して指定します。
MAXScript では、ID 番号のペアは通常 genClassID() 関数を使って生成されるため、一意に選択されます。attribID を含まないアトリビュート定義は、現在の MAX セッションで対してプライベートです。
このメソッドは、#(0x9b7ea231, 0xb6db86ef) のようなランダム クラス ID を生成し、それをリスナーに印刷します。このクラス ID を切り取ってスクリプトに貼り付け、生成された ID を使用することができます。オプションの returnValue キーワードを true に設定すると、メソッド呼び出しの結果として値が返されます。
グローバル定義には、グローバルに一意な ID を定義する明示的な attribID: パラメータがあります。これにより、この ID 定義に基づくカスタム アトリビュートを保持するオブジェクトは、確実に同じ定義に従うことになります。特定の attribID: を持つアトリビュート定義を評価するときは常に、その定義に基づくカスタム アトリビュートを持つ全オブジェクトを更新することになり、その attribID のアトリビュートを持つオブジェクトをロードすると、それ自体が現在の定義に更新されます。
プライベート定義には、明示的な attribID: パラメータがありません (実際には、内部的に生成されるランダムなパラメータが含まれます)。以下の再定義で説明されている場合を除き、評価するたびに、独自の内部 ID を使用して完全に別個の定義が作成されます。
グローバル定義とプライベート定義では両方とも、「アトリビュート」定義構文が値として定義を返します。通常はその値をローカルに割り当て、それを使って custAttributes.add () 関数を介してカスタム アトリビュートをオブジェクトに追加します。
この例では、定義されたカスタム アトリビュートの個々のセットを、box01 と box02 に追加しています。この定義は 2 つのボックス間で共有されます。
これはプライベート定義であり、attribID: はありません。このため、再度「def = attributes (...)」を評価する場合、box01 と box02 のアトリビュートは自動的には 更新されず 、前回構築時の更新が使われます。 ただし、定義は新規作成されます。
特定のアトリビュート定義を使用してアトリビュートを追加したすべてのオブジェクトが更新されるようにこのアトリビュート定義を再定義するには、 実際の定義値を操作する 2 つのスキームのいずれかを使用します(上記の例では「def」変数内に記述しています)。
最初に、新しい「redefine:」アトリビュート定義パラメータを使用できます。
これにより、redefine: パラメータに既存のアトリビュート定義が値として指定されたとみなされ、その定義に合わせて更新が行われます。また、特定の定義値を使って構成されたすべてのカスタム アトリビュートが更新されます。この例では、$box01 と $box02 を更新します。
あるいは、 custAttributes.redefine メソッド を使用できます。
これは、アトリビュート定義を文字列として自動的に生成する場合、特に便利です。この関数を使用して、再定義のコンパイルおよび特定の定義オブジェクトへの適用を一度に実行できます。この場合、オブジェクト用に名前を生成する必要はなく、redefine: パラメータのスキームを使用する場合と同様に実行できます。
あるオブジェクトのアトリビュートを、たとえばそのオブジェクトのカスタム アトリビュートにある defData に基づいて定義するには、次のシーケンスを使用します。
old_def = custAttributes.getDef $box03 1 -- get existing def old_def_data = custAttributes.getDefData old_def -- get my defData from it new_def_string = generate_new_def old_def_data ... -- make new def string custAttributes.redefine old_def new_def_string -- redefine it
この再定義技術はグローバル定義 (明示的な attribID:) とともに使用できますが、厳密に言えばその必要はありません。特定の定義値は attribID: パラメータによって一意に指定されるためです。グローバル定義を評価する場合は、現在のシーン内の、該当する定義で構成されるすべてのカスタム アトリビュートが更新されます。