エクスプレッションを操作するとき、予期せぬアトリビュート値が表示される可能性があります。ここでは、このような混乱が生じる一般的な原因について説明します。
シーンを巻き戻すと、アトリビュートの最新の設定値を使用してエクスプレッションが実行されます。このアトリビュート値によって予期せぬ結果が生じる場合があります。
Ball.tx = $distance;
$distance = time;
この例では、アニメーションの開始フレームがフレーム 0 に設定されていることを前提にしています。
1 番目の文は、Ball.tx に $distance 変数の値を代入します。2 番目の文は、$distance 変数に time 変数の値を代入します。
アニメーションを再生すると、time 変数の増加に伴い、Ball オブジェクトが X 軸に沿って移動します。たとえば、アニメーション時間(time)が 4 秒の場合は、Ball の X 軸上の位置(Ball.tx)が 4 グリッドになります。
アニメーションを巻き戻すと、予期に反して Ball の X 軸上の位置(Ball.tx)は 0 に戻りません。time が 4 の時にエクスプレッションを実行したときに、$distance 変数は 4 に設定されました。したがって、巻き戻しを行うと Ball.tx は 4 に設定されるため、$distance には巻き戻し時の time の値、つまり 0 が設定されます。
アニメーションをもう一度巻き戻すと、Ball の X 軸上の位置(Ball.tx)は期待どおり 0 に戻ります。この場合は、巻き戻し時に実行されたエクスプレッションによって $distance 変数の値が 0 に設定されているため、Ball.tx に正しく 0 が代入されます。
この問題を解決するには、文の順序を逆にしてエクスプレッションをコンパイルします。
$distance = time;
Ball.tx = $distance;
アニメーションを再生して巻き戻すと、1 番目の文が実行され、$distance 変数に time 変数の値が代入されます。2 番目の文は、$distance 変数の値(1 番目の文によって time の値が代入されている)を Ball.tx に代入します。巻き戻し後の $distance 変数には 0 が代入されているため、Ball は X 軸上の正しい位置に戻ります。
アニメーションの再生中にアトリビュートまたは変数の値を大きくすると、それらの値の動作によって混乱が生じる可能性があります。
Ball.ty = 0;
Ball.ty = Ball.ty + 1;
Ball の Y 軸上の位置(Ball.ty)は、常に 1 に留まります。アニメーションを再生しても、Ball の Y 軸上の位置(Ball.ty)はフレームごとに 1 ずつ増加しません。
Ball.ty = Ball.ty + 1;
アニメーションを再生すると、Ball の Y 軸上の位置(Ball.ty)が各フレームごとに 1 ずつ増加します。アニメーションを巻き戻した場合も、Y 軸上の位置(Ball.ty)は 1 だけ増加します。
アニメーションをもう一度再生すると、Y 軸上の位置(Ball.ty)がフレームごとに 1 ずつ増加します。アニメーションを巻き戻すか、またはカレント タイム インジケータをドラッグしても、この Ball.ty は Y 軸に沿って増え続け、決して元の開始位置には戻りません。
アニメーションを巻き戻すたびに Ball を開始位置に戻すためには、translateY アトリビュートを開始位置の値に初期化する必要があります。たとえば、次のようなエクスプレッションを使用します。
Ball.ty = Ball.ty + 1;
if (frame == 1)
Ball.translateY = 0;
この場合、フレーム 1 に巻き戻すと、Ball が Y 位置 0 に戻ります。しかし、カレント タイム インジケータをドラッグしても、Ball は Y 位置 0 には戻りません。
if 文によって translateY アトリビュートの値が 0 にリセットされるのは、フレーム 1 が再生される場合に限られます。フレーム 1 は、アニメーションの巻き戻し時に再生されるデフォルトのフレームです。アニメーションを別のフレームから開始するように設定した場合は、if 文で別のフレーム番号を指定する必要があります。