teratail header banner
teratail header banner
質問するログイン新規登録
Unity

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

Q&A

解決済

3回答

380閲覧

全部で〇〇種類有るアイテムを今何種類持っているのか、という書き方が知りたい

Tora_ou

総合スコア16

Unity

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

0グッド

0クリップ

投稿2025/06/30 06:39

0

0

実現したいこと

例えばガチャが全8種類で
そのうちの何種類を持っているのか、というのを出力したいのですが
どのように書けば良いのでしょうか。

被り(重複)の数については少し調べていたら書き方がわかったのですが何種類持っているのか?
のチェック方法を探していてつまづきました。

発生している問題・分からないこと

変数は8種(例えのガチャが全8種なので)宣言してあるものとして
int item00 = 0; //種類&被りチェック用変数
int item01 = 0;
int item02 = 0;
int item03 = 0;
int item04 = 0;
int item05 = 0;
int item06 = 0;
int item07 = 0;
8種類のアイテム(item00 ~ item07)がガチャから出てくる度に
これらの変数は+1されていってそのアイテムの取得数としてカウントしてます

該当のソースコード

int kaburiMAX = Mathf.Max(item00, item01, item02, item03, item04, item05, item06, item07); Debug.Log("一番多くかぶっているアイテムの数→" + kaburiMAX); // 一番多くかぶっているアイテムの数 ↑全アイテムの中で一番被っている数値はこれで出せています(これだとどれが一番被っているのか、という種類まではわからないけどここでは不問) 8種類のアイテム(item00 ~ item07)のうち、何種類を持っているのか? というのを求めたいのですが書き方がわかりません Mathf.Max というもの(メソッド)を今回、調べていて初めて知りましたので 何種類持ってるのかを求める事の出来るこういった類のメソッドが有ったりしないでしょうか

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

私の検索の仕方が悪いのでしょう、探すとたくさん出てくるのですが
今、求めているもの(8種類のアイテム(item00 ~ item07)のうち、何種類を持っているのか?)
を求めたい時のコードの書き方にはまだたどり着けていません

補足

特になし

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

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

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

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

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

Tora_ou

2025/06/30 06:56

もちろん (item00 >= 1) (item01 >= 1) ・・・・  をアイテムの数だけ全種類書いて(数が多い場合はfor文を使用) その数をカウントする、というのは思いつきましたが こういう場合の便利な書き方ないのかな、という質問です 例で書いたみたいな Mathf.Max が最大値を返してくれるみたいに 1以上の数を全てカウントして返してくれる的なものが無いのかな
guest

回答3

0

既に解決してますし,蛇足気味な話ですが.

仮に私が「 Mathf.Max というやつと同じ感じで書けねぇのかなぁ…」とか考えている場合というのを想像してみると……
まず最初に「つーか,この Mathf.Max ってのは一体どうなってんの? なんで任意の個数の引数渡せるのコレ?」というのを疑問に持つかなぁ…とか思いました.

で,こいつについてググってみると
public static float Max (params float[] values);
とか書かれていて,どうやら params float[] という呪文じみた記述に秘密がありそうです.この不可思議な記述は一体何なのか?

……と調べていき,
【どうやらこの params とかいうやつを引数に用いたメソッドを自分で書いてやれば, Mathf.Max と同じ感じの使い方が可能な「何種類持っているかを数える」メソッドを用意できそうな予感!?】
ということになりそうです.

……で,例えば

C#

1//引数に任意の個数の int を渡す → 値が1以上である引数の個数を返す 2static int CountNonZero( params int[] vals ) 3{ 4 int n=0; 5 foreach( int v in vals ) 6 { 7 if( v>=1 ){ ++n; } 8 } 9 return n; 10}

みたいなのを書くところにたどり着くかな,という気がします.

既に他の回答で使われている Count を用いて実装するならばこう↓ですかね.

C#

1static int CountNonZero( params int[] vals ) 2{ 3 return vals.Count( v => (v>=1) ); 4}

投稿2025/07/01 02:26

fana

