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

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

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

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

Unity

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

Q&A

解決済

1回答

14611閲覧

【Unity】動的に作成したgameObjectから、さらにgameObjectを生成する

Kusa1024

総合スコア17

C#

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

Unity

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

0グッド

1クリップ

投稿2016/08/24 05:47

編集2016/08/24 06:43

unity を使用してカードゲームを作っています。
場に出すカードは予めprefabsによって型をを作成し、gameObject生成時にカードのidを与え、スクリプト(このスクリプトをHandCardScript.csとしています)によって動的に生成していました。
ここで、生成されたgameObjectをタッチした場合、さらに、そのカードの詳細情報を表示するgameObjectを生成しようとしたのですが、MonoBehaviorであるHandCardScript.cs内からResources.Loadを使用して詳細画面用のprefabsをロードしようとしたら、エラーが出てしまいました。

このように、スクリプトから動的に作成したgameObjectから、さらに新たなgameObjectを作成する際、どのようにコードを書いたらいいでしょうか?

//////////////////////////////////////////////
失礼しました、エラーを追記させていただきます
Load is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call it in Awake or Start instead. Called from MonoBehaviour 'HandCardScript'.
See "Script Serialization" page in the Unity Manual for further details.
UnityEngine.Resources:Load(String)
HandCardScript:.ctor()

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

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

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

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

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

buibui80

2016/08/24 05:49

エラーのコードを追加してくださいな。
guest

回答1

0

ベストアンサー

エラーメッセージの通り、コンストラクタの中(もしくはコンストラクタから呼び出されるメソッドの中)でResources.Loadを呼んでいることが問題なのではないでしょうか? AwakeStartといったUnityのライフサイクルの中でメソッドを呼び出せばこのエラーは起きないかと思います。

しかし、そのPrefabを生成するためにResources.Loadを使うことは本当に適切なのでしょうか? スクリプトにパブリックなGameObjectのメンバを作ってそこにPrefabをアタッチすれば、Resources.Loadを使わずにPrefabのGameObjectを得ることができます。こちらも検討してみてはいかがでしょうか?

投稿2016/08/24 07:22

MakeNowJust

総合スコア545

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

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

Kusa1024

2016/08/24 09:47

ありがとうございます。Start内でResources.Loadを呼び出すことで、解決しました。 確かに、もともと、場に存在しないobjectだからとPrefabをアタッチする方法を失念してました。この方法と、Resources.Loadを呼ぶ方法は、どのように使い分ければいいのでしょうか? 質問の趣旨から少し脱線してしまうのですが、よろしければ教えていただけませんか?
MakeNowJust

2016/08/24 13:36

最近のUnity開発ではそもそもResourcesフォルダを使うこと自体があまり推奨されない傾向となっています。 なぜかというとResourcesフォルダに置かれたものはビルド時も実際に使われるかに関わらず実行バイナリに保存されることになり、バイナリの容量増加の原因になりえるからです。(もちろんしっかりと管理すれば問題はないのですが、本来Unityが自動で面倒を見てくれるものを手で管理しなければいけないというのは面倒なものです) そういう意味では、原則としてはResources.Loadは使うべきではないと思います。 もし仮にアセットを動的にロードしたいのであればアセットバンドルを使うことができますが、かなり大規模な開発にならない限りはアセットを動的にロードしなければならないことも無いと思います。 というわけで、個人的には原則として、まずPrefabをアタッチする方法を考えてみて、どうしても上手くいかなそうであればその他の方法を試してみるといいと思います。この辺は経験なので、試行錯誤するしかないです。
Kusa1024

2016/08/25 04:19

詳細な説明ありがとうございます。 android環境での開発の影響からか、なるべく定義などはScriptの中だけで完結させようとする傾向があり、結構Resources.Load多用してしまっているんですよね... 自分のプログラムを見直す良いきっかけとなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問