MAXScript がスクリプト内でランタイム エラーを検出すると、リスナー出力領域にエラー メッセージが表示され、説明が出力されます。
エラーがコントローラ スクリプトまたはロールアウト パネル スクリプトで発生した場合、エラー メッセージは警告ボックスに表示されます。それ以外の場合、エラー メッセージは[リスナー] (Listener)ウィンドウに出力されます。
3ds Max は、エラーに対処し変数を監視するより高度なツールセットを提供する MAXScript デバッガ機能も備えています。
説明はコールスタック トレースバック 形式で表示され、コード内にあるエラーの原因と場所を特定するのに便利です。
コール スタック トレースバックでは、次の情報が示されます。
for
ループは、コールスタック トレースバックとは別のエントリを生成し、ループ本体の中にループ変数および任意のローカル変数の変数ダンプを含みます。このため、for ループ本体は変数スコープを表します。
エラーを見つけやすくするため、実行コード (リスナーで直接入力されなかったコード) がソース ファイルからコンパイルされている場合は、ソース ウィンドウにエラー行がハイライトされます。その時点でソース ファイルがウィンドウ内に開かれていない場合、ソース ファイルは新しいエディタ ウィンドウに表示されます。エラーが発生したコードを含む行がハイライトされ、その場所がウィンドウに表示されます。
エラー メッセージは、警告ボックスか[リスナー] (Listener)ウィンドウに表示されます。どちらの場合でも、警告ボックスまたは[リスナー] (Listener)ウィンドウが前面に表示され、その下にエラーの原因となるコードを含むエディタ ウィンドウが表示されます。
リスナー出力領域にレポートされるコンパイルおよびランタイムのエラー メッセージの前には、コメント記号「--」が付きます。埋め込みエラー メッセージの可能性があるコードを[リスナー] (Listener)ウィンドウで再選択および評価し、そのコードが構文エラーの原因にならないようにします。
次の図に、[エディタ] (Editor)ウィンドウと[リスナー] (Listener)ウィンドウを示します。この図は、スクリプト実行中にエラーが検出されたことを示しています。
エラーが発生した場所は、エディタ ウィンドウ内のハイライトされている行です。
エラーが発生した場所は、エディタ ウィンドウ内のハイライトされている行です。コールスタック トレースバックを調べると、for
ループの変数 i
が 100 のときにエラーが発生したことがわかります。
エラーのある行で、配列 b
のインデックス i のオブジェクトの位置が設定されています。
さらに詳しく調査すると、配列 b
には要素が 99 個しか定義されていないことが確認できます。
したがって、要素 b\[i\]
には値 undefined
が含まれ、undefined
に位置プロパティが関連付けられていないためにエラーが発生しています。
このエラーに関する詳細情報:
このエラーを回避する適切な方法としては、'for i = 1 to b.count do' を使用して、ループが b に設定されたオブジェクト数を超えないようにして、さらに z=360.0*i/b.count
行において b.count で除算するようにします。
上述の「誤り」は、デモンストレーションの目的でエラーを発生させるために記述されたものです。
このスクリプト自体は、選択されたすべてのオブジェクトの、(ポイント pos0 を囲む)半径付き円の中への配置を試行するものです。
次の図に、エラーダイアログ ボックスと[スクリプト コントローラ](Script Controller)ダイアログ ボックスを示します。
スクリプト コントローラに割り当てられたスクリプト実行中にエラーが検出されたことを示しています。
このエラーは、オブジェクト box001 の位置がスクリプト内で使用されているのに削除されたことが原因です。
MAXScript リスナーでは、このエラーに対して次のコール スタック トレースバックが示されます。
このエラーに関する詳細情報:
3ds Max 8 以降、オブジェクト プロパティへの上記のアクセス方法は旧式で不適切と考えられています。これは、(スクリプト コントローラを伴うオブジェクトが外部参照を介してシーンに取り込まれるなど)その他の理由で参照オブジェクトが削除されない、または検出できないときに多数のエラーを発生させてしまうためです。
この種のエラーを回避する適切な方法としては、Box001 の位置トラックが割り当てられた変数を使用します。Box001 を削除してもコントローラにエラーは発生しません。追加ボーナスとして、Box001 が Z に沿って自動的に移動する際に、コントロールされたオブジェクトの位置が更新されます。
詳細については、スクリプト コントローラを参照してください。