総合スコア12227

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

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

Tora_ou

2025/07/01 07:31

コメントありがとうございます。Mathf.Maxについては 便利な呪文が有るんだなぁ、ってレベルの初心者なのでそこまで深く考えていません。 応用すれば色々な事が出来るようになっているのですね。 自分で簡単なもの(クイズ、ガチャ等)をいくつか作ってみてわかったのは世間に出回っているゲームというのは本当に凄いな、という事です。
fana

2025/07/02 01:46

> 自分で簡単なもの(クイズ、ガチャ等)をいくつか作ってみてわかったのは世間に出回っているゲームというのは本当に凄いな、という事です。 同意. 規模が大きい/小さい とか 面白い/そうでもない とかいうのとは全く別次元の話として,まずもって「ちゃんと動いてる」に達していることが とてつもなくすごい! っていう.
guest

0

こういったデータは配列に持ったほうが処理しやすいかと思います。

C#

1// このように定義した場合 2int Item[] = new int[7]; 3 4// 取得したアイテムを加算する 5Item[取得した番号]++; 6 7// 取得した最大数 8int Max = Item.Max(); 9 10// 取得した種類 11// Countは配列にある条件を満たすものの数を返してくれる 12// https://learn.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.count?view=netframework-4.8 13int kind = Item.Count(item => item > 0);

といった書き方ができます。
Countについてのドキュメントはこちらをご覧ください。

多分item00、item01、item02といった連番でデータを持とうとする場合ほとんどは配列で持ったほうが扱いやすくなるのではないかと思います。

投稿2025/06/30 07:44

YAmaGNZ

総合スコア10663

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

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

Tora_ou

2025/06/30 15:27 編集

回答ありがとうございます。 リスト、配列がまだ少し難しくて(理解しつつはあるけどいつもコードの書き方とにらめっこです) 変数が少なそう(10個以下)な場合は全部の変数にそれぞれの名前を付けて作る方法で 誤魔化してきましたがこれからは練習も兼ねて出来るだけ複数有る変数についてはリストで作成していこうと思います。 リストで作っておけばCountのような他にも色々と便利で使えそうなものが有るようなのでリストで作ったほうがメリットが多そうです。
guest

0

ベストアンサー

C#であれば、LinqのWhereメソッドを使って、例えばこんな風に書きます。

C#

1int item01 = 1; 2int item02 = 0; 3int item03 = 3; 4int item04 = 0; 5int item05 = 5; 6int item06 = 0; 7int item07 = 7; 8int item08 = 0; 9 10var list = new List<int> { item01, item02, item03, item04, item05, item06, item07, item08 }; 11 12int num = list.Where(v => v > 0).Count(); 13// 種類は4種類 14Debug.Assert(num == 4); // 本当に4種類か検証 15 16// おまけで合計も求めます。 17num = list.Sum(); 18// 合計は16個 19Debug.Assert(num == 16); // 本当に16個か検証

私の検索の仕方が悪いのでしょう、探すとたくさん出てくるのですが
今、求めているもの(8種類のアイテム(item00 ~ item07)のうち、何種類を持っているのか?)
を求めたい時のコードの書き方にはまだたどり着けていません

検索もいいのですが、冗長でもいいからまずはとにかく動くものを自分で考えて書きましょう。
List<int>や配列にすれば、Linqを使わなくてもループで数えられます。

投稿2025/06/30 07:12

編集2025/06/30 08:22
dodox86

総合スコア9416

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

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

Tora_ou

2025/06/30 07:39 編集

回答ありがとうございました item00~07までみたいに本当にその数(例だと8)の変数を宣言したりせずに 最初から8つの変数を リスト、配列で宣言しておけば、その中から条件を満たしているものの数を数える、という方法が有るんですね List<int> Item = new List<int>(); ↑みたいにリストで宣言しておけば、後は  変数 = Item.Count(num => 1);  //リストの中を全部チェックして1以上の要素数を数えてくれる? みたいな感じでしょうか
dodox86

2025/06/30 08:06

