見出し画像

私的Unity覚え書き

タイトル通りです。どちらかというとスクリプト系のつまずきが多かったのでここに残しておきます。一部間違っている情報があるかもしれないのでご注意ください



transform.position と transform.localPositionについて

positionはヒエラルキーの階層が深いほど値変更時に処理時間がかかる。UIの座標移動やTweenでの挙動が変になったら、ローカル座標に変えると大体は上手くいく


デリゲートにつけるevent

public event Action OnHoged;

というようにデリゲートに"event"をつけると、それが定義されているクラス内でのみ代入と実行ができる、という制限がつけられる
(他所からは+=で追加、-=で削除するだけしか出来なくなる)


大量のオブジェクトの移動を軽くしたい

コライダーのついたオブジェクトはtransform.position等で動かすたびにコライダーの再生成を繰り返すので、シューティングゲームの弾など大量に動かすと重くなる
オブジェクトにRigidBodyをアタッチし、RigidBody.position等を使って移動させるとそれがなくなって軽くなる
(要検証: 独自で発見・検証したのでより良い手法があると思います)


ビルド後にScriptableObject内の変数をいじっても反映されなかった

ビルド後はクラス内変数の直接的な書き換えができないらしい?
簡単にシーン間の変数を共有したいなら、やっぱりシングルトンかstaticが今でも使われそう


(int)(0.7f * 10f) = 6
(int)(0.9f * 10f) = 8 とかなった

今回のように整数での結果を期待するならMathf.RoundToIntを使おう
Mathf.Approximately(float, float)で"ほぼ等しい"の比較もできる


TMPにもともと入ってる”LiberationSans SDF”みたいなやつ、消すとバグる(なんで)


UIをプレハブから生成するときにtransform.parent = this.transform をすると警告が出る

transform.SetParent(this.transform) でやろう


二次元配列内の要素が全て一致しているかの比較

using System;

public static class ArrayExtensions
{
    /// <summary>
    /// 配列内のすべての要素が一致しているかを調べます
    /// </summary>
    public static bool EqualsAllElements<T>(this T[,] self, T[,] table)
        where T : IEquatable<T>
    {
        bool isEqual = true;
        for (int i = 0; i < self.GetLength(0); i++)
        {
            for (int k = 0; k < self.GetLength(1); k++)
            {
                if (self[i, k].Equals(table[i, k])) continue;
                isEqual = false;
                goto BREAK;
            }
        }
        BREAK:
        return isEqual;
    }
}


重い処理をEditorGUILayout.HorizontalScope内に書くと⚠️BeginLayoutGroup must be called first.という警告が出る

まず重い処理を関数に分離する
そしてUniTaskとかで、その関数内の初めに1フレーム待機すると警告が出なくなるはず


EditorUtility.SetDirtyとAssetDatabase.SetDirtyがあるので注意

エディタ上でScriptableObjectを保存するときはEditorUtilityを使おう
詳しい違いが分からんから両方やってもいいかも


ReorderableListについて、multiSelect = trueのとき

ReorderableList.indexは選択されている要素のうち、一番インデックスが小さいものを返す
ReorderableList.selectedIndicesの順番は小さい順にソートされたものが返ってくる。選択された順番ではないので注意


(UniTask) CancellationTokenがついたawait句、入るたびにGCするし重いんだけど

UniTaskの機能にあるUniTask TrackerEnable Trackingをオンにしているとそうなる


DOTweenをキャンセルしたい

上部のEdit
→ Project Settings
→ Player
→ Other Settings
→ Scripting Define Symbolsに
"UNITASK_DOTWEEN_SUPPORT"を追加すると、UniTaskとDOTWeenを連携できる

(トゥイーン).ToUniTask(TweenCancelBehaviour.KillAndCancelAwait, cancellationToken);
とすればキャンセルできるはず




この記事が気に入ったらサポートをしてみませんか?