以下の質問と回答は、3ds Max 8 以降のスクリプト コントローラで使用できるさまざまな変数タイプに関するものです。
3ds Max 8 以前の従来のスクリプト コントローラと 3ds Max 8 以降の新しいスクリプト コントローラとの相違点は、ノードを選択するための[ノード割り当て](Assign Node)ボタンにあります。
つまり、ノードがスクリプト コントローラの直接参照として維持されるのではなく、間接参照として維持されます。これは、NodeTransformMonitor という中間クラスで実行されます。
参照ノードからスクリプト コントローラに伝わるメッセージは、ノード変換メッセージとノード削除メッセージのみです。このため、循環従属を作成せずに、球の半径トラックにスクリプト コントローラを配置してから、球を維持するノードを示す変数をスクリプト コントローラに含めることができます。
ノードを示す変数がある場合、式コントローラでも NodeTransformMonitor を使用できることに注意してください。
「スクリプト コントローラ - 循環従属の回避」も参照してください。
[定数を割り当て](Assign Constant)をクリックした場合は、任意の有効な MAXScript 式を入力できます。結果は、MAXWrapper (ノード、マテリアル、モディファイヤ、コントローラなど) である場合、オブジェクトとして保存されます。結果が subAnim である場合はターゲットとして保存されます。
MAXScript 式から定数値を割り当てたり、式がコントローラに評価される場合はダイナミックな値を割り当てたりすることができます。
変数 myVar を作成して[定数を割り当て](Assign Constant)ボタンを使用して次の式を、
$Box01.position.x_position.controller.value
[定数を割り当て](Assign Constant)ダイアログ ボックスで割り当てた場合、現在のフレームにおけるコントローラの値は定数値として取得されて変数 myVar に割り当てられます。
$Box01.position.x_position.controller
コントローラを示すオブジェクト値が作成されます。コントローラの式コードでは、「myVar.value」を使用して現在の値を取得できます。値は定数として保存されずにダイナミックになり、現在の時間が変化するにつれて変更されます。
2 つのスクリプト コントローラ X と Y、および球のベース オブジェクトがあるノード N があるとします。X の変数は、オブジェクトとして N を示します。Y の変数は、ノードとして N を示します。球の半径を変更すると、X のみが再評価されます。N を移動すると、X と Y の両方が再評価されます。
コントローラは、ノード値として保存すると、ノードの変換が変化するかノードが削除された場合に限って無効になります。オブジェクト値として指定した場合は、循環参照が作成されるノードを指定できます。
オブジェクトを保存するかノードを保存するかを指定するには、[トラック割り当て](Assign Track)ボタンか[ノード割り当て](Assign Node)ボタン、または MAXScript メソッドを使用します。[定数を割り当て](Assign Constant)式を使用すると、MAXWrapper は常にオブジェクトとして保存されます。
必要である場合は、オブジェクト値としてノードを維持する変数を作成し、式で通常行うように必要なパラメータを参照できます。たとえば myNode が球のノードを示す場合、式は「myNode.radius」になります。しかしこれでは、球の半径トラックをターゲットとして示すほど良いパフォーマンスになりません。前の例では、ノードの移動など、ノードが変更された場合にコントローラが再評価されます。後の例では、球のベース オブジェクトが変更された場合のみ、コントローラが再評価されます。
ノード変数を指定してからそのベース オブジェクトのパラメータ (半径など) にアクセスすると、外部参照としてノードを取り込んだ場合、エラーが発生します。外部参照オブジェクトは、ラップするオブジェクトのプロパティを公開しないので、「半径」パラメータはありません。このため、式が評価されるときエラーが発生します。球の半径トラックを示す変数を使用すると、外部参照したときに式が正常に動作します。
オブジェクト $Sphere01 があり、$Box01 というオブジェクトを示すスクリプト コントローラを使用しているとします。
式が評価されるたびに、MAXScript はノード名「Box01」をノード値に、位置プロパティを位置コントローラに、x_position プロパティを x_position subAnim に解決し、subAnim からコントローラを取得してコントローラをラップする MAXScript MAXControl 値を取得する必要があります。
コントローラを示すターゲット変数がある場合に必要なのは、コントローラをラップする MAXScript MAXControl 値を取得することだけです。
2 つめの違いは、「Box01」の名前を変更すると、スクリプト コントローラが動作を停止することです。変数を使用する場合、ノード名の従属はありません。
3 つめの違いは、「Box01」と「Sphere01」を選択してクローンを作成した場合、新しくクローン作成されたスクリプト コントローラは、「Box01」のクローンではなく「Box01」を示し続けることです。変数の場合は、クローン作成されたコントローラを示します。
4 つめの違いは、「Box01」と「Sphere01」を含むシーンを外部参照した場合、スクリプト コントローラがエラーになることです。ノードが外部参照シーン ノード ツリーにあり、メインの 3ds Max シーン ノード ツリーではないので、「Box01」を解決できません。変数の場合、スクリプト コントローラはノードの参照を維持するので、ノードの場所は問題になりません。
[選択を保存](Save Selected)を「Sphere01」で実行すると、コントローラに従属するため、「Box01」も保存されます。「Sphere01」をマージした場合も、「Box01」はマージされます。明示的なパス名を使用した場合には、このようにはなりません。
3ds Max 8 からは、スクリプト コントローラの式で「dependsOn」が必要なくなります。
「dependsOn」は、新しいスクリプトで使用できず、古いスクリプトから 削除する必要があります。
スクリプト コントローラの式に「dependsOn」が含まれる場合は、ノードをオブジェクトとして示す新しい変数 (Depends_#) が自動的に作成されます。このため、ノードのすべての変更によってスクリプト コントローラは再評価されます。
dependson_# 変数の自動作成は特別なケースです。この変数は、実行される「dependsOn」コマンドに基づいて作成され、本質的に dependsOn の引数は MAXWrapper オブジェクトになります。
「dependsOn」を使用している既存スクリプト コントローラが、調整せずに正しく動作することを確認する必要もあります。