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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

受付中

[Unity][C#][Linq]クラフトシステムで素材ベースから絞り込む手法について

koz555
koz555

総合スコア5

Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

2回答

0リアクション

0クリップ

555閲覧

投稿2022/04/01 09:55

編集2022/04/01 09:58

お世話になっております。
Unity2021+C#+RPGフレームワークのクラフトシステムで、OverCook2のような料理ゲームを作っています。
素材ベースから絞り込んだレシピを組み立てる手法について分からないので相談させてください。

クラフトシステムにはレシピがあります。
レシピには素材のリストがあります。

C#

List<Item> ingredientsList = recipe.ingredientsList Item outcomeItem = recipe.outcome

といった形です。

レシピから素材が足りているかをチェックし、足りていればクラフトするという、レシピベースのクラフトは普通に可能です。
しかし、皿には先に素材から乗せていきます。
素材を起点として、作れるレシピを絞り込んで、足りた時点で自動でクラフトするという手法がうまく実現出来ず悩んでいます。

たとえばこのようなレシピがあるとします。

recipeoutcomeingredient
cca,b
ddc,e
ggd,f

dから見るとaはcの材料なので、aやbは孫材料と呼ぶとします。
おなじくdから見てcやeは子材料と呼ぶとします。

そこで、皿に最初にfを入れた場合、全レシピから

C#

List<recipe> allRecipeList.Where(x => x.ingredientsList.name == f.name)

でレシピはgのみに絞り込めるので、次に入れられる材料が確定し、dを持てばrecipe.useでクラフト可能です。
しかし、ここでdではなく孫材料であるaが皿に入った時、孫材料である、という判別のしかたが分かりません。
さらに、可能性のある対象レシピの子材料でも孫材料でもないものは皿に入れられないように弾きたいです。

また、f->aと皿に入れた後に、次に受け入れ可能なのはbとdとeのみに制限したい(cは既に孫材料であるaが皿にあるため持てない)という仕様にしたいのですが、
その実現方法が分かりません。
f,a,dが皿に入った場合は、次に受け入れ可能なのはbのみです。
つまり、孫材料が皿に入っている場合は、子材料は弾きたいという事です。

recipeoutcomeingredient
かけうどんかけうどん茹でたうどん,かけスープ
わかめうどんわかめうどんかけうどん,わかめ
わかめエビうどんわかめエビうどんわかめうどん,エビ

の場合、エビと茹でたうどんが皿にある場合は、かけうどんは(茹でたうどんが既に皿にあるため)持てないようにしたいという事です。

このような挙動を解決したい場合、どのような手法でググればよいかなどが分かりません。
何かパターン名や再帰、LinqのSelectManyやGroupBy、集合などで解決出来そうな気はしているのですが、あちらが解決すればこちらが実現出来ないなどで
グルグルと混乱してしまい悩んでいます。

どなたか解決方法を教えていただけないでしょうか?

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。