カスタム アトリビュート管理関数

次の管理関数は custAttributes 構造体を通して使用できます。

custAttributes.count <obj> [BaseObject:<boolean>]     

.add() 関数により追加された個々のスクリプト カスタム アトリビュート セット数のカウントを返します。

オプションのキーワード引数 baseObjecttrue (既定値)に設定されている場合、指定されているオブジェクトがノードであれば、そこでは基本オブジェクトが代わりに動作します。false の場合、ノードそのものがそこで動作します。

custAttributes.get <obj> (<index> | <attrib_def>)[BaseObject:<boolean>]

インデックスとして指定された、あるいはそれにより定義されるアトリビュート定義により指定された、カスタム アトリビュート セットを返します。

オプションのキーワード引数 baseObjecttrue (既定値)に設定されている場合、指定されているオブジェクトがノードであれば、そこでは基本オブジェクトが動作します。false の場合、ノードそのものがそこで動作します。3ds Max 5.1 より前のバージョンでは、基本オブジェクトが常に使用されていました。

注:

custAttributes が返すカスタム アトリビュート セット値は、そのアトリビュート セット内のオブジェクトのカスタム パラメータに対する、事実上のホルダー値です。これらのパラメータ値は、アトリビュート セット値の単純なプロパティとして取得できます。

    gp = custAttributes.get $ gameParams
    gp.hitPoints= 50                   

これは、オブジェクト上のカスタム アトリビュート パラメータに直接アクセスすることと同じです。

    $.gameParams.hitPoints = 50                 
custAttributes.delete <obj_or_collection> (<index> | <attrib_def>) [baseObject:<boolean>]

オブジェクトから、あるいは指定したコレクション内のオブジェクトすべてから、特定のカスタム アトリビュート セットを削除します。削除されるセットは、インデックス番号、またはそれが定義するアトリビュート定義によって定義されます。

オプションのキーワード引数 baseObjecttrue (既定値)に設定されている場合、指定されているオブジェクトがノードであれば、そこでは基本オブジェクトが動作します。false の場合、ノードそのものがそこで動作します。3ds Max 5.1 より前のバージョンでは、基本オブジェクトが常に使用されていました。

custAttributes.makeUnique <obj> (<index> | <attrib_def>) [baseObject:<boolean>]

カスタム アトリビュート セットを保持するオブジェクトが特定のアトリビュート定義を共有する場合、選択したオブジェクトに定義の一意なコピーを持たせることができます。

オプションのキーワード引数 baseObjecttrue (既定値)に設定されている場合、指定されているオブジェクトがノードであれば、そこでは基本オブジェクトが動作します。false の場合、ノードそのものがそこで動作します。3ds Max 5.1 より前のバージョンでは、基本オブジェクトが常に使用されていました。

    custAttributes.add $box* def1             

次のようにして box01 を一意にします。

    custAttributes.makeUnique $box01 def1           

あるいは、これらすべてを一意にします。

    custAttributes.makeUnique $box* def1         
custAttributes.getDef (<obj> <index>) | <custAttrib> [baseObject:<boolean>]

オブジェクト内の与えられたカスタム アトリビュート セットのアトリビュート定義か、.get() メソッドを使ってアクセスするカスタム アトリビュート セットからのアトリビュート定義を返します。

オプションのキーワード引数 baseObjecttrue (既定値)に設定されている場合、指定されているオブジェクトがノードであれば、そこでは基本オブジェクトが動作します。false の場合、ノードそのものがそこで動作します。3ds Max 5.1 より前のバージョンでは、基本オブジェクトが常に使用されていました。

custAttributes.getDefs <obj> [baseObject:<boolean>]

定義の配列をアトリビュート セットの順に返します。

オプションのキーワード引数 baseObjecttrue (既定値)に設定されている場合、指定されているオブジェクトがノードであれば、そこでは基本オブジェクトが動作します。false の場合、ノードそのものがそこで動作します。3ds Max 5.1 より前のバージョンでは、基本オブジェクトが常に使用されていました。

次のトピック

カスタム アトリビュートのアトリビュート定義値

スクリプト カスタム アトリビュート定義の競合を処理する

3ds Max は、スクリプト カスタム アトリビュート定義のバージョン情報を使用して、既存のカスタム アトリビュートとシーンからロードされたカスタム アトリビュートとの間で競合が発生した状況を管理する方法を決定します。3ds Max 2012 以降、既定で、バージョン番号が最も大きい CA 定義が使用されます。ただしこの動作は、custAttributes 構造体の次のメソッドを使用して変更できます。

