エディタ拡張からのパラメータ変更

エディタ拡張を作ってボタン一つで、シーンにあるコンポーネントのパラメータを変更できるようにしてみた。でもやってみると変更はされるものの再生すると前の値に戻ってしまう…
調べたところEditorUtility.SetDirty()として、そのオブジェクトに変更があったという印をつけてあげる必要があった。

うら干物書き | EditorUtility.SetDirtyのなく頃に

Vector2.positiveInfinityの比較

よく、Vector2 や Vector3 にまだ値が入れていない時に、negativeInfinity を入れていた。しかし比較してみると

Vector2.negativeInfinity == Vector2.negativeInfinity // false
float.NegativeInfinity == float.NegativeInfinity // true

こんな感じになった。float なら true だけど、Vector2/3 だと false になる。調べてみると比較する段階で計算が発生し、NaN < 9.999999E-11 // false という計算になるよう。

参考) stackoverflow | Why does this evaluate to False?

Animtorを持つ子オブジェクトに対するアニメーション付

Animation ウィンドウにて録画ボタンを押して子オブジェクトに対してアニメーション付しているときに、子オブジェクトにも Animator が付いていると Animation ウィンドウがそっちのアニメーションに切り替わってしまうのでそうしよかと思ったけど、Lock ボタンがあったので解決。

Timeline でパーティクルを再生


いままで Activation Track でパーティクルの表示を切り替えてたんですが、これだと Timeline で確認ができない。でもじつは Control Track を使うと確認ができるということを知った。Control Track の設定で、Random Seed というのもあるので、これを変えればランダムなが固定される。


こうなる。

複数の Timeline での ActiveTrack

ちょっとわかりづらいアニ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 を再度流す際にバインドを外すっていうのもなんだかメンドウだし…

Timeline ウィンドウのロック/アンロック

Timeline がたくさんあるお仕事をしているので、ロック/アンロックの切り替えが面倒なので簡単な EditorScript 作りました。***/Editor などのフォルダに入れて、Cmd/Ctl + Lでトグルできます。

参考)
コガネブログ | ショートカットキーで Inspector をロックしたりデバッグモードに切り替えたりできるエディタ拡張「LockInspector.cs」紹介
コガネブログ | Alt + Q で Inspector のロック状態を切り替えるエディタ拡張

Activation Track での挙動がおかしいとき

Timeline を WrapMode:Hold など使って、その Timeline に Activation Track があった場合、Timeline 終了後に別の Timeline を流して、そこに同じオブジェクトの Activation Track があった場合に挙動がおかしくなることがあった。
トラックを選択して出てくるインスペクタ

今回の場合こちらを、Inactive にしてあげたら直った。

Timelineのバインドを解除

タイムラインで WrapMode を Hold にした際に、その後 Animator でアニメーションが制御できなくなってしまう。例えばオープニングアニメーションのあとにスタートボタンだけボタンを押されたときに Animator でボタンのアニメを再生させたいとかそんな場合、ボタンを包む GameObject でコンテナを作って、Timeline ではそっちを制御するなんかの工夫が必要になってくる。

Timeline を流した後、別の Timeline を流す分には問題なくアニメーションが流れるけど、Animator での制御が効かない。

Continue…