永続グローバル変数

MAXScript では、特定の種類のクラスに限り、存続グローバル変数がサポートされています。グローバルを存続グローバル変数として宣言すると、この変数を含む値が、シーン ファイルを開くたびにシーン ファイルから復元され、閉じるたびにシーン ファイルに保存されます。こうしておくと、シーン内のオブジェクトへの直接参照を変数に保存することができ、シーンの保存や再読み込みを行っても参照が維持されます。

グローバル変数を存続グローバル変数として宣言するには、予約語 persistent を指定します。

スクリプト実行

persistent global foo, baz, bar

変数 foo baz 、および bar を存続変数として宣言します。これ以降、 foo baz 、および bar の値は、シーンの保存時に .max シーン ファイルに保存されます。このファイルを再度開くと、 foo baz bar に保存されている値が復元されます。これらの変数がまだ宣言されていない場合は、暗黙的に存続グローバル変数として宣言されます。

存続グローバル変数の現在の制限は、特定の種類の値しかシーン ファイルに保存できないことと、シーン ファイルへ保存する値やシーン ファイルからロードする値もこれらのタイプに限られることです。

サポートされている値のクラスは、AngleAxis、Array、Boolean、Color、Double、EulerAngles、Float、Integer、Integer64、IntegerPtr、Interval、Matrix3、Name、OK、Point2、Point3、Point4、Quat、Ray、String、Struct、Time、Undefined、Unsupplied およびすべての MAXWrapper クラス(ノード、モディファイヤ、コントローラ、マテリアルなど)です。これ以外のタイプの値は、 undefined として復元されます。

配列の場合には、配列内の上記にリストした値のみが適切に保存され復元されます。その他の値は、保存された配列内で undefined として表示されます。

IntegerPtr の読み込みおよび保存のサポートが 3ds Max 2015 に追加されました。以前の 3ds Max バージョンに保存する場合、IntegerPtr の値は Integer64 の値として格納されます。

存続グローバル変数は、[ファイル](File) > [リセット](Reset)、[ファイル](File) > [新規](New)、または[ファイル](File) > [開く](Open)を実行したときに存続グローバル変数プールから削除されますが、その MAX セッションの間は、通常の非存続グローバル変数としてメモリに残っています。その後、MAX セッション中に宣言された存続グローバル変数は「存続」しなくなり、そのセッション中に他のファイルが保存されるごとに格納されます。

注:

ファイル内で合成または外部参照を行う場合(シーンまたはオブジェクトの外部参照は合成の特殊ケース)に、存続グローバル変数を読み込むときには、

  • シーン ファイルから読み込まれた変数が、存続グローバル変数として既に存在する場合、その存続グローバル変数の値は上書きされません (3ds Max 8 より前のバージョンでは上書きされていました)。

  • 存在する変数が非存続グローバル変数である場合、このグローバル変数の値が上書きされます。

  • この変数がグローバル変数として存在しない場合は、非存続グローバルが作成されます。後半 2 つの動作は以前のバージョンの 3ds Max での動作と同じです。

必要であれば、 #filePreSave コールバックを使用して、新規ファイルごとに存続グローバル変数をインストールできます。詳細は、「一般イベント コールバック機能」を参照してください。

ただし、この動作は、元々存続グローバル変数として宣言された変数が、スクリプトの作成または実行中に複数のシーンにわたって通常のグローバル変数として定義されたままでも、これらの保存したシーンが別の MAX セッションで再び開かれたときには、undefined として表示されるということも意味します。

以下に、コールバックを使用してこのような場合を処理する 2 つの例を示します。

例 1:

特定の重要な変数が新規および開かれたシーンにその値を運び、常に存続グローバル変数として存在することが、スクリプトで要求されている場合、次のコールバックを使用すると、[ファイル](File) > [リセット](Reset)、[ファイル](File) > [新規](New)、および[ファイル](File) > [開く](Open)のイベント中にこの要件が確保されます。

callbacks.addscript #systemPostNew "persistent global myVar" id:#myTools
callbacks.addscript #systemPostReset "persistent global myVar" id:#myTools
callbacks.addscript #filePostOpen "persistent global myVar" id:#myTools