custAttributes.getSceneLoadVersionHandlingBehavior()

シーンがロードされたときにカスタム アトリビュート定義の競合を処理する現在の動作を返します。

custAttributes.setSceneLoadVersionHandlingBehavior   {#neverUpdate | #alwaysUpdate | /
 #updateWhenLoadVersionGreaterThanCurrentVersion | #updateWhenLoadVersionGreaterThanOrEqualToCurrentVersion} /
 persistent:<boolean>

シーンがロードされたときにカスタム アトリビュート定義の競合を処理する動作を設定します。オプションは次のとおりです。

persistent が true の場合、この設定は 3ds Max セッション間で保持されます。

custAttributes.getSceneMergeVersionHandlingBehavior()

シーンまたはオブジェクトが現在のシーンと合成されるとき、カスタム アトリビュート定義の競合を処理する現在の動作を返します。

custAttributes.setSceneMergeVersionHandlingBehavior {#neverUpdate | #alwaysUpdate | /
 #updateWhenLoadVersionGreaterThanCurrentVersion | #updateWhenLoadVersionGreaterThanOrEqualToCurrentVersion} /
 persistent:<boolean>

シーンまたはオブジェクトが合成されるとき、カスタム アトリビュート定義の競合を処理する動作を設定します。オプションは次のとおりです。

persistent が true の場合、この設定は 3ds Max セッション間で保持されます。

カスタム アトリビュートを処理するためのシーンのロード時のコールバック

シーン ファイルをロードする際にカスタム アトリビュート定義の処理方法の管理が必要になる場合があります。たとえば、API が変更された場合や、新しいバージョンの 3ds Max でカスタム アトリビュートを「パッチ」する必要がある場合などです。これらのメソッドを使用して、カスタム アトリビュートを処理するコールバックを登録できます。

custAttributes.registerDefLoadCallback <function>

シーンからロードされるときにスクリプト カスタム アトリビュート定義ごとに呼び出されるコールバックを登録します。<function> は、カスタム アトリビュート定義の文字列である 1 つの引数を取り、1 つの文字列を返します。この関数は、ロード時に文字列を変更して、カスタム アトリビュートを効果的に再定義できます。3ds Max 2021 以降 で使用可能です。 注: カスタム アトリビュート定義は、シーンからカスタム アトリビュートのインスタンスをロードするために使用されるため、カスタム アトリビュート定義が正常にロードされるように、必要な最小限の変更のみを行う必要があります。具体的には、パラメータの追加や削除、パラメータ タイプの変更、またはアニメート可能かどうかの変更は行わないでください。これらの変更は、すべてロード処理に影響します。より広範囲に変更する必要がある場合は、custAttributes.redefine() を使用し、シーンをロードした後に変更できます。

コールバックの実行時にエラーが発生した場合、エラー メッセージがリスナーに出力され、関数がコールバックとして削除されます(後続のカスタム アトリビュート定義については呼び出されなくなります)。

コールバックとして複数の関数を登録できます。

<boolean>custAttributes.unRegisterDefLoadCallback <function>

指定された function を削除します。コールバックが見つかり削除された場合には true を返し、見つからなかった場合には false を返します。3ds Max 2021 以降 で使用可能です。

custAttributes.unRegisterAllDefLoadCallbacks()

registerDefLoadCallback() によって登録されたすべてのコールバックを削除します。3ds Max 2021 以降 で使用可能です。

custAttributes.showregisteredDefLoadCallbacks [to:stream] [asArray:<boolean>]

registerDefLoadCallback() によって登録されたすべてのコールバックを表示します。to: を指定すると、出力は指定されたストリームに送信されます。asArray:true を指定すると、情報は配列として返されます。各配列要素は 2 つの要素の配列になります。最初の要素は関数名、2 番目の要素は関数が定義されたスクリプト ファイルです(存在する場合)。3ds Max 2021 以降 で使用可能です。

「weaponData」カスタム アトリビュートの例を考えてみます。「default」パラメータを変更し、バージョン パラメータを追加する場合は、次のコールバックを登録します。

fn modifyCADef def =
(
if (findstring def "weaponData") != undefined do
    (
        def = substituteString def "default:10" "default:20"
        def = substituteString def "attributes weaponData\n" "attributes weaponData version:1\n"
    )
    def
)
custAttributes.registerDefLoadCallback modifyCADef
custAttributes.showregisteredDefLoadCallbacks()