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

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

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

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

Q&A

解決済

1回答

3994閲覧

unityのdropdownで一部の項目を選択不可能にしたい

100_j

総合スコア0

C#

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

0グッド

0クリップ

投稿2021/04/29 07:28

前提・実現したいこと

Unityです。
作成中のゲームで
Dropdownの項目から一部の項目だけを選択不可な状況にしたいです。

プレイヤーが「A」というアイテムを持っている場合には、
ドロップダウンから「A」が選択できるけど、
持っていない場合には、タップしても選択できないようにしたいです。

完成のイメージは、
https://jp.infragistics.com/help/aspnet/webdropdown-disabling-drop-down-items

https://www.javaer101.com/en/article/45344426.html
です。

何を選択しているか「Value」で使用しているので、
「項目を削除」は、したくない状況です。(順番がかわってしまう)
※削除してもValueが変わらないやり方があれば、それでも

発生している問題・エラーメッセージ

以下のソース段階では、エラーは発生してません。

ifの中に「特定の項目を選択して選択不可に」と、したく、
調べたところ「enabled」とか「Disabled」とかが検索してヒットするのですが、
コードの書き方が判らなくて、、

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ConfigDateManager : MonoBehaviour

public Dropdown dropdown_item; public void Start() {

  Dropdown.OptionData data1 = new Dropdown.OptionData();
data1.text = "基本";
dropdown_item.options.Add(data1);

Dropdown.OptionData data2 = new Dropdown.OptionData(); data2.text = "アイテムA"; dropdown_item.options.Add(data2); Dropdown.OptionData data3 = new Dropdown.OptionData(); data3.text = "アイテムB"; dropdown_item.options.Add(data3); if (PlayerPrefs.GetInt("ItemA_had", 0) == 1) { //アイテムAが選択できないようにする } if (PlayerPrefs.GetInt("ItemB_had",0) == 1) { //アイテムBが選択できないようにする } dropdown_item.RefreshShownValue(); }

}

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/29 08:54

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Test1 : Dropdown { protected override GameObject CreateDropdownList(GameObject template) { var obj = base.CreateDropdownList(template); if (この条件に合致しているなら) { obj.GetComponentInChildren<Toggle>().interactable = false; // 選択させない } return obj; } } ドロップダウンリストが作られる部分をオーバーライドして、条件に合致する場合は選択不可にしてしまうとか? こういう方法が良いのか悪いのかは私には分かりません、 コードを追ってみて何となくこれで出来そう?って思っただけなので、もっと普通にできる方法がありそうな気がします
100_j

2021/04/29 09:01

ありがとうございます!挑戦してみます!
退会済みユーザー

退会済みユーザー

2021/04/29 11:45 編集

EventSystemからの選択で内部でShow()が呼ばれ、ドロップダウンリストがここで生成されます。 生成されたドロップダウンリストから子要素のDropdownItem(サイトでは直接toggle?って思いましたがDropdownItemはinternalでした)を全て取得して、ここで item.toggle.interactable = false; // unityのselectableを継承した物を利用する using UnityEngine.EventSystems; using UnityEngine.UI; public class Test1 : Dropdown { public override void OnPointerClick(PointerEventData eventData) { base.OnPointerClick(eventData); var item = GetComponentsInChildren<DropdownItem>(); foreach(var i in item) { i.toggle.interactable = false; } } public override void OnSubmit(BaseEventData eventData) { base.OnSubmit(eventData); var item = GetComponentsInChildren<DropdownItem>(); foreach (var i in item) { i.toggle.interactable = false; } } } 下のサイトを見た感じ良く分からなかったですが、やってる事はこういう事な気がしました、、、 色々試してみた結果、別にDropdown本体を改造したい訳でもないですし、DropdownItemが必要な訳でもなく、素直に下のアプローチでいいのでは?ってなりました。 using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class Test3 : MonoBehaviour, IPointerClickHandler { public void OnPointerClick(PointerEventData eventData) { var toggles = GetComponentsInChildren<Toggle>(); // toggles[index] indexの値とvalueの値は同じ(か-1すれば同じ)モノを示すはず toggles[1].interactable = false; } } Dropdownより下にアタッチしないと実行順の関係でtogglesがnullる模様。
100_j

2021/04/29 12:23 編集

スミマセン、「継承」を基礎からまったく理解していないポンコツです。 とりあえず 1.上記のスクリプト「Test1」を作成(04/29 19:59 の方) 2.ドロップダウン>インスペクターから「dropdown」コンポーネントをリムーブ 3.同ドロップダウンに「Test1」を取り付ける 4.インスペクターの「Test1」コンポーネントを「手順2」の「deopdwn」と同じ設定にする 5.ゲーム「再生」 すると、「選択不可の状態にしたい」は叶いました!ありがとうございます。 しかし、そのままだとドロップダウン内の全ての項目が「選択不可」です。 上記コードをどういじれば、「特定の項目だけ」を「特定の条件で」選択不可とできますでしょうか。 具体的にはドロップダウン内の2番目と3番目の項目を対象として、1番目は常に選択可能としたいです。 -------------------------------------------- すみません、20:45更新を見れていませんでした。 今からそちらにチャレンジしたいと思います。
退会済みユーザー

退会済みユーザー

2021/04/29 12:25

Test3を追記しておりますので、そちらを試してみてください。 多分、これが一番分かりやすいと思います。
100_j

2021/04/29 12:47 編集

できました!!!!! ありがとうございました!!!!! 当方、はじめての質問で、つたない部分もあったかと思いますが、 丁寧にありがとうございました。 着地は以下のような形です。 public void OnPointerClick(PointerEventData eventData) { var toggles = GetComponentsInChildren<Toggle>(); if (PlayerPrefs.GetInt("ItemA_had", 0) == 0) { toggles[1].interactable = false; } if (PlayerPrefs.GetInt("ItemB_had", 0) == 0) { toggles[2].interactable = false; } } --------------------------- あれ?解決ってどうしたらいいんだろう?
guest

回答1

0

自己解決

すみません、
「質問への追記・修正の依頼」側のコメントは、ベストアンサーに選べないのですね。
(「回答依頼」じゃないとダメなようです)
1570pさん の協力によるものではありますが、質問を「解決済」にする方法が他になさそうなので、
いったん、「自己解決」とさせていただきます。


using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class Test3 : MonoBehaviour, IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
var toggles = GetComponentsInChildren<Toggle>();

  if (PlayerPrefs.GetInt("ItemA_had", 0) == 0)
{
toggles[1].interactable = false;
}
if (PlayerPrefs.GetInt("ItemB_had", 0) == 0)
{
toggles[2].interactable = false;
}
}
}

投稿2021/05/01 11:51

100_j

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問