Video Track でのコマ落ち
Default Playables にあるVideo Script Playable Trackで再生するときに、とあるビデオクリップだけコマ落ちした。
調べてみると音声が入っているとコマ落ちする。今回は音声は要らなかったので、ビデオから音声を取り除くか以下のように Audio Output Mode を None にしてあげることでコマ落ちしなくなった。
単純に Video Player で再生する分には問題なさそうなんだけど、なんでだろ。
Default Playables にあるVideo Script Playable Trackで再生するときに、とあるビデオクリップだけコマ落ちした。
調べてみると音声が入っているとコマ落ちする。今回は音声は要らなかったので、ビデオから音声を取り除くか以下のように Audio Output Mode を None にしてあげることでコマ落ちしなくなった。
単純に Video Player で再生する分には問題なさそうなんだけど、なんでだろ。
Video をタイムラインで再生したいときには Unity が公式に配布している Default Playables にあるVideo Script Playable Trackを使えば再生できる。
シーンに配置した VideoPlayer と、タイムライン上でクリップを作成して、クリップの設定で動画をしていして終わり。
注意点としては、クリップ毎に VideoPlayer が必要。
トラックは1つでもいいけど、VideoPlayer はその分必要になる。
なんででしょ…?クロスフェードの関係?
ProjectSettings の Audio には、オーディオのボリュームを調整できる Global Volume がある。一方ランタイムで操作できるボリュームには static 変数の、AudioListener.volume がある。
この両方はどうやら一緒っぽい。
AudioListener.volume が再生する度に Global Volume の値にリセットされているっぽい。
Unity での音が大きい場合ここを下げておくと便利なので、それを Editor 拡張からどうやればいいか調べてみました。
WebGL 書き出しだと音の再生が Web Audio API で使えるものに限定されるので、AudioSource の一部の機能のみ使える。
AudioMixer の Volume は制御できたけどエフェクトなんかは使えない。
エディタ拡張を作ってボタン一つで、シーンにあるコンポーネントのパラメータを変更できるようにしてみた。でもやってみると変更はされるものの再生すると前の値に戻ってしまう…
調べたところEditorUtility.SetDirty()として、そのオブジェクトに変更があったという印をつけてあげる必要があった。
よく、Vector2 や Vector3 にまだ値が入れていない時に、negativeInfinity を入れていた。しかし比較してみると
Vector2.negativeInfinity == Vector2.negativeInfinity // false float.NegativeInfinity == float.NegativeInfinity // true
こんな感じになった。float なら true だけど、Vector2/3 だと false になる。調べてみると比較する段階で計算が発生し、NaN < 9.999999E-11 // false という計算になるよう。
Animation ウィンドウにて録画ボタンを押して子オブジェクトに対してアニメーション付しているときに、子オブジェクトにも Animator が付いていると Animation ウィンドウがそっちのアニメーションに切り替わってしまうのでそうしよかと思ったけど、Lock ボタンがあったので解決。
いままで Activation Track でパーティクルの表示を切り替えてたんですが、これだと Timeline で確認ができない。でもじつは Control Track を使うと確認ができるということを知った。Control Track の設定で、Random Seed というのもあるので、これを変えればランダムなが固定される。
こうなる。
カスタム Marker のところで Timeline を止めて、再度再生するときに再びその Signal が呼ばれてしまったので、MarkerではなくSignalEmitterを継承したマーカーを作ると、Emit Once という設定項目が出てきて1度だけ発行してくれるようになった。
ちょっとわかりづらいアニgifですが…
タイムラインの WrapMode は両方とも Holde で、中身はパーティクルが最初に Active になり終わりの方で Inactive になる。Cube は Active になったり Inactive になったりする。そして片方が終わったらもう片方を流し、終わったらまた最初の Timeline を流す。Cube の方は問題なくアニメーションしているように見えるけど、パーティクルは2つめの Timeline からおかしくなる。
ログを出してみると OnEnable と OnDisable が毎フレーム連続して呼ばれている状態になってしまう。Cube の方はとくに Active/Inactive が交互になってもレンダリング段階で Active になっているので点滅とかはしない。でもパーティクルの方は、Active になるとエミットされるようになっているので、毎フレームエミットしようとしては消えてを繰り返しておかしくなる…
以前の記事みたいにバインドを外せば直るはず。もしくは、WrapMode を None にしてあげても問題ない。けど、Hold にしたいケースは多々あるし、Cube のように問題なさそうに見えても Active/Inactive が切り替わってしまうのもどうなのかという感じ… Timeline を再度流す際にバインドを外すっていうのもなんだかメンドウだし…