ユーザがタイム スライダをドラッグしたり、アニメーションを再生した場合など、現在の 3ds Max アニメーション時間が変更された場合にはいつでも 1 つまたは複数の関数を呼び出すように登録することができます。以下の関数によって、このコールバックを登録または登録解除します。
registerTimeCallback <fn>
unRegisterTimeCallback <fn>
関数は必要に応じていくつでも登録できます。各関数は時間が変更されるたびに個別に呼び出されます。登録する関数に引数を指定することはできません。これらの関数は、MAXScript システム変数 currentTime を使用して、更新された現在の時間にアクセスできます。
例: |
fn time_p = print currentTime registerTimeCallback time_p |
上記の例では、登録された関数は、ユーザがタイム スライダを移動させたりアニメーションを再生すると、現在の時間をリスナー ウィンドウに出力します。 |
特に注意すべき点
コールバック関数の実行中にランタイム エラーが発生した場合は、エラー メッセージが表示され、コールバック関数は永久にオフになります。
時間コールバックは、レンダリング中に呼び出されることはありません。これは複数のフレームのレンダリング中でも同様です。
登録した関数は、関数を作成したコードのコンテキストではなく、特別なコンテキストで実行されます。つまり、関数には、その関数の定義の前後にある外部コード ネスト内のローカル変数への参照を含めることはできません。これらの変数は、関数が呼び出されるときには存在しない実行スタックにあるためです。これに関する重要な例外は、ユーティリティとロールアウトのパネル ローカル(ローカル関数、ロールアウト変数、ネストされたロールアウトなど)です。これらは直接ロールアウトやユーティリティ オブジェクトと関連付けられているため、ロールアウト コード内の変更ハンドラで参照できます。
登録されるものは関数値で、関数名またはグローバル変数ではありません。つまり、同じ名前の関数を登録した後でその関数を再定義しても、コールバックは変更されません。関数を登録解除してから再定義し、それをもう一度登録するか、または、登録した関数を、別の関数を呼び出す中間の関数にする必要があります。
例: |
fn time_cb = print currentTime fn tcb = time_cb() registerTimeCallback tcb |
この場合、登録されたコールバック関数 tcb は実際のコールバック time_cb を(定義されているグローバル変数を参照して)呼び出します。したがって、必要に応じて何回でも time_cb() を再定義することができ、コールバックによって常に最新の定義が呼び出されます。これは、コールバックの開発とデバッグを行っている場合に便利です。 |
コールバック関数は、新規のファイルをロードしたり、3ds Max リセットを実行しても、登録されたままです。