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

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

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

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

Q&A

解決済

1回答

4084閲覧

アセットのプレハブはインスタンスなのかわからない。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

1クリップ

投稿2017/09/19 16:18

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

シーン上に生成してなくて、アセットだけに格納されてあるプレハブはどういう状態なのでしょうか?
これはインスタンスですか?

アセットのプレハブを、ヒエラルキーにドラッグ&ドロップすれば、シーン上にプレハブ生成されて、
そのシーン上のプレハブがインスタンスであることは理解しています。
しかし、アセットの中にあるプレハブはどういう状態なのでしょうか?

###試したこと

①MyPrefabというスクリプトがアタッチされたmypfbというプレハブをアセットに登録。
MyPrefabというスクリプトは、下記のようにインスタンスフィールドを持つ。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class MyPrefab : MonoBehaviour { 6 7 public int i = 4; 8}

②Sampleスクリプトがアタッチされた空のゲームオブジェクトをシーン上に作成。
③Sampleスクリプトを下記のように作成。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Sample : MonoBehaviour { 6 7 [SerializeField] 8 GameObject obj; 9 10 // Use this for initialization 11 void Start () { 12 Debug.Log (obj.transform.position); 13 Debug.Log (obj.GetComponent<MyPrefab>().i); 14 } 15}

④SampleクラスのSerializeFieldにmypfbをセット。

⑤実行すると、下記のように出力される。

(0.0, 0.0, 0.0) UnityEngine.Debug:Log(Object) Sample:Start() (at Assets/Sample.cs:12) 4 UnityEngine.Debug:Log(Object) Sample:Start() (at Assets/Sample.cs:13)

この実行結果についてわからないこと。

・positionが(0,0,0)と表示されているが、シーン上の(0,0,0)にmypfbは配置されていない。 ・MyPrefabの変数iはインスタンスフィールドのはず。 シーン上にプレハブは生成されていないのに、インスタンスフィールドにアクセスできてしまうのはなぜか。 シーン上になくても、アセットのmypfbのプレハブはインスタンスなのか?

ご教授のほどよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

public or [SerializeField] + Inspectorで設定 = 初期化

Inspectorで設定したものが配列ならその配列で初期化
GameObjectならGameObjectで初期化
スクリプトをアタッチしている場合そのスクリプトも合わせて初期化されます。
MonoBehaviourを継承しているクラスなら自動で初期化が走ります。

目には見えないですが、profilerで確認してください。
メモリ上に展開されているのがわかります。(1個はわかりにくいので複数設定してみると分かりやすいかもしれません)

###(0.0, 0.0, 0.0)の謎
上記でもお話しましたがInspector上で設定したオブジェクトは自動的に初期化が走ります。そしてtransform.positionの初期値が0,0,0です。ちなみにMyPrefabのtaranfrom positionに適当な値を設定するとその値が表示されることがわかります。この挙動からも何もしていなくても初期化が走っていることがわかると思います。

(おまけ)メモリ管理にご注意ください。

ゲーム画面に登場していないので初期化は走っていないと思いがちですがInspectorで設定したものは見えなくても全てメモリに展開されてしまいます。なのですぐ使うものはInspectorで設定、それ以外はResourcesに入れて動的に展開するのがオススメです。

投稿2017/09/19 19:29

IShix

総合スコア1724

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

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

退会済みユーザー

退会済みユーザー

2017/09/20 14:15 編集

ご回答ありがとうございます。 確認ですが、プレハブがアセットにあるだけではインスタンス化されていないけど、 アセットのプレハブをpublicや[SerializeField]でInspectorで参照設定したら、インスタンス化されているという解釈で合っていますか?
IShix

2017/09/20 15:41 編集

そうです。ただResourcesフォルダに入れたデータは起動時にインデックスを収集するらしいので起動時間とメモリに多少影響するようです。ですが数千ファイルでも特に実感ないのでどの程度から体感できるかは分かりません。 Resourcesフォルダからのロードが遅くなる場合、AssetBundleを使うという手もあります。AssetBundleの場合、チャンクロード機能があるので一部のみ解凍、展開できます。ただAndroidで使う場合はアプリケーション内のデータはすべて圧縮されているのでWWWで取得する必要がでてきます。その場合、一部解凍する方法を知らないので大きなコストになると思います。
退会済みユーザー

退会済みユーザー

2017/09/20 16:24 編集

ご回答ありがとうございます。 ご確認ありがとうございました。 AssetBundleについても勉強したいと思います。
IShix

2017/09/21 09:47

すみません。そういえば思い出したのでもう一点、音もそうでした。 Inspectorの設定に関わらずPreload Audio Dataという項目がオンになっていると起動時メモリ上に展開されます。
退会済みユーザー

退会済みユーザー

2017/09/21 12:37

ありがとうございます。 とても勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問