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

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

ただいまの
回答率

89.72%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 521

haru71

score 5

前提・実現したいこと

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/ツールのバージョンなど)

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • sakura_hana

    2019/01/17 11:19

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

    キャンセル

  • haru71

    2019/01/19 11:16

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

    キャンセル

回答 2

checkベストアンサー

+2

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/23 01:28

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

    キャンセル

  • 2019/01/25 10:04

    Unityエディタ上で再生→本来スコアが出ているはずのタイミングで一時停止→Textが付いているはずのオブジェクトを探す→インスペクタをよく見る をお試しください。
    ぱっと思い付くのは「Canvasの子孫オブジェクトになっていない」「Scale値が極端に大きい、または0」「WidthかHeightが0」「カメラの領域外にいる(XYの位置の他、PosZも要確認。近すぎor遠すぎでも映りません)」「フォントサイズが小さすぎor大きすぎ」「フォントがMissingになっている」などでしょうか。
    ヒエラルキーとインスペクタのスクショ撮って別質問とした方がいいかもしれないです。

    チュートリアルに何を求めるかにもよりますが、以下辺りが参考になるかと思います。
    https://ja.stackoverflow.com/questions/1531/unity初心者が取り組むべきチュートリアルを教えてください
    あとはQiitaで「Unity 初心者」で検索して手当たり次第に読んでいくとかですかね(新しい記事を優先させると良いかと)。

    キャンセル

  • 2019/02/02 02:01

    ありがとうございます!色々試して結局テキストをうまく表示させることができました!

    またチュートリアルの件もありがとうございます。

    キャンセル

0

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


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/19 13:04

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

    キャンセル

  • 2019/01/19 13:12

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

    キャンセル

  • 2019/01/23 01:26

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

    キャンセル

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

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

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