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

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

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

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

Q&A

解決済

1回答

4301閲覧

Instantiateで何を引数に与えているのか。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2017/08/27 13:52

###前提・実現したいこと

見慣れないInstantiateのコードを見たので、教えていただきたいです。

###該当のソースコード

C#

1var test = Instantiate( Resources.Load<TestComponent>( "TestComponent" ) );

まず、Resources.Loadのコードなんですが、ジェネリックに関するマニュアルが見つかりませんでした。
このようなResources.Loadの書式のマニュアルがあれば教えていただきたいです。
これは、指定したゲームオブジェクトの指定したコンポーネントを返しているということでしょうか?

Resources.Loadでコンポーネントを取得していた場合、Instantiateの引数にコンポーネントを与えると、
どのような処理となるのでしょうか?
Instantiateの引数にコンポーネントを与えると、そのコンポーネントがアタッチしているゲームオブジェクトを複製して、戻り値は、その引数に与えたコンポーネントを取得しているように見えましたが、合っていますか?

C#

1MyCube mycube = GameObject.Find ("Cube").GetComponent<MyCube> (); 2var mycube2 = Instantiate(mycube);

また、不思議に思えたのは、シーン上にCubeとSphereのゲームオブジェクトを用意して、
その両方にMyCubeコンポーネントをアタッチして、上記コードを実行すると、
ちゃんとCubeの方のゲームオブジェクトが複製されたことです。
MyCubeコンポーネントは、Sphereのゲームオブジェクトにもアタッチされてるので、
Sphereのゲームオブジェクトが複製されてもおかしくはないはずなのですが、
ちゃんとコンポーネント取得元のゲームオブジェクトのCubeが複製されるのは何故なのでしょうか?
上記のコードで言うと、mycubeがCubeにアタッチしているという情報を持っているのでしょうか?
その場合、mycubeからアタッチ先のゲームオブジェクトを取得するコードを教えていただきたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Resources.Loadのコードなんですが、ジェネリックに関するマニュアルが見つかりませんでした。

このようなResources.Loadの書式のマニュアルがあれば教えていただきたいです。

Unity スクリプトリファレンス:Resources.Load」の下の方にある「public static T Load(string path);」が該当します。
例が無くて分かりにくいんですが、
Unity スクリプトリファレンス:GameObject.GetComponent」の「ジェネリック版」のところと
Unity スクリプトリファレンス:ジェネリック関数」を見ると同じことだなーと分かります。

Instantiateの引数にコンポーネントを与えると、そのコンポーネントがアタッチしているゲームオブジェクトを複製して、戻り値は、その引数に与えたコンポーネントを取得しているように見えましたが、合っていますか?

厳密にはちょっと違って、(同名だとわかりにくいんで一部変更しています)

Resources.Load<TestComponent>( "TestObject" )
→Resourcesフォルダ内のTestObjectという名前のオブジェクトに付いているTestComponentコンポーネントが返る

var test = Instantiate( Resources.Load<TestComponent>( "TestObject" ) );
複製した後のTestObject(つまり「TestObject(Clone)」)に付いているTestComponentコンポーネントがtest変数に入る
→ただしシーン上では「TestObjectを複製したGameObject」が出来る

という動きです。

MyCube mycube = GameObject.Find ("Cube").GetComponent<MyCube> ();
このコードと同じように、Resources.Loadの方も""で囲われた部分がオブジェクト名を指す為、
同じスクリプトが付いているオブジェクトが複数あっても特定のオブジェクトを生成します。
(Resourcesフォルダ内にTestObjectという名前のオブジェクトが無い場合、TestObjectオブジェクトがあってもTestComponentが付いていない場合はnullが返ります)

投稿2017/08/27 15:47

sakura_hana

総合スコア11425

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

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

退会済みユーザー

退会済みユーザー

2017/08/28 15:35

ご回答ありがとうございます。 マニュアルのご掲載ありがとうございます。 「public static T Load(string path);」と掲載されていましたね。 文字が小さくて見落としてました。 すみません。2点確認させてください。 1点目。 コンポーネントの取得について勘違いしていたようです。 取得したコンポーネントは、アタッチ先のゲームオブジェクトから切り離されて取得していると思っていましたが、 そうではなく、アタッチ先のゲームオブジェクトの情報を持っているということですね? それを踏まえると、 var 変数 = Instantiate(コンポーネント); は、引数のコンポーネントのアタッチ先のゲームオブジェクトをシーン上に複製する処理を行い、 返り値には複製したゲームオブジェクトにアタッチしているコンポーネントが返って、 左辺の変数に参照されるということなんですね? 2点目。 >(Resourcesフォルダ内にTestObjectという名前のオブジェクトが無い場合、 > TestObjectオブジェクトがあってもTestComponentが付いていない場合はnullが返ります) 日本語の理解力がなくて申し訳ないんですが、 「Resourcesフォルダ内にTestObjectという名前のオブジェクトが無い場合」か、 「TestObjectオブジェクトがあってもTestComponentが付いていない場合」のいずれかの場合は、 nullが返るということですね?
sakura_hana

2017/08/29 01:41

どれもその通りです。分かりにくい書き方ですみません。 以下、余談です。 プレハブに付いているコンポーネントは、プレハブが生成された(インスタンス化された)時点でGameObjectの情報を持ちます。(this.gameObjectで取得出来る) コンポーネント単体で生成したい(=スクリプトをオブジェクトにアタッチしたい)場合は「AddComponent」を使用します。(この場合スクリプトはResourcesフォルダに入っている必要はありません。というかResources.Loadではスクリプトそのものは取得出来ません)
退会済みユーザー

退会済みユーザー

2017/08/29 17:03 編集

ご回答ありがとうございます。 ご確認ありがとうございます。 そのような書式でアタッチ先のゲームオブジェクトの取得が可能なのですね。 なるほど、AddComponentでスクリプトのアタッチもできるのですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問