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

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

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

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

UI

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

列挙型

データ型の一種で、要素・メンバなど名前のある値や、型の列挙子によって構成されます。

Unity

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

Q&A

解決済

1回答

2127閲覧

enumの列挙子とドロップダウンのテキストを対応させるにはどうすればいいですか?

wata3

総合スコア16

C#

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

UI

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

列挙型

データ型の一種で、要素・メンバなど名前のある値や、型の列挙子によって構成されます。

Unity

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

0グッド

0クリップ

投稿2020/06/21 04:10

編集2020/06/21 13:34

前提・実現したいこと

Unityでカードゲームを作ろうとしています。
現在、デッキエディット画面を作ろうとしています。
前回の質問にて、カード検索にenum型(Flags属性付き)を取り入れようとしています。
swich文で1つ1つ書けばおそらく苦労せずにできるのでしょうが、
以前の質問で長文を短縮できたのにまた長文を書くのはどうかと思い質問しました。
追記
実現したいこととしては、取り込んであるカードの一覧からカードのタイプで絞り込みをかけたい、
ということです。
ソースコードでは CardType.何々 となるところの何々にドロップダウンのテキストを持ってきたいと思っています。
また、カードデータはエクセルに取り込んであり、typeにカードの持つタイプ(光,精霊 のような)を、 type_fにカードの持つタイプのフラグ(光,精霊なら513のような)を記入して取り込めるようにしてあります。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System; 6using System.Linq; 7public class CardModelU 8{ 9 public string id; 10 public string name1; 11 public string name2; 12 public int level; 13 public string type; 14 public int attack; 15 public int defence; 16 public string tag; 17 public string effect1; 18 public string effect2; 19 public string effect3; 20 public ulong type_f; 21} 22 23[Flags] 24public enum CardType :ulong 25{ 26 タイプなし = 0, 27= 1, 28= 2, 29= 4, 30= 8, 31= 16,//4 32= 32, 33= 64, 34= 128, 35 魔術師 = 256,//8 36 精霊 = 512, 37 戦士 = 1024, 38 ドラゴン = 2048, 39 神話 = 4096,//12 40= 8192, 41 岩石 = 16384, 42= 32768, 43 悪鬼 = 65536,//16 44 機械 = 131072, 45 人形 = 262144, 46 天使 = 524288, 47 PSI = 1048576,//20 48 建造物 = 2097152, 49 植物 = 4194304, 50= 8388608, 51 幻想 = 16777216,//24 52 死霊 = 33554432, 53= 67108864, 54 地雷 = 134217728, 55 呪い = 268435456,//28 56= 536870912, 57 重力 = 1073741824, 58= 2147483648, 59 結界 = 4294967296,//32 60 書物 = 8589934592, 61= 17179869184, 62= 34359738368, 63= 68719476736,//36 64= 137438953472, 65= 274877906944 66} 67public class CardSearch : MonoBehaviour 68{ 69 List<CardModelU> allUnitList = new List<CardModelU>(); 70 public InputField Level; 71 public InputField ATK; 72 public InputField DEF; 73 public InputField Text; 74 public Dropdown kindDD1; 75 public Dropdown kindDD2; 76 public Dropdown Type; 77 public GameObject SearchArea; 78 public GameObject CardData; 79 public GameObject CardID_; 80 GameObject Obj; 81 [SerializeField] private unit unit; 82 83 public void CardSEARCH() 84 { 85 86 foreach (Transform child in SearchArea.transform) 87 { 88 Destroy(child.gameObject); 89 } 90 IEnumerable<CardModelU> resultU = allUnitList.Where(s => kindDD1.value == 0 || kindDD1.value == 1); 91 if (Type.value != 0) 92 { 93 //ここでカードタイプによる絞り込み 94 } 95 if (Level.text != "") 96 { 97 resultU = resultU.Where(s => s.level.ToString() == Level.text); 98 } 99 if (ATK.text != "") 100 { 101 resultU = resultU.Where(s => s.attack.ToString() == ATK.text); 102 } 103 if (DEF.text != "") 104 { 105 resultU = resultU.Where(s => s.defence.ToString() == DEF.text); 106 } 107 if (Text.text != "") 108 { 109 resultU = resultU.Where(s => s.name1.ToString().Contains(Text.text) || 110 s.name2.ToString().Contains(Text.text) || 111 s.effect1.ToString().Contains(Text.text) || 112 s.effect2.ToString().Contains(Text.text) || 113 s.effect3.ToString().Contains(Text.text)); 114 } 115 foreach (CardModelU modelU in resultU) ShowU(modelU); 116 117 } 118 public void ShowU(CardModelU modelU) 119 { 120 CardData.GetComponent<CardD>().ShowU(modelU); 121 Obj = Instantiate(CardData, this.transform.position, Quaternion.identity); 122 Obj.GetComponent<CardID>().cardID = modelU.id; //この辺のIDの取り回しは要確認 123 Obj.transform.parent = SearchArea.transform; 124 } 125 126 void Start() 127 { 128 int UD = unit.Sheet1.Count; 129 130 131 for (int i = 0; i < UD; i++) 132 { 133 var cardModelU = new CardModelU() 134 { 135 id = unit.Sheet1[i].id, 136 name1 = unit.Sheet1[i].name1, 137 name2 = unit.Sheet1[i].name2, 138 level = unit.Sheet1[i].level, 139 type = unit.Sheet1[i].type, 140 attack = unit.Sheet1[i].attack, 141 defence = unit.Sheet1[i].defence, 142 tag = unit.Sheet1[i].tag, 143 effect1 = unit.Sheet1[i].effect1, 144 effect2 = unit.Sheet1[i].effect2, 145 effect3 = unit.Sheet1[i].effect3, 146 type_f = unit.Sheet1[i].type_f 147 }; 148 allUnitList.Add(cardModelU); 149 } 150 151 } 152}

試したこと

ドロップダウンのテキストはDropDown.captionText.textで読み込めるようですがenumの後(ソースコードではCardType)に記入してみたりした(CardType.(Type.captionText.text)というふうに)のですができませんでした。

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

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

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

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

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

BluOxy

2020/06/21 12:10

> enumの列挙子とドロップダウンのテキストを対応させる どう対応させるのでしょうか。仕様がわかりません。
BluOxy

2020/06/21 12:26

仕様によっては短縮できるでしょうし、switchを書かざるを得ないかもしれません。 ですから、仕様が分からないと回答できません。
wata3

2020/06/21 13:44

仕様の書き方が分からなかったですが足りなさそうな事は追記してみました。
BluOxy

2020/06/21 14:11

> ソースコードでは CardType.何々 となるところの何々にドロップダウンのテキストを持ってきたい enumの値が「光,精霊」ならドロップダウンのテキストに「光,精霊」と出せば仕様を満たしているでしょうか。入力と出力を教えてください。
wata3

2020/06/21 14:26

例えばドロップダウンが「光」のときにenumが「光」としたい、ということです。
BluOxy

2020/06/21 16:23 編集

ドロップダウンには単体のCardTypeに対応するテキストだけ書かれているのでしょうか。 どのようなテキストがあるのかを具体的に教えてください。(全て列挙されても構いません) ドロップダウンのテキストを入力とし、希望するCardTypeに変換し、出力できれば解決でしょう。ですから、文字列がどのようなパターンで作成されているのかを明示する必要があると思います。 例えば、「光」というドロップダウンのテキストなら「CardType.光」に、「光,精霊」なら「CardType.光 | CardType.精霊」にしたい というような wata3 さんの独自の仕様があるかと思います。それを明示してください。
BluOxy

2020/06/21 16:26

入力と出力が明確になれば、今回の質問で求めている…"ドロップダウンが「光」のときにenumが「光」としたい"についてアイデアを出すことができると思います。
wata3

2020/06/21 16:54 編集

ドロップダウンのテキストは単体のタイプのみですね。 そしてType.valueが0のとき以外はCardTypeに対応するテキストのみでそのままの順番、0のときは「―」となりタイプでは絞りこまないことにしようとしてます。
guest

回答1

0

ベストアンサー

Enum.Parseを使い、第2引数にドロップダウンのテキストを渡すことで対応するCardTypeの値が取得できます。

C#

1// CardType.光 2Console.WriteLine((CardType)Enum.Parse(typeof(CardType),"光")); 3// CardType.ドラゴン 4Console.WriteLine((CardType)Enum.Parse(typeof(CardType),"ドラゴン")); 5// CardType.岩石 | CardType.炎 6Console.WriteLine((CardType)Enum.Parse(typeof(CardType),"岩石, 炎"));

この方法では、列挙型に定義されている名前付き定数と同様の文字列を渡さないとArgumentExceptionが発生しますので注意してください。

つまり、ドロップダウンに表示するテキストはCardType内の名前付き定数と合わせる必要があります。

投稿2020/06/21 17:48

編集2020/06/21 17:55
BluOxy

総合スコア2663

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

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

BluOxy

2020/06/21 17:59

安全にキャストをさせたい場合、Enum.TryParseメソッドを使う方法もあります。 他にもEnumをParseせず DisplayAttribute 属性や カスタム属性 を使う方法がありますが、リフレクションについて理解する必要があります。
wata3

2020/06/22 09:52

ソースコードで(CardType)Enum.Parse(typeof(CardType),Type.captionText.text)と書けばTypeのドロップダウンのテキストを「CardType.何々」の何々に持ってこれる、ということですか?
BluOxy

2020/06/22 12:00 編集

その認識ですが、実際に試してみるとどうでしょうか。確認をしてください。
wata3

2020/06/22 12:34 編集

エラー自体は出ないですが想定通りの動きはしてないですね。多分ですが別の問題だと思うので色々いじって見たり調べてわからなければまた質問してみます。ありがとうございました。
BluOxy

2020/06/23 00:27

それでも構いませんが、入力と出力を具体的に明示して頂ければこちらで検証できるので、もっと適切な回答ができるかもしれません。現時点の質問ではこの回答が限界です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問