予期せぬアトリビュート値
 
 
 

エクスプレッションを操作するとき、予期せぬアトリビュート値が表示される可能性があります。ここでは、このような混乱が生じる一般的な原因について説明します。

重要:エクスプレッションを編集し作成(Create)ボタンをクリックしたあとは、スクリプト エディタのエラー メッセージを必ず確認してください。これまで正常だったエクスプレッションを変更し、構文エラーが発生した場合、アニメーションを再生すると、以前の正常なエクスプレッションが実行されます。このため、編集による変更が有効になったと誤解してしまう可能性があります。

巻き戻し後のアトリビュート値

シーンを巻き戻すと、アトリビュートの最新の設定値を使用してエクスプレッションが実行されます。このアトリビュート値によって予期せぬ結果が生じる場合があります。

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 文で別のフレーム番号を指定する必要があります。