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

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

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

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

Unity

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

配列

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

Q&A

1回答

587閲覧

Prefabの子を取得して配列に格納してその配列にアクセスしたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

配列

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

0グッド

0クリップ

投稿2018/04/12 02:51

編集2022/01/12 10:55

前提・実現したいこと

Unity初心者なのですがご教授いただければと思います。

Scroll view でPrefabをインスタンス化しました。

Prefab
└ 名前
└ 問題文
└ アイコン
└ 既読したら消える画像

が入っています。

ラインのようなシステムを作りたいと思っています。

発生している問題・エラーメッセージ

このクローン1つずつの
"既読したら消える画像"にアクセスしたいのですが
どうすればアクセスできるでしょうか。

また "既読しているかしていないか"を
int 変数 = 0 //未読
int 変数 = 1 //既読

Updateでif()を用いてやろうと思っています。

質問がうまく伝わっていなかったら申し訳ないです。
よろしくお願いします。

該当のソースコード

for (int i = 0; i < BUTTON_COUNT; i++) { int no = i; //ボタン生成 GameObject btn = (GameObject)Instantiate (btnPref); //ボタンをContentの子に設定 btn.transform.SetParent (content, false); //名前を更新 text.GetComponent<Text> ().text = personName[no + 1].ToString (); //問題文を更新 statementText1.GetComponent<Text> ().text = defaultStatement[no + 1].ToString (); //ボタンのクリックイベント登録 btn.transform.GetComponent<Button> ().onClick.AddListener (() => OnClick (no));

試したこと

ListでGameobjectを作って
for文の中で Addしましたが全て同じ要素数になってしまいました。。。

またimage[]配列を定義しておいて
for文の中で
image[i] = checkImage; //1個ずつ入る

のようにやってもエラーが出てきてしまいます。

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

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

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

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

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

MMashiro

2018/04/12 03:06 編集

ソースコードは見やすさ重視のために ``` 〜 ``` という様に ``` で括っての記述をお願い致します
退会済みユーザー

退会済みユーザー

2018/04/12 03:02

ご指摘ありがとうございます。修正いたしました。
guest

回答1

0

正しく理解できているかわかりませんが自分ならこうするという回答です

  1. 名前 , 問題文 , アイコン , 既読したら消える画像を管理するためのマネージャークラスを作成

(この際名前、問題文、アイコン、画像は[SerializeField]をつけるなりしてインスペクタに出るようにしてください)
2. Prefabのルートオブジェクト(今回はScroll Viewですかね?)に①で作ったクラスをアタッチ
3. 名前 , 問題文 , アイコン , 画像それぞれをインスペクタからマネージャクラスの各変数にセット
4. Prefab化

上記の手順を踏むとPrefab化したものを動的に生成してもマネージャクラスは自分自身の子を参照したままスポーンしてくれるので
後は生成したスクリプトから GetComponent<マネージャクラス> としてやれば各変数にアクセスできると思います

わかりにくい箇所あればご指摘いただけると加筆・修正いたします

投稿2018/04/12 03:06

MMashiro

総合スコア2378

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

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

退会済みユーザー

退会済みユーザー

2018/04/12 03:40

回答ありがとうございます!! ``` using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; //このクラスをScroolViewにアタッチ public class Manager : MonoBehaviour { //0が未読 //1が既読 //2が未読 public int check; //インスペクターで各変数にセット public Text name; //名前 public Text statement; //文章 public Image icon; public Image checkImage; // Use this for initialization void Start () { } // Update is called once per frame void Update () { //問題1を見たら問題1の未読画像を消す //問題2を見たら問題2... // if (check == 0) { //未読の場合は未読画像を表示させておく checkImage.GetComponent<Image>().sprite = Resources.Load<Sprite> ("未読画像"); } else if (check == 1) { //既読の場合は何も表示しない checkImage.GetComponent<Image> ().enabled = false; } else if (check == 2) { //正解済みの場合は正解画像を表示させておく checkImage.GetComponent<Image>().sprite = Resources.Load<Sprite> ("正解画像"); } } } ``` 自分なりに書いて見たのですがどうでしょうか? 最後のUpdateのところの //問題1を見たら問題1の未読画像を消す //問題2を見たら問題2... //続く checkimage[i] ← ボタンの番号?を入れなくてはいけませんが この変数iはfor文の中などでいれるのでしょうか? 質問多くて申し訳ないです。。
MMashiro

2018/04/12 04:04 編集

"このクローン1つずつの 既読したら消える画像 にアクセスしたいのですが" という場所にフォーカスして回答したのでそれ以外の仕様に関してはちょっと理解が追いついていません。 私が提示した方法は 名前、問題文、画像等をひとまとめにしひとまとめにした最上位オブジェクトにマネージャークラスをアタッチするという考えです そのためクローンするたびにマネージャーが増えていくという形です (クローンしたりクローンしたオブジェクトを管理するマネージャークラスはまた別に必要になるでしょう) GameObject (マネージャーアタッチしこのGameObject事Prefab化) └画像 (インスペクタからマネージャに参照を渡す) └問題文テキスト (インスペクタからマネージャに参照を渡す) └etc...
退会済みユーザー

退会済みユーザー

2018/04/12 05:56

1つのボタンの画像だけにアクセス (例えば5番目のボタンの中にある画像だけを消す という処理を行うには GameObjectを配列かなにかにいれて取り出せばいいということでしょうか? この処理はManagerクラスで行う で、、合っているでしょうか?
MMashiro

2018/04/12 06:06

はい、それで行けると思いますGameObjectの配列を作り 5番目のボタンであれば objList[5].GetComponent<Manager>().Image のような感じでアクセスできるんではないでしょうか (上記コードはあくまでイメージです) ただGetComponentはそこそこ重いのでGameObjectのリストではなくManagerのリストを作ったほうが良いかもしれません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問