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

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

Q&A

解決済

1回答

156閲覧

Unity prefabクローン×10個に格納されている情報を取得したい時の書き方

Tora_ou

総合スコア16

Unity

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

0グッド

0クリップ

投稿2025/06/29 20:55

編集2025/06/29 20:57

0

0

実現したいこと

シーン開始時には無かったオブジェクトがprefabクローンで×10個生成されていてイメージ説明
その10個のprefabにはそれぞれに情報が格納されているのですが
イメージ説明
イメージ説明
↑その情報を取得したい時の書き方がわかりません
例えば画像に出ている ItemNumber という情報を取得したいです

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

これがprefabでなければ画像の場所(ItemNumber)に格納されている
ItemNumber(画像では 6 や 8 が格納されているのが見えると思います)の取得したい時の書き方はわかっているつもり
var ItemNumber01 = GetComponent<Slot>().ItemNumber;
なのですが、これが後から生成されたprefabで名前がどれも同じ Slot(Clone) なのがとてもやっかいです・・・

該当のソースコード

10スロット有るので変数を10個作ってそれぞれのSlot(Clone) のItemNumber入っている情報を取得したいのですが・・・ var ItemNumber01 = GetComponent<Slot(Clone)>().ItemNumber; ???書き方がわからない var ItemNumber02 = GetComponent<Slot(Clone)>().ItemNumber; var ItemNumber03 = GetComponent<Slot(Clone)>().ItemNumber; var ItemNumber04 = GetComponent<Slot(Clone)>().ItemNumber; var ItemNumber05 = GetComponent<Slot(Clone)>().ItemNumber; var ItemNumber06 = GetComponent<Slot(Clone)>().ItemNumber; var ItemNumber07 = GetComponent<Slot(Clone)>().ItemNumber; var ItemNumber08 = GetComponent<Slot(Clone)>().ItemNumber; var ItemNumber09 = GetComponent<Slot(Clone)>().ItemNumber; var ItemNumber10 = GetComponent<Slot(Clone)>().ItemNumber;

試したこと・調べたこと

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

後から生成された(Clone)が付いてしまったprefabの取得の方法方法は難解です
一個だけなら強引にFindで(Clone)も名前に付け足して検索したりした事も有りましたが
今回、10個全部同じ名前なのでやり方がわからず6時間ぐらい調べ続けて困りはてています

補足

特になし

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

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

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

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

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

Tora_ou

2025/06/29 21:47

public static int[] ItemNumber = new int[10]; //static 配列 ↑のようなstatic 配列をわざわざ作っておいて、ItemNumberが画像のslotのItemNumberへと格納されるのと同時に 作ったstatic 配列にも同じItemNumberを入れておいて後でそれを使う。。。という方法で強引に動かしてます。 slot(Clone)の中のItemNumberが参照出来ればこんな回りくどいことはしなくて良さそうなのですが その部分を参照したい時の書き方がどうしてもわからなくて遠回り かつ、おかしな方法だと思うけどとりあえず動く状態・・・です。 本来の目的の値を参照してるわけではなくて目的の値の格納時に別の変数にも同じ値を入れておいてそれを参照してます・・・・とりあえずの処置という感じ
YAmaGNZ

2025/06/29 22:16

以前の質問時にprefabをインスタンス化したときにそのインスタンスを配列に入れればどうですか?って形で回答したかと思います。 その時配列の定義のところで「スコープを考えて適切な場所で配列を定義」と書いていたかと思います。 これはこの質問のように後で使用するときのことを考えてアクセスできるように定義してくださいといった意味でした。 このインスタンス作成時の配列を使えば item[1].ItemNumber とかでアクセスできるのではないですか?
Tora_ou

2025/06/30 05:23 編集

