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

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

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

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

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

3318閲覧

【Unity,C#】型違いの値を配列で管理したい

Y0241-N

総合スコア1066

C#

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

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/05/25 02:04

編集2021/05/25 04:24

前提・実現したいこと

図で説明します。
以下のような支配構造があり、これらの各子のオブジェクトとそれに付属するList<EventList>からEventListを取得し、
画像2のような形で保持したいと思っています。
イメージ説明
画像2
イメージ説明

試したこと

初めにList<List<EventList>>を試したのですが、これではGameObjectを保持できず、EventListしか取得できませんでした。
次に独自クラスで管理しようと思い、GameObjectとEventListを持つクラスを作成し、これをList化して取得を試みましたが、
この方法だと画像2の上側のようにただ順番に格納されるだけで思うような形ではありませんでした。

型違いの値を配列で保持する方法を調べましたが、求める答えはヒットしませんでした。

どのようにすればオブジェクトごとにEnumを保持できるでしょうか?

追記
オブジェクト型での保持は無駄が多い保持の方法のため、避けたいと考えています。
どうしても方法がない場合はオブジェクト型での保持を考えようと思います。

追記2
EventListの内容は以下の通りです。
これをObject A,B,CそれぞれがList<EventList>として保持しています。

cs

1public enum EventList 2{ 3 MoveFowrad, 4 MoveBack, 5 MoveLeft, 6 MoveRight 7}

追記3
省略して記述していたEnumの内容をEventListの内容に置き換えました。
不明点が多く申し訳ございません。また、userisgod様から提案していただいた方法でList<List<EventList>>での取得では以下の画像のようになり、意図する形とは異なるため、引き続き回答を募集させていただきます。

追記画像3
イメージ説明

試したコード(取得部分のみ抜粋)

List<List<EventList>>での取得

cs

