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

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

ただいまの
回答率

88.61%

[Unity] ランタイムでの.prefabファイルの読み込み手段について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,928

Wiz_Exmachina

score 36

 前提・実現したいこと

Unityでいわゆる音楽ゲームを作っています。
その譜面(多数のノーツ(ゲームオブジェクト)を子に持つゲームオブジェクトを、自由度や、扱いの良さから、.prefabファイルで管理し、
外部から、自由に追加し、ゲームからロードし、ゲームオブジェクトとしてInstantiateしたいと考えています。
もちろん、prefabが参照するスクリプトなどはビルドに組み込まれています。

 試したこと

実現する手段として、Streaming Assetsや、Resourceフォルダなどについて調べましたが、
StreamingAssetsを用いるには、Asset Bundleの理解が必要で、一日かけても理解が及びませんでした。
また、Resourceフォルダも、ビルドすると専用形式にコンパイルされているようで、ランタイムで追加などの操作は厳しいと判断しました。

 知りたいこと

外部からプレハブを読み込むのに、ここまで複雑な手段は必要なのでしょうか。
ランタイム時に、外部からプレハブを読み込む、なるべくシンプルな、よりよい手段はあるのでしょうか。
もしご存じであればご教授お願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

PrefabはEditor上のみで、実行時には読み込ません。
なぜなら、WindowsやAndroid・iOSなどのプラットフォームごとにビルドされるからです。
ビルドのためには他のスクリプトなどの情報が必要ですが、ビルド後は必要な情報が抜け落ちてしまいます。
ですので実行時にPrefabをロードする事はできません。

対処として
Asset Bundleを使用するか、
譜面データをJsonなどで持ち、それを自分で読み込みゲームオブジェクトを生成するなどがあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/08 20:42

    回答ありがとうございます。
    なるほど、.prefabはEditor専用と断って頂き、踏ん切りがつきそうです。
    一つ引っかかることがあって、自分で方法を調べていた時も、AssetBundleが度々目についたのですが、いまいちよくわからなかったので、質問させていただいてもよろしいでしょうか。
    AssetBundleでこの問題を対処した場合、どのような解決策になるのでしょうか。
    また、もしそれでプレハブのロードが可能になる場合、その方法の、コードの例、または使うメソッドや、参考になるページなど、何かヒントをいただけないでしょうか。
    よろしくお願いします。

    キャンセル

  • 2018/11/09 05:50

    AssetBundleは実行時にPrefabを読み込める仕組みです。
    流れとしては、
    エディタ上でAssetBundleをビルドし、
    そのAssetBundleをランタイムで読み込みます。

    このブログを読んでみると良いと思います。
    http://tsubakit1.hateblo.jp/entry/2015/12/16/233336

    キャンセル

  • 2018/11/09 09:47

    ありがとうございます。
    読んでみたところ、AssetBundleは、開発者側でアセットバンドルを作成、用意してから読み込ませるものであり、不特定多数の、しかもプレハブ単体で読み込ませるには向いていなさそうですね...
    あきらめてセーブ用クラスとJsonUtilityで対処しようと思います。

    キャンセル

+1

質問と全く関係ないですが

StreamingAssetsを用いるには、Asset Bundleの理解が必要で

StreamingAssetsとAssetBundleは全く関係ありません

Unityだとビルド時に、ファイルを設定に応じて適宜変換されますが、StreamingAssetsはその変換を避けるために使用します。
テキストファイルなどをそのまま読み書きしたいときに使用します。
なお、ビルド後にStreamingAssetsにファイルを追加することは出来ませんので、この方法で外部ファイルを読み込んで追加するようなことは出来ません。
(とはいえ、Application.persistentDataPathやApplication.temporaryCachePathに保存すれば、ほぼ同じように扱えるので、特に問題はないとは思いますが)

対して、AssetBundleは後付けでプレハブなどを追加するのに使用します。
今回はテキストファイルで大丈夫だと思いますが、3Dモデルやプレハブ化したファイルはこの方法でしか読み込めないので、余裕があれば理解しておくのがよろしいかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/09 09:47

    回答ありがとうございます!
    今回は、Jsonでやってしまうほうがよさそうですね。
    AssetBundleは、やけに小難しく感じたため、誤解してしまいました。今回は諦めますが、
    そのうち勉強しておこうと思います。

    キャンセル

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

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る