コメントありがとうございます。以前の質問の時のように記述した場合 item[1].ItemNumber だと別のスクリプトで使いたい場合、 Slot[] slot = new Slot[10]; ↑この書き方でスロットの宣言をしていても別のスクリプトで使いたい場合、書けないので スロットの宣言を static でしてしまう↓ という方法で問題ないのでしょうか。 public static Slot[] slot = new Slot[10]; Aのスクリプトで宣言した配列(この場合 Slot[] slot)を BやCのスクリプトでも使いたい、となる事は結構有ってこの場合の解決策として public static Slot[] slot = new Slot[10]; のようにstaticにしてしまうのは特に問題無い事なのでしょうか。
guest

回答1

0

ベストアンサー

いろいろな場所で共通の情報を使いたい場合だと共通の情報を定義する場所を作り、他のスクリプトはそこにアクセスするようにするといいでしょう。

例えば共通のデータを扱う場所をDataManagerとしシングルトンパターンとして定義します。

C#

1[DefaultExecutionOrder(-1)] 2public class DataManager : MonoBehaviour 3{ 4 public static DataManager instance; 5 6 public Slot[] slot = new Slot[10]; 7 8 private void Awake() 9 { 10 // シングルトンの呪文 11 if (instance == null) 12 { 13 // 自身をインスタンスとする 14 instance = this; 15 } 16 else 17 { 18 // インスタンスが複数存在しないように、既に存在していたら自身を消去する 19 Destroy(gameObject); 20 } 21 } 22}

としてPrefabを作成するところでは

C#

1public class SlotAria : MonoBehaviour 2{ 3 private void Awake() 4 { 5 // アイテムスロットをfrefabを使って自動で作る機能 6 for (int i=0; i < slotNumber; i++) 7 { 8 GameObject slotObj = Instantiate(slotPrefab,this.transform); 9 10 // 作成したインスタンスをDataManager内に格納 11 DataManager.instance.slot[i] = slotObj.GetComponent<Slot>(); 12 13 DataManager.instance.slot[i].SetItem(null); 14 } 15 } 16}

といった感じで作成時にDataManager内に作成したものを格納します。

そして使用するスクリプトでは

C#

1public class Character : MonoBehaviour 2{ 3 private void ActionProc() 4 { 5 // アイテムスロットから取得 6 int itemNo = DataManager.instance.slot[0].ItemNumber; 7 } 8}

といった感じで取り出せます。

またアイテムスロットを作成するオブジェクトに

C#

1public class SlotAria : MonoBehaviour 2{ 3 public Slot[] slot = new Slot[10]; 4}

と定義して他のスクリプトで使用する際にGetComponentでそれが定義されているオブジェクトを取得するとか

C#

1public class SlotAria : MonoBehaviour 2{ 3 public static Slot[] slot = new Slot[10]; 4}

と定義しSlotAria.slot[0]とアクセスすることも出来るかと思います。

どういう方法を取るのが一番いいのかは場合によって変わってくると思いますし上記の方法ではなくもっといい方法があるかもしれません。

投稿2025/06/30 06:32

編集2025/06/30 06:48
YAmaGNZ

総合スコア10663

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

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

Tora_ou

2025/06/30 06:48

シングルトン、static(静的)変数、については区別がついていなくて書いておけば 「どこでも使えるようになる」 という同じような働きをする、というようなかなり大まかな認識をしている程度の状態です。 ※解説を読むと皆こぞって強めの注意喚起されている印象です  どこでも使えるが故に意図しない動作の元になるから、的な 注意して使えば便利だと思うので今回 使ってみようと思います ところで例として書いてくれた1行目の  [DefaultExecutionOrder(-1)] これにはどういった意味合いがあるのでしょうか
YAmaGNZ

2025/06/30 06:54

各スクリプトのAwakeやStartはどのオブジェクトのものがどの順番で実行されるかは決まっていません。 なので[DefaultExecutionOrder(-1)]を書くことにより優先的に実行されるようになります。 0が基本的な順番でマイナス方向に大きくなるほど最初に実行されることとなります。 私が書いたようなシングルトーンパターンであった場合、Awakeが実行されないとinstanceに値が入らないのでなるべく最初に実行されるように[DefaultExecutionOrder(-1)]を書きました。
Tora_ou

2025/06/30 15:06

なるほど、そういった細かいテクニックが有るのですね。 教えていただきありがとうごじました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問