MAXScript では、特定の種類のクラスに限り、存続グローバル変数がサポートされています。グローバルを存続グローバル変数として宣言すると、この変数を含む値が、シーン ファイルを開くたびにシーン ファイルから復元され、閉じるたびにシーン ファイルに保存されます。こうしておくと、シーン内のオブジェクトへの直接参照を変数に保存することができ、シーンの保存や再読み込みを行っても参照が維持されます。
グローバル変数を存続グローバル変数として宣言するには、予約語 persistent を指定します。
変数 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 セッション中に宣言された存続グローバル変数は「存続」しなくなり、そのセッション中に他のファイルが保存されるごとに格納されます。
必要であれば、 #filePreSave コールバックを使用して、新規ファイルごとに存続グローバル変数をインストールできます。詳細は、「一般イベント コールバック機能」を参照してください。
ただし、この動作は、元々存続グローバル変数として宣言された変数が、スクリプトの作成または実行中に複数のシーンにわたって通常のグローバル変数として定義されたままでも、これらの保存したシーンが別の MAX セッションで再び開かれたときには、undefined として表示されるということも意味します。
以下に、コールバックを使用してこのような場合を処理する 2 つの例を示します。
例 1: |
特定の重要な変数が新規および開かれたシーンにその値を運び、常に存続グローバル変数として存在することが、スクリプトで要求されている場合、次のコールバックを使用すると、[ファイル](File) > [リセット](Reset)、[ファイル](File) > [新規](New)、および[ファイル](File) > [開く](Open)のイベント中にこの要件が確保されます。 |
重要な変数は宣言され直すだけで、その値は影響されないまま、存続グローバル変数としてシーン内に保存されます。
[ファイル](File) > [リセット](Reset)および[ファイル](File) > [新規](New)のイベントでは、重要な変数は宣言し直され既定値が割り当てられますが、[ファイル](File) > [開く](Open)のイベントでは、変数は最初に undefined になってから、ファイルが開いた後でテストされます。この存続グローバル変数が開かれているシーン内ですでに存在し定義されている場合、この変数は、古い値を持つ存続グローバル変数としてすでに復元されています。この場合、すでに存続グローバル変数プールに入っており、明示的に削除するまで存続し続けるため、存続グローバル変数として宣言し直す必要はありません。
例: |
ユーティリティまたはダイアログ ロールアウトにスクリプトが存在している場合、関連するクローズ イベント ハンドラには、コールバックを削除する「callbacks.removeScripts」コマンドが含まれている必要があります。 |
この例でも、可能な場合は必ず id: パラメータを使用した方がよいことを示しています。このパラメータを使用すれば、他のスクリプトに所属するコールバックを間違って削除することがなくなるため、簡単に削除できるだけでなく、限定して削除できるようになります。 詳細は、「一般イベント コールバック機能 」および「ユーティリティおよびロールアウトのプロパティ、メソッド、およびイベント ハンドラ」を参照してください。 |
存続グローバル変数を作成、収集、テスト、表示、および削除するためのメソッドについては、「Persistents 構造体」を参照してください。