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

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

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

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

Unity

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

Q&A

解決済

1回答

336閲覧

[Unity2D] 複数のInstantiateしたオブジェクトにアタッチされているScriptを1回のGetComponentで取り出したい

mushipan0929

総合スコア56

C#

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

Unity

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

0グッド

0クリップ

投稿2020/08/13 07:25

編集2020/08/14 00:28

前提・実現したいこと

複数のInstantiateしたオブジェクトにアタッチされているScriptを1回のGetComponentで取り出したいです。

オブジェクトは全て同じPrefabから、スクリプトは全て同じスクリプトになっています。

試したこと

Instantiateする前に読み取りたいスクリプト型の変数を宣言し、Prefabに入っているスクリプトを代入しました。
その後Instantiateした後に、先ほど宣言した変数を使いGetComponentを使わずアクセスしようとしたらエラーが起き出来ませんでした。
エラーの内容を調べると取り出そうとしている物が無い事を示すエラーでしたが
その後GetComponentすると普通にアクセス出来たので、余計に訳が分かりません。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class getComponent : MonoBehaviour 6{ 7 private GameObject prefab; 8 private Test test; 9 10 private void Awake() 11 { 12 prefab = GameObject.Find("prefab"); 13 test = prefab.GetComponent<Test>(); 14 } 15 16 private void Start() 17 { 18 for(int i = 0 ; i < 5; i++) 19 { 20 GameObject obj = Instantiate(prefab); 21 obj.test.num = i; 22 // エラー CS1061 'GameObject' に 'test' の定義が含まれておらず 23 // 型 'GameObject' の最初の引数を受け付けるアクセス可能な拡張メソッド 'test' が見つかりませんでした。 24 // using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。 25 26 // ↓はちゃんと通る 27 //obj.GetComponent<HogeTest>().HogePrint(); 28 } 29 } 30}

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

// エラー CS1061 'GameObject' に 'test' の定義が含まれておらず // 型 'GameObject' の最初の引数を受け付けるアクセス可能な拡張メソッド 'test' が見つかりませんでした。 // using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

prefabは「今シーン上にある"prefab"という名前のGameObject」であり
objは「新たに生成されたGameObject、"prefab"のコピー」です。

testは「prefabオブジェクトに付いているTestコンポーネント」なので、
objとは全く無関係です。

obj.test.numは「新たに生成されたGameObjectの変数testが参照しているクラスの変数num」を指しますが、当然こんなものは存在しない為エラーとなります。
(GameObjectクラスにはtestなんていう変数は無い)
(もちろんprefab.testとすることも出来ない)

obj.GetComponent<HogeTest>().HogePrint();は「新たに生成されたGameObjectに付いているHogeTestクラスを取得、そのHogeTestクラス内のHogePrintメソッドを実行」なので正常に動作します。


ちなみにInstantiateはGameObjectではなく型を渡すことも出来ます。
以下のようにすると希望の動作が出来るかと思います。

C#

1public class getComponent : MonoBehaviour 2{ 3 private Test prefab; 4 5 private void Awake() 6 { 7 prefab = GameObject.Find("prefab").GetComponent<Test>(); 8 } 9 10 private void Start() 11 { 12 for(int i = 0 ; i < 5; i++) 13 { 14 Test obj = Instantiate(prefab); 15 obj.num = i; 16 } 17 } 18}

投稿2020/08/14 01:10

sakura_hana

総合スコア11427

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

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

mushipan0929

2020/08/14 04:32

てっきり関係も引き継いでくれると思ったら違うんですね... 丁寧に書いていただきありがとうございました。とても分かりやすかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問