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

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

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

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

Unity

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

Q&A

解決済

1回答

1511閲覧

enum型とulong型の数値とのビット演算の仕方

wata3

総合スコア16

C#

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

Unity

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

0グッド

0クリップ

投稿2020/06/24 12:54

前提・実現したいこと

Unityでカードゲームを作ろうとして、
現在、デッキエディット画面を作ろうとしています。
以前の質問にて、カード検索にenum型(Flags属性付き)を取り入れようとしています。
エクセルにカードごとに持っているタイプの合計した数値を持たせています。
(例:タイプ闇,炎のカードなら18、光,剣なら17179869185など)
どのように書けばenum型とulong型の数値とのビット演算によってカードの絞り込みができますか?

該当のソースコード

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

試したこと

試しに

C#

1resultU = resultU.Where(s => ((CardType)s.type_f&CardType.ドラゴン)==CardType.ドラゴン);

と書いてみましたが、うまく行きませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

基本的にulong通しのビット演算と変わりません

ドラゴンが立ってるかどうかの条件式は
(CardType)s.type_f&CardType.ドラゴン)!=0
と書くことができます

投稿2020/06/24 13:56

y_waiwai

総合スコア88042

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

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

wata3

2020/06/24 14:22

一応うまくいきました。ありがとうございました。 どうやら別問題でエクセルの数値を読み込めてなかったこともあったみたいです。 0の場合(タイプなし)だけ別に書き出したらいい感じですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問