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

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

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

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

Q&A

解決済

2回答

3112閲覧

UnityのPrefabの情報(Score,hp)などの共有

haru71

総合スコア11

C#

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

0グッド

0クリップ

投稿2019/01/16 19:07

編集2019/01/19 03:30

前提・実現したいこと

Prefab化したTextのInstantiateは可能なのか?(初心者の質問です)

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
UnityのC#でマリオのようなゲームを作っています。

キャラクターがフラワーを取ったりスターを取ったりする際にプレイヤー本体を壊した後にResourceファイルのなかのPrefabsファイルから新しいキャラクターのプレファブを呼び出す。ということを行なっています。

そのためPrefabのInspectorにPrefab化したTextを入れているという状況です。実際にScoreの記録はうまくいっています。

そこでProgectのPrefabに記録されているTextのPrefabのScoreをGame上に表示しようと思った。というところまでが前提となっています。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ScoreScript : MonoBehaviour {
//このスコアオブジェクトの欄にPrefab化したTextを入れています。
public static GameObject score_object = null;
//スコアです。
public static int score_num = 0;

// Use this for initialization void Start () { } // Update is called once per frame void Update () { Text score_text = score_object.GetComponent<Text>(); score_text.text = "Score:" + score_num; } private void OnTriggerEnter2D(Collider2D collision) {//ここから下はそれぞれのスコア加算量であり本題には関わりがないと思われるので割愛させていただきます。

スコアのスクリプトは上のようになっています。スコア自体の加算はうまくいっておりこのスクリプトに問題はないと自分では考えています。
そのあと。
PrefabになっているTextにしっかりとスコアは加算されているのでそれをGame上に表示したい。と考えたので
GameObject obj = (GameObject)Resources.Load("ScoreText");
GameObject instance = (GameObject)Instantiate
(obj,new Vector3(0.0f, 0.0f, 0.0f),uaternion.identity);
このようなスクリプトを空きのGameObjectにつけています。
その時にエラーが発生してしまいまして、結局一日粘ったのですがこれが解決できずに。。。ということで質問させていただく次第です。

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

The object you want to instantiate is null.

該当のソースコード

c#
ソースコード
GameObject instance = (GameObject)Instantiate(obj,
new Vector3(0.0f, 0.0f, 0.0f),
Quaternion.identity);

試したこと

とりあえず他の自分が知ってるPrefabのInstance化をしてみました。うまくいきませんでした。。。
自分で言うのもなんですが知識が貧弱なものでウェブサイトを漁りまくってみましたが自分の状況を打破できるものがヒットしませんでした

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

sakura_hana

2019/01/17 02:19

ソースコードを記載してください。(エラーメッセージ等、質問テンプレートを埋めてください) 今の質問では「リセットするスクリプトになっているから」「値をゲームシーンに反映させるスクリプトになっていないから」などとしか回答出来ません。
haru71

2019/01/19 02:16

なるほど、今から書き直します。 このサイト自体使うのが初めてなものですみません。。。
guest

回答2

0

ベストアンサー

Text score_text = score_object.GetComponent<Text>();
このコードは「プレハブのTextコンポーネントを取得」です。
score_text.text = "Score:" + score_num;
このコードは「プレハブのTextコンポーネントの表記を書き換え」です。

Instantiateは「プレハブを元にシーン上にオブジェクトを生成」です。
つまり**「プレハブと生成されたオブジェクトは別のオブジェクト(当然Textコンポーネントも別々)」**ということになります。

多分生成された時点では正しく表記されているでしょうが、
その後生成されたオブジェクトに対し何もしていないなら、テキストが書き換わることはありません。
(なぜなら生成する前の物を書き換えているから)

なので雑に直すなら
GameObject instanceをクラス変数にする
Text score_text = instance.GetComponent<Text>();に変更
instance = (GameObject)Instantiate〜に変更
で一応スコアの描画自体はされると思います。

(エラーの直接の原因はfiveHundredさんも挙げている通り「ScoreTextという名前のGameObjectがResourcesフォルダに無い」だと思います。名前は完全一致する必要があります。大文字小文字・スペース・アンダースコアなど間違っていないか確認してみてください)

(余談ですがUpdate内でのGetComponentは遅いのでこれもクラス変数にする、Updateではなくスコアが切り替わった時にだけ書き換えの処理を実行すると負荷軽減になります)


それはそれとして、プレイヤーが削除・生成されるからといって、スコア表記用Textも再生成する必要性があまり感じられません。
もっと言えばプレイヤーがアイテムが取った時の変化でプレイヤーを再生成する必要があるのか?とも思います。やるとしてもプレイヤーオブジェクトは現存させ続け、その子オブジェクトの画像や3Dモデルを再生成させる程度にした方が不慮のバグが起き辛いのではと思います。
(オブジェクトの破棄と作成はそこそこ重い処理ですし、プレイヤーが再生成された瞬間の衝突判定が狂いそうな気がします)

他のチュートリアル等ではどうやっているか色々見てみると良いと思います。

投稿2019/01/19 07:00

sakura_hana

総合スコア11427

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

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

haru71

2019/01/22 16:28

大変ためになる回答ありがとうございます。 返信遅くなってすみません。Wifiの影響等がありまして… プログラミングを組んでみてエラーなどは表示されなくなったのですが、テキストが未だ出でこなくて。。。 大きさや場所など変えてみたりしたのですがいまいち原因がわからず。。。 何はともあれとても参考になる回答ありがとうございます。 もう一つお伺いしたいのですが、何かおすすめのチュートリアルなどありますか?(日本語か英語でお願いします)
sakura_hana

2019/01/25 01:04

Unityエディタ上で再生→本来スコアが出ているはずのタイミングで一時停止→Textが付いているはずのオブジェクトを探す→インスペクタをよく見る をお試しください。 ぱっと思い付くのは「Canvasの子孫オブジェクトになっていない」「Scale値が極端に大きい、または0」「WidthかHeightが0」「カメラの領域外にいる(XYの位置の他、PosZも要確認。近すぎor遠すぎでも映りません)」「フォントサイズが小さすぎor大きすぎ」「フォントがMissingになっている」などでしょうか。 ヒエラルキーとインスペクタのスクショ撮って別質問とした方がいいかもしれないです。 チュートリアルに何を求めるかにもよりますが、以下辺りが参考になるかと思います。 https://ja.stackoverflow.com/questions/1531/unity初心者が取り組むべきチュートリアルを教えてください あとはQiitaで「Unity 初心者」で検索して手当たり次第に読んでいくとかですかね(新しい記事を優先させると良いかと)。
haru71

2019/02/01 17:01

ありがとうございます!色々試して結局テキストをうまく表示させることができました! またチュートリアルの件もありがとうございます。
guest

0

Resourcesディレクトリ内に「ScoreText.prefab」が存在するか確認してください。


ただ、わざわざPrefabにスコアを入れる意味がよく分かりませんでした。
私だったら、スコアを表示するTextを事前に生成するかシーン上に配置しておいて、そのTextの内容を変更するような形を取りますが、どうでしょうか?

投稿2019/01/19 03:59

fiveHundred

総合スコア9796

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

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

haru71

2019/01/19 04:04

回答ありがとうございます! 自分もスコアを表示するTextを事前に配置し内容を変更する方法を取っていたのですが、PrefabをInstance化すると言う方法でキャラクターの変更を行っていてその際にHpやScoreは引き継ぎたいのですがPrefabのInspectorのScriptの欄(説明下手ですみません)にScene上のオブジェクトは入れられないからうまくいかない。と思って最初に書いたように変えようとしたのですがそれもうまくいかず。。。と言うところです。
fiveHundred

2019/01/19 04:12

間違っていたらすいませんが、HpやScoreも主人公に管理させているということでしょうか? もしそうであれば、HpやScoreは別のゲームオブジェクトで管理するほうが楽だと思います。
haru71

2019/01/22 16:26

ですよね。。。 あとあと考えればそのほうが絶対楽ですよね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問