質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

7351閲覧

Unity)Dropdownのデフォルトを変更

navesanta

総合スコア198

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/06/05 05:09

UnityでDropdown(UI)を使って登録フォームを作成しています。

Dropdownのデフォルトで表示される表示を下記の手順で変更したいです。
手順)
1、表示されているデフォルトはAとします。Dropdownをタップする。
2、いくつか候補が表示される。(仮にA,B,C,D,Eとします)
3、Dを選択する。
これでDがデフォルトで表示されていますがアプリを終了して
開き直すとAに戻っています。

そこで考えた方法がOnValueChangedでの返り値をPlayerprefsで保存して
Start()メソッドで開く際にPlayerprefs.GetIntで呼び出せば良いのかなと思いました。

しかしこの呼び出した値をDropdownのどこにセットすれば良いのか分かりません。

Dropdownにはlabel欄がありインスペクタではここに設定すれば良い様ですが
DropdownはコンパイルするとPrefabの様なものが生成されるためか
単純にGameObject.GetComponentsInChildren<Text>().textへの参照では
表示されません。

イメージ説明

質問はDropdownのデフォルトで表示されるテキストに値を入れたいのですが
どうやって参照すればいいのでしょうか?

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class DropdownCallback : MonoBehaviour { private string region; #pragma warning disable 649 [SerializeField]GameObject dropdownObject; private Text[] texts; private string regionDefaultText; // Start is called before the first frame update void Start() { texts = dropdownObject.GetComponentsInChildren<Text>(); texts[1].text = PlayerPrefs.GetString("region", "地域を選ぶ");      //★うまく参照されず表示されない } // Update is called once per frame void Update() { } public void OnValueChanged(Dropdown dropdown) { Debug.Log("dropdown:" + dropdown.value); switch(dropdown.value) { case 0: region = "hamamatsu"; regionDefaultText = "浜松市、湖西市"; break; case 1: region = "iwata"; regionDefaultText = "磐田市、袋井市、森町"; break; case 2: region = "kakegawa"; regionDefaultText = "掛川市、菊川市、御前崎市"; break; default: region = "etc"; regionDefaultText = "地域を選ぶ"; break; } PlayerPrefs.SetString("region", regionDefaultText); PlayerPrefs.Save(); //PlayerPrefsで保存する } }

環境)
PC: mac
Unity2018.2
言語:C#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

発想はいいと思うのですが、Dropdownの中にあるTextを直接操作するのではなく、Dropdown.valueを書き換えるほうが好ましいように思います。
OnValueChangedの中でdropdown.valueを取得して分岐していますが、Start内では逆にdropdown.valueに項目番号を代入してやれば選択項目を切り替えることができるでしょう。

C#

1 // Start is called before the first frame update 2 void Start() 3 { 4 var dropdown = this.dropdownObject.GetComponent<Dropdown>(); 5 var regionStringFromPrefs = PlayerPrefs.GetString("region", "地域を選ぶ"); 6 7 // スクリプト冒頭にusing System.Linq;を追加しておく必要があります 8 dropdown.value = dropdown.options // ドロップダウンの選択項目一覧の各項目を... 9 .Select((o, i) => (o, i)) // 項目番号と対にして... 10 .Where(t => t.o.text == regionStringFromPrefs) // 項目の文字列がPlayerPrefsから取ってきた文字列と一致するものだけを抜き出し... 11 .Select(t => t.i) // 項目番号だけを取り出して... 12 .DefaultIfEmpty(dropdown.options.Count - 1) // もし選択項目一覧に該当するものがなければ、一覧末尾の番号を選び... 13 .First(); // ここまでの過程で抜き出された項目番号の一番最初を選び、dropdown.valueにセットする 14 }

PlayerPrefsに項目番号ではなく文字列を保存しているようでしたので、それに合わせて文字列から項目番号を探す方式にしてみました。

もし項目番号と項目名に矛盾が発生する可能性がないなら、PlayerPrefsに保存するのは文字列ではなくdropdown.valueそのものでもいいでしょう。その場合はStart内の項目選択部分をシンプルにdropdown.value = PlayerPrefs.GetInt("region", dropdown.options.Count - 1);とすることができるはずです。
その場合、たとえば後で「浜松市、湖西市」と「磐田市、袋井市、森町」の間に項目を追加したとすると、「磐田市、袋井市、森町」以降の項目番号が1つずつずれてしまい、PlayerPrefsに保存された項目番号とDropdownの項目名が矛盾するでしょうからご注意ください。

投稿2019/06/05 20:23

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

navesanta

2019/06/05 23:23

ありがとうございます。 そうですね。Dropdown.valueを書き換える発想がなかったです。 言われたことを把握して理解でき、またやりたいことが実現できました。 これからもよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問