uGUI で特定のオブジェクトの前後にレイヤーを移す

バリアントプレハブとか使ってるとなぜかレイヤーの順番がうまく変わらないことがあるので、無理やり変えてみた。
同じ階層限定。

public class SetLayerOrder : MonoBehaviour
{
    enum Order
    {
        Front,
        Back,
    }

    [SerializeField]
    private Order order;

    [SerializeField]
    private Transform targetObject;

    private void Start()
    {
        int myIndex = this.transform.GetSiblingIndex();
        int targetIndex = this.targetObject.GetSiblingIndex();

        if (myIndex < targetIndex && this.order == Order.Back) --targetIndex; else if (myIndex > targetIndex && this.order == Order.Front) ++targetIndex;

        this.transform.SetSiblingIndex(targetIndex);
    }
}

Quad や 5.1ch での3Dサウンドでのステレオ AudioClip の挙動

Quad や 5.1ch など3Dサウンドを Unity で作った際に、どうも挙動がおかしかった。
よく考えると3Dサウンド空間で AudioClip のステレオってなにって感じですね。右も左もなく、AudioSource がいるところが音の発信源なので。
ステレオのクリップっだと AudioListener から一定距離が離れると音が出なくなってしまったりした。
Inspector 上で AudioClip をモノラルに変えるチェックを入れれば解決。

Video Track でのコマ落ち

Default Playables にあるVideo Script Playable Trackで再生するときに、とあるビデオクリップだけコマ落ちした。
調べてみると音声が入っているとコマ落ちする。今回は音声は要らなかったので、ビデオから音声を取り除くか以下のように Audio Output Mode を None にしてあげることでコマ落ちしなくなった。

単純に Video Player で再生する分には問題なさそうなんだけど、なんでだろ。

Timeline 上での VideoPlayer の再生

Video をタイムラインで再生したいときには Unity が公式に配布している Default Playables にあるVideo Script Playable Trackを使えば再生できる。
シーンに配置した VideoPlayer と、タイムライン上でクリップを作成して、クリップの設定で動画をしていして終わり。
注意点としては、クリップ毎に VideoPlayer が必要
トラックは1つでもいいけど、VideoPlayer はその分必要になる。
なんででしょ…?クロスフェードの関係?

ProjectSettings > Audio > Global Volume

ProjectSettings の Audio には、オーディオのボリュームを調整できる Global Volume がある。一方ランタイムで操作できるボリュームには static 変数の、AudioListener.volume がある。
この両方はどうやら一緒っぽい。
AudioListener.volume が再生する度に Global Volume の値にリセットされているっぽい。
Unity での音が大きい場合ここを下げておくと便利なので、それを Editor 拡張からどうやればいいか調べてみました。

Continue…

WebGL での AudioMixer のエフェクト

WebGL 書き出しだと音の再生が Web Audio API で使えるものに限定されるので、AudioSource の一部の機能のみ使える。
AudioMixer の Volume は制御できたけどエフェクトなんかは使えない。

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

エディタ拡張を作ってボタン一つで、シーンにあるコンポーネントのパラメータを変更できるようにしてみた。でもやってみると変更はされるものの再生すると前の値に戻ってしまう…
調べたところ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 ボタンがあったので解決。