MaxScriptTip: ロールアウト挙動メモ

2月 21, 2016
ロールアウトの挙動がわりと意味不明だったので、勉強も兼ねて簡単に調べてみました。
  1. ロールアウトは定義されたタイミングで単一のオブジェクトとなる。
    クラス・インスタンスという概念はなく、プロセス内で1つの実体しか持てない。
    また、1つのオブジェクトにつき1つのウィンドウしか作れない。
    試しにcreateDialogを2度実行しても、作成されるダイアログは1つのみ。
    複数のSubRolloutやFloaterで実体を作成しようとしても、既に別の場所で実体化されているロールアウトは作成されない。
  2. 作成されたロールアウトは、同名の変数に格納される。
    例えばTestRolloutならTestRollout変数に格納される。
    普通の変数なので代入などで上書きする事ができる。
    また、作成したロールアウトオブジェクトを別の変数に入れ替える事もできる。
  3. 複数の実体を作りたい時には、再度定義コードを実行しなければならない。
    定義を実行すると、新規にロールアウトオブジェクトが作成され、同名の変数に上書きされる。
    前に作成したオブジェクトへの参照が失われる為、後から参照したいときは、予め変数からオブジェクトを取り出しておく必要がある。
    例えばSubRollout内の子要素を参照したいとき等、新しく作成した方のロールアウトを参照してしまい、意図しない挙動をする事がある。
  4. copy関数等でオブジェクトを複製する事は出来るが、それらは同一のロールアウトを参照しており、やはり多重起動できない。
  5. ロールアウトはcreateDialog等で実体化する時に、再度初期化される。
    実体化前に変数や関数にアクセスする事は出来るが、実体化時に再度初期化される。
全体的にかなりよく分からない仕様になっていますが、重要なのはオブジェクトと変数を切り離して考える事、クラス・インスタンスの概念が存在しない事を把握する事かと思います。
Max自体が20年以上も前に設計されたソフトだという事もあり、いわゆるオブジェクト指向的な考え方には則っていないのだと思います。

Related Articles