ユーザがタイム スライダをドラッグしたり、アニメーションを再生した場合など、現在の 3ds Max アニメーション時間が変更された場合にはいつでも 1 つまたは複数の関数を呼び出すように登録することができます。以下の関数によって、このコールバックを登録または登録解除します。
registerTimeCallback <fn>
unRegisterTimeCallback <fn> | undefined )
関数は必要に応じていくつでも登録できます。各関数は時間が変更されるたびに個別に呼び出されます。登録する関数に引数を指定することはできません。これらの関数は、MAXScript システム変数 currentTime
を使用して、更新された現在の時間にアクセスできます。
例:
fn time_p = print currentTime registerTimeCallback time_p
上記の例では、登録された関数は、ユーザがタイム スライダを移動させたりアニメーションを再生すると、現在の時間をリスナー ウィンドウに出力します。
時間変更コールバックをグローバルに有効または無効にすることもできます。
<boolean> timeCallbacksEnabled()
時間変更コールバックが有効かどうかを返します。3ds Max 2021.1 Update 以降で使用可能です。
<boolean> enableTimeCallbacks()
<boolean> disableTimeCallbacks()
時間変更コールバックを有効または無効にします。これらの関数は、現在の時間変更コールバックの有効状態を返します。したがって、たとえばコールバックが既に無効になっているときに disableTimeCallbacks()
を呼び出すと、false が返されます。
3ds Max 2021.1 Update 以降で使用可能です。
showregisteredTimeCallbacks [to:stream] [asArray:<boolean>]
関数名、関数が定義されているソース ファイル(該当する場合)、およびソース ファイル内の行番号が一覧表示される、登録済み時間変更コールバックのリストを返します。オプションの to 引数を指定すると、出力は指定した出力ストリームに送信されます。オプションの asArray 引数を指定すると、戻り値は配列の配列としてフォーマットされます。ここで、登録済みの各コールバック関数の最初の要素はコールバック関数名、2 番目の要素はコールバック関数が定義されるソースファイルの名前と行番号(関数がファイル内で定義されていない場合は空の文字列)、3 番目の要素はコールバックの登録解除に使用できる実際の関数の値です。
特に注意すべき点
コールバック関数の実行中にランタイム エラーが発生した場合は、エラー メッセージが表示され、コールバック関数は永久にオフになります。
時間コールバックは、レンダリング中に呼び出されることはありません。これは複数のフレームのレンダリング中でも同様です。
登録した関数は、関数を作成したコードのコンテキストではなく、特別なコンテキストで実行されます。つまり、関数には、その関数の定義の前後にある外部コード ネスト内のローカル変数への参照を含めることはできません。これらの変数は、関数が呼び出されるときには存在しない実行スタックにあるためです。これに関する重要な例外は、ユーティリティとロールアウトのパネル ローカル(ローカル関数、ロールアウト変数、ネストされたロールアウトなど)です。これらは直接ロールアウトやユーティリティ オブジェクトと関連付けられているため、ロールアウト コード内の変更ハンドラで参照できます。
登録されるものは関数値で、関数名またはグローバル変数ではありません。つまり、同じ名前の関数を登録した後でその関数を再定義しても、コールバックは変更されません。関数を登録解除してから再定義し、それをもう一度登録するか、または、登録した関数を、別の関数を呼び出す中間の関数にする必要があります。
例:
fn time_cb = print currentTime fn tcb = time_cb() registerTimeCallback tcb
この場合、登録されたコールバック関数
tcb
tcb は実際のコールバックtime_cb
を(定義されているグローバル変数を参照して)呼び出します。したがって、必要に応じて何回でもtime_cb()
を再定義することができ、コールバックによって常に最新の定義が呼び出されます。これは、コールバックの開発とデバッグを行っている場合に便利です。