重要な変数は宣言され直すだけで、その値は影響されないまま、存続グローバル変数としてシーン内に保存されます。

例 2:

別の場合では、特定の重要な変数が常に存続グローバル変数として存在するが、その現在の値を別のシーンに運ぶのではなく、その代わりに存続グローバル変数を定義していない新規および開かれたシーンの既定値に戻すか、または存続グローバル変数を定義している開かれたシーンから値を復元することが、スクリプトで要求されているとします。次のコールバックは、[ファイル](File) > [リセット](Reset)および[ファイル](File) > [新規](New)イベントで既定値を変数に割り当てますが、存続グローバル変数が開かれたファイルに存在していない場合は、[ファイル](File) > [開く](Open)イベントでも既定値を割り当てるだけです。

callbacks.addscript #systemPostReset "persistent global myVar=0.0" id:#myTools
callbacks.addscript #systemPostNew "persistent global myVar=0.0" id:#myTools
callbacks.addscript #filePreOpen "myVar=undefined" id:#myTools
callbacks.addscript #filePostOpen "if myVar==undefined do (persistent global myVar=0.0)" id:#myTools

[ファイル](File) > [リセット](Reset)および[ファイル](File) > [新規](New)のイベントでは、重要な変数は宣言し直され既定値が割り当てられますが、[ファイル](File) > [開く](Open)のイベントでは、変数は最初に undefined になってから、ファイルが開いた後でテストされます。この存続グローバル変数が開かれているシーン内ですでに存在し定義されている場合、この変数は、古い値を持つ存続グローバル変数としてすでに復元されています。この場合、すでに存続グローバル変数プールに入っており、明示的に削除するまで存続し続けるため、存続グローバル変数として宣言し直す必要はありません。

注:

上記のどちらの例でも、現在の MAX セッションが終わるまで、存続グローバル変数がこのコールバックによって作成され続けるという問題が起きる可能性があります。これが望ましい処理でない限り、スクリプトを閉じたときに、作成したコールバックを削除させることによって、この問題を回避する必要があります。

例:

ユーティリティまたはダイアログ ロールアウトにスクリプトが存在している場合、関連するクローズ イベント ハンドラには、コールバックを削除する「callbacks.removeScripts」コマンドが含まれている必要があります。

on myToolsUtility close do (callbacks.removeScripts id:#myTools)

この例でも、可能な場合は必ず id: パラメータを使用した方がよいことを示しています。このパラメータを使用すれば、他のスクリプトに所属するコールバックを間違って削除することがなくなるため、簡単に削除できるだけでなく、限定して削除できるようになります。

詳細は、「一般イベント コールバック機能 」および「ユーティリティおよびロールアウトのプロパティ、メソッド、およびイベント ハンドラ」を参照してください。

存続グローバル変数を作成収集テスト表示、および削除するためのメソッドについては、「Persistents 構造体」を参照してください。

注:存続グローバル変数に MAXWrapper 値が含まれるときに、クラス インスタンスがシーン内に存在しない場合、その値はファイルの保存/ロード時に保存/復元されません

例:

-- persistents - node only
persistent global global_array = #() 
global_array[1] = b= box() 
global_array[2] = bm= bend() 
global_array[3] = sm= standard() 
global_array[4] = fog() 
global_array[5] = area() 
global_array[6] = bezier_float() 
global_array[7] = br= bricks() 
global_array[8] = lookat() 
global_array[9] = blur() 
global_array[10] = MapScaler() 
--b.material=sm 
--addmodifier b bm 
--sm.diffusemap=br 
persistents.show() 
max hold 
max fetch
persistents.show()

備考:

このスクリプトを実行した後には、ボックスだけが配列に存在します。コメント行を実行すると、マテリアル、モディファイヤ、マップも配列に入ります。MAXScript は、存続変数を出力したときに、参照ツリー全体のダンプを行いません。MAX オブジェクトの RefID だけを出力します。つまり、メイン ファイルの保存コードによる参照として、ダンプされます。

関連事項