2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

UnityのInspectorで配列長を追加するとなんか適当に詰め込まれるのをどうにかする

Posted at

そこそこ腹が立ったので書きました。
Unityのバージョンは2019.4.13です。

Inspectorにて

// なんの変哲もないGameObjectの配列
[SerializeField]
private GameObject[] _gameObjects = default;

こんな感じで宣言した配列に対してInspectorから長さを追加すると、最後のフィールドをそのまま複製して詰め込む暴挙に出ます。

output-palette.gif

対処

しょうがないのでInspectorの変更によってキックされるOnValidateで面倒を見てやります。1

OnValidate
private void OnValidate()
{
    // Inspectorに入力された長さを覚えておく
    var beforeLength = _gameObjects.Length;

    // nullと重複を除く
    _gameObjects = _gameObjects
        .Where(o => o != null)
        .Distinct()
        .ToArray();

    // (入力された長さ) - (現在の長さ)
    // で足りない長さを調べる
    var length = beforeLength - _gameObjects.Length;
    if (length > 0)
    {
        // 不足がある場合は,足りない長さの空の配列を作ってConcatで追加
        _gameObjects = _gameObjects
            .Concat(Enumerable.Repeat<GameObject>(null, length))
            .ToArray();
    }
}

output-palette2.gif

まとめ

いいからdefault2ブチこめ:rage:

おしまい。

  1. 毎回ToArray()で確定しているのはIEnumerableな変数をわざわざ用意するのがめんどいのと、以前遅延評価絡みでなんかよくわかんない目にあったからです

  2. nullだとPrimitiveに対応できないので。しかし、この挙動って破壊と混乱を招くだけの気がするのですが、嬉しい人いるんでしょうか……?

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?