ロールアウトと UI コントロールのキャプションとしての非ローカル変数

3ds Max 2012 よりも前のバージョンでは、ロールアウトや UI コントロールのキャプション パラメータは文字列リテラルとして指定し、変数名では指定できません。そのため、計算した名前を使用することは困難でした。これは、ロールアウトまたはコントロールのキャプション プロパティをその構築後に設定するか、文字列構築または Rollout Creator 関数の評価を使用してロールアウト全体を作成する必要があったためです。

3ds Max 2012 には、非ローカル変数名を使用してロールアウトや UI コントロールのキャプションを指定するための機能が追加されています。 つまり、変数はローカル変数や、関数パラメータを通じて渡された変数名であってはなりません。変数は、構造体定義、MacroScript 定義、またはスクリプト プラグイン定義など、グローバル スコープまたはトップレベル スコープにある必要があります。

この制約は、ロールアウト定義はコンパイル時の構文であり、ローカル変数はロールアウトがコンパイルされるときにコンテキストを使用して定義されることに起因します。しかし、変数の評価はロールアウトを作成するときに行われ、そのときまでにはコンパイル コンテキストではなくなります。そのため、ローカル変数をキャプションとして使用した場合、コンパイル時エラーが発生します。

    fn test cap1 =
    (
      cap2 = "cap2"
      Rollout test cap1
      (
        Spinner s1 cap2
      )
      createdialog test
    )
    -- Compile error: No outer or current scope local variable references permitted here: cap1
    -- In line: Rollout test cap1

cap1 の上記の使用方法を文字列リテラルに変更した場合、cap2 の使用に関する別のエラーが発生します。

正常にコンパイル可能な使用方法をいくつか示します。

    cap1 = "cap1"
    cap2 = "cap2"
    fn test =
    (
      Rollout test cap1
      (
        Spinner s1 cap2
      )
      createdialog test
    )
    test()

    struct xxx
    (
      cap1b = "cap1",
      cap2b = "cap2",
      fn createRollout =
      (
        rollout test cap1b
        (
          spinner s00
          spinner s01 "A"
          spinner s1 cap2b
        )
        createDialog test
      )
    )
    x = xxx()
    r=x.createRollout()

    plugin material MyMaterial
    name:"MyMaterial"
    classID:#(0x69fedc0d, 0x7c79a4d2)
    extends:Standard replaceUI:true
    (
      local rollout_title = "Hardware Shaders"
      local spinner_title = "AA"
      parameters hardwareShaders rollout:shaderRoll
      (
      )
      rollout shaderRoll rollout_title width:328 height:189
      (
        spinner s1 spinner_title
      )
    )
    a=mymaterial()
    meditmaterials[1] = a