1 void GetEventsInObject() 2 { 3 EventsForEachObject = new List<List<EventList>>(); 4 5 foreach(GameObject p in Parents) //ParentsにObjectsMGRをセット 6 { 7 var evList = new List<EventList>(); 8 9 foreach(Transform child in p.transform) 10 { 11 List<EventList> enumListData = child.GetComponent<EnumListData>().Events; 12 13 foreach(var ev in enumListData) 14 { 15 evList.Add(ev); 16 } 17 EventsForEachObject.Add(evList); 18 } 19 } 20 }

Classを作成し、List化したものでの取得

cs

1 void GetEvent() 2 { 3 EventsForEachObjects = new List<TestEnumData>(); 4 5 foreach(GameObject p in Parents) 6 { 7 foreach(Transform child in p.transform) 8 { 9 List<EventList> enumListData = child.GetComponent<EnumListData>().Events; 10 11 foreach(var ev in enumListData) 12 { 13 EventsForEachObjects.Add(new TestEnumData(){EventTargetObject = child.gameObject , TargetEvent = ev}); 14 } 15 } 16 } 17 }

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

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

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

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

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

sakura_hana

2021/05/25 02:40

「EventList」というクラスはUnityには存在しないと思うんですが何を指してますか?「UnityEvent」の間違いですか? 同様の理由で◎にあたるモノと、画像2の意味するモノが何なのかもよく分からないです。(仮にUnityEventだったとして、Enumは何を指しているのか)
Y0241-N

2021/05/25 02:41

すみません、EventListの内容を入れ忘れていました、追記します。
YAmaGNZ

2021/05/25 02:57

Event 1とかは何のことなのでしょう? List<EventList>と上の階層で書かれているので Event 1はEventListというEnumの値だと思うのですが、取り出そうと思われている記述の [objectA][Event 1]([0],[0]) とは合わないと思います。 またこの[objectA][Event 1]([0],[0])という表現もC#の文法に則った記述をしているのでしょうか? なんとなくDictionary<GameObject,List<EventList>>で済みそうな気がしないでもないですが、それぞれが何を指すものなのかが私には理解できませんでしたので回答までにいたりませんでした。
退会済みユーザー

退会済みユーザー

2021/05/25 02:58

辞書は試しましたか? > この方法だと画像2の上側のようにただ順番に格納されるだけで思うような形ではありませんでした。 「void GetEventsInObject()」の実装だと思いますが、「evList」は子ごとに作るべきではないでしょうか。 childが「Object A」~「Object C」まで順番に入っているとして、「evList」の位置を変更すれば下側のように取得はできると思います。
Y0241-N

2021/05/25 04:28 編集

>>YAmaGNZ様 すみません、内容を簡易的にと思い色々と省略してしまいました。 他の方から頂いた内容なども反映した上で修正いたします。 >なんとなくDictionary<GameObject,List<EventList>>で済みそうな気がしないでもないですが 提案ありがとうございます、一度調べて試してみようと思います。 >>userisgod様 >「evList」の位置を変更すれば下側のように取得はできると思います。 こちらを実施致しましたが、おっしゃるように画像2下側の配列の形で格納はされましたが、 この形ですと追記画像3のようにEventList0,1,2と取得元のGameObject A,B,Cが紐づかないため、望む結果ではありませんでした。
YAmaGNZ

2021/05/25 04:36 編集

ObjectMGRに何かしら今回のデータを格納したい配列もしくは相当のものAがあり、そこから value = A[0][0];  //1つ目の添え字がObjectA~Cを指し示す添え字、2つ目の添え字がListの何番目かの添え字 みたいな形で取り出して利用したいということですか?
Y0241-N

2021/05/25 04:36

はい、その通りです。 使用目的としては格納したデータを比較対象として使用したいと考えている為、なるべく手短にアクセスできる形で格納したいという思いがあります。
guest

回答3

0

ベストアンサー

C#

1Dictionary<GameObject,List<EventList>> A = new Dictionary<GameObject, List<EventList>>(); 2 3GameObject[] gameobjects = { new GameObject("Object A"), new GameObject("Object B"), new GameObject("Object C") }; 4 5A.Add(gameobjects[0], new List<EventList>() { EventList.MoveFowrad, EventList.MoveLeft, EventList.MoveBack }); 6A.Add(gameobjects[1], new List<EventList>() { EventList.MoveBack, EventList.MoveLeft }); 7A.Add(gameobjects[2], new List<EventList>() { EventList.MoveBack, EventList.MoveFowrad, EventList.MoveLeft, }); 8 9 10EventList value = A[gameobjects[0]][1]; 11

Unityを使っていないのでとりあえずGameObjectについては適当に定義していますが、質問から受けたイメージで思ったのは上記のようなことなのかと

投稿2021/05/25 04:57

YAmaGNZ

総合スコア10489

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

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

Y0241-N

2021/05/25 05:52

回答ありがとうございます、概ねこの通りで思うような実装が出来そうなのですが、 GameObject[] gameobjectsを要素数が変動するためList<Gameobject>に変更し、 A[gameobjects[0]]にアクセスする際、格納しているgameobjects[0]のオブジェクト名("Object A")を表示したいのですが、A[gameobjects[0]].nameとしようとすると'List<EventList>' に 'name' の定義が含まれていないと言われてしまいます。 格納されているのはGameObject Typeのはずなのですが、なぜList<EventList> Typeとなっているか分からず困惑しています。どうすれば名前にアクセスできますでしょうか?
Y0241-N

2021/05/25 06:18

Dictionaryについての理解が浅いため間違っていたようです、ありがとうございます foreach(var key in A.Keys) { for(int i = 0; i < A[key].Count; i ++) { Debug.Log(key + " / "+ A[key][i]); } } という風にしてアクセスすることにしました。
guest

0

質問を正しく読解できていなかったらすみません。

これをObject A,B,CそれぞれがList<EventList>として保持しています。

どういうフィールド名かはわかりませんが、仮にEventsとして
Object A, B, C, ...が入ったListを用意して、仮にObjectsとして、

Objects[i].Events[j]というような形での取得で十分ではないでしょうか?


TestEnumData
Object X(質問文からは型が読み取れませんでした)と
EventListを持っていそうですが、

Object X(質問文からは型が読み取れませんでした)と
List<EventList>を持つようにしては?

C#

1 void GetEvent() 2 { 3 EventsForEachObjects = new List<TestEnumData>(); 4 5 foreach(GameObject p in Parents) 6 { 7 foreach(Transform child in p.transform) 8 { 9 List<EventList> enumListData = child.GetComponent<EnumListData>().Events; 10 11 EventsForEachObjects.Add(new TestEnumData(){EventTargetObject = child.gameObject , Events = enumListData }); 12 13 } 14 } 15 }

投稿2021/05/25 02:52

編集2021/05/25 02:59
ozwk

総合スコア13553

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

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

Y0241-N

2021/05/25 04:28

回答ありがとうございます。 おっしゃる通り、私もこの質問を投稿した後に少し考えてその方法にいたりはしました。 ただ、少々アクセスに手間がかかるので、可能ならばxxx[i][j]でアクセスする方法があればいいなと思うので、継続して回答を募集させていただこうと思います。 どうしても方法がない場合はこちらの方法で実装しようと思います。
guest

0

なんでも入れれるリストなら、List<object> ですればいいという話になります。

投稿2021/05/25 02:08

y_waiwai

総合スコア88042

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

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

Y0241-N

2021/05/25 02:12

Object型での保持は無駄が多いので避けたいと考えています。 どうしても方法がない場合はObject型で保持する方法を考えようと思っていました。 追記しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問