ああ、いただいたコメントで思いましたが、Whereで対象の要素を抽出してその数をCountするより、最初からCountでItem.Count(num => num > 0); とした 方が直接的、簡便ですね。尚、 "=>" はラムダ式のラムダ演算子(lambda oparator)として扱われるので、Item.Count(num => num >= 1); (引数として渡されるnumについて、1以上の要素数をカウントする)とのように書きます。 > 最初から8つの変数を リスト、配列で宣言しておけば、その中から条件を満たしているものの数を数える、という方法が有るんですね 色々な方法を丸覚えするよりは、最初はまずプログラミング言語は置いておいて、まず自分の頭と手で数える場合、どのような手順でやるか、それができたらプログラミング言語に置き換える、とのようなやり方をお勧めします。そうでないと、写経になってしまい、ちょっと違うパターンですぐ行き詰まります。まぁ、人それぞれですが。
dodox86

2025/06/30 08:13

既に別で回答をいただいていますが、配列やListにするとループやLinqが使い易いというメリットがあります。順番に見ていく、と言う操作のイメージにも合致していますね。 もし"item01"や"item02"等の名前があとで必要になるのであれば、Dictionaryを使って名前(キー)でアクセスするようにもできます。これはアプリ固有のデータ構造のお話ですね。
dodox86

2025/06/30 08:26

時間的には私の回答が先でしたが、回答、コメント自体が冗長に思うので、私自身はYAmaGNZさんの別回答を推します。
Tora_ou

2025/06/30 15:24

コメントありがとうございます。 アイテム何種類持ってるかチェック、自分で思いついたコードはこのような物でした。 int ItemComp = 0; //アイテム何種持ってるかが入る変数を宣言 あとはアイテム00は1個以上あるか?というif文がtrueなら+1づつ、加算していく をひたすら全アイテム(8種類)に関して総当たりで行っていく、というやり方です if (item00 >= 1) { ItemComp++; } if (item01 >= 1) { ItemComp++; } if (item02 >= 1) { ItemComp++; } if (item03 >= 1) { ItemComp++; } if (item04 >= 1) { ItemComp++; } if (item05 >= 1) { ItemComp++; } if (item06 >= 1) { ItemComp++; } if (item07 >= 1) { ItemComp++; } ItemComp に入っている数値 = 持っているアイテムの種類 そして今回は実際にこのコードで動かしています Listで宣言しておけばこんなにダラダラと冗長に書く必要は無かったようですが 今回、本当に完成の最後のほうだったので変数をリストに変更すると直す部分が多そうなのと リストに直すことで新しく生まれる誤動作(どこに原因が有るのかすぐに辿り着ければ良いけど)が あると思うので、今回、この変数はリストでやり直さずにあえてこのままで行きたいと思います
dodox86

2025/06/30 17:17

> そして今回は実際にこのコードで動かしています わざわざコメントありがとうございます。そうだったのですね。理解しました。 > 今回、本当に完成の最後のほうだったので変数をリストに変更すると直す部分が多そうなのと > リストに直すことで新しく生まれる誤動作(どこに原因が有るのかすぐに辿り着ければ良いけど)が > あると思うので、今回、この変数はリストでやり直さずにあえてこのままで行きたいと思います これは良い姿勢、向き合い方だと思います。作りたいものを自分で理解できる範囲の書き方でいったん完成させ、気になったところ、影響が大きそうなところは理解を深めた後で次のバージョンや別のプログラム(製品)で少しずつ改良して使っていくとご自身の成長も実感できるし、精神的にも楽ですね。
Tora_ou

2025/07/01 07:27

リスト、配列がまだ難しくて変数を少し増やす程度の手間で使わずに済むのであれば リスト、配列は出来れば使わないように避けて来た所があるのですが これからはリスト、配列を使う練習も兼ねて出来るだけ複数有る変数についてはリストで作成していこうと思います。 リストで作っておけばCountのような他にも色々と便利で使えそうなものが有るようなので ちゃんと使う事が出来るのでれリストで作っておいたほうがメリットが多そうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問