ニートの活動報告書

ニートがゲーム作るよ

【Unity】Dropdownを拡張する【uGUI 継承】

経緯

キャラクター作成時の職業選択など、
ドロップダウンリストを使用する場面は多々あるのですが
f:id:mantarion:20181102073452p:plain:w300


選択項目として表示させるオプションリストを
インスペクタ上で設定していると割と面倒臭い事が多かった。
f:id:mantarion:20181102073859p:plain:w300


というのも、Optionsに設定するデータは
コード上でも管理している場合が多く、

public class Job {
    public enum Type {
        WARRIOR, //戦士
        ARCHER, //弓使い
        WITCH, //魔法使い
        THIEF //盗賊
    }

    public static Dictionary<Type, string> jobNames = new Dictionary<Type, string>()  {
        {Type.WARRIOR, "戦士"},
        {Type.ARCHER, "弓使い"},
        {Type.WITCH, "魔法使い"},
        {Type.THIEF, "盗賊"}
    };
}

職業を新しく追加した場合など、コードに修正を加えた際に
ドロップダウンオブジェクトのインスペクタ(場合によっては複数箇所)まで見に行かなければ
いけなかった。

修正箇所が多いとミスも増えるのでできるだけ減らしたい。

解決策

DropDownを継承したクラスを用意し、スクリプトからOptionsを設定するよう変更。

public class JobDropDown : Dropdown
{
    protected override void Awake()
    {
        base.Awake();
        options.Clear();
        foreach (string text in Job.jobNames.Values)
        {
            options.Add(new OptionData(text));
        }
    }
}

元々ドロップダウンオブジェクトにアタッチしていたDropdownコンポーネントを引き剥がし
新しく用意した拡張版Dropdownを貼り付ける。
f:id:mantarion:20181102080536p:plain:w300

これでコード上で要素の追加、名前変更等を行った際にドロップダウンリストも自動で反映されるようになった。