どうもなおゆです。
なぜ今更こんな超初歩的な部分の記事を書くのか?
久々にText周りのコードを書いてみたら、非常に混乱しました。なぜかというとGoogle検索でヒットする情報は様々なパターンが混在しており、GetComponent等の基礎知識が曖昧な私はさらに混乱したからです。そんなわけで未来の自分のために図解で解説を残しておきます。
TextをScriptから変更する場合GetComponentは必要なのか?を図解で説明
用意したオブジェクト
- 「ヒエラルキー → 空のオブジェクトを作成」で名前を「A_ScoreManager」に変更 。これがゲームの得点を管理するオブジェクトです。
- 「ヒエラルキー → UI → テキスト」で 名前を「B_Text」に変更。ここに得点を表示します。
- 「プロジェクト → Assets」で右クリック「作成 → C#スクリプト」名前を適当に変更
なお、それぞれ名前の頭にABが付いているのは説明用に分かりやすくしただけです。
Textを変更する2パターンを紹介
- GetComponentでtextを取得する方法( A_ScoreManagerにScriptアタッチ)
- GetComponentを使わない方法 ( A_ScoreManagerにScriptアタッチ)
GetComponentでtextを取得してTextを変更
それぞれの位置関係は↓のような感じです。
コードは↓のような感じです。よくあるのがUnityEngine.UIをつけ忘れてUnityに怒られることですね。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // <--忘れがち
public class Script : MonoBehaviour
{
private Text C_text;
private int score = 100;
void Start()
{
this.C_text = GameObject.Find("B_Text").GetComponent<Text>(); // textコンポーネントを取得
C_text.text = score.ToString() +" 点"; // int型をstring型に変換
}
}
コードを簡単に説明すると、FindでB_Textオブジェクトを見つけGetComponentでそのtextを取得し「そこに得点を表示するんだよ」と指示をだしています。 これでスクリプトから動的に変更ができます。
これで正常に得点が表示されました。
GetComponentを使わないでTextを変更
パターン1では「ここに点数を表示したい」という場所をGetComponentを使って取得し、B_Textを変更しました。でもUnityには便利な機能があり、publicな変数を宣言してあげればインスペクター操作でコンポーネントまで取得できます。
関係図はパターン1と同じです。
↓のようにText型の変数C_textをpublicにします。GetComponentの部分は不要ですので削除してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // <--忘れがち
public class Script : MonoBehaviour
{
public Text C_text; // <--ここを変更
private int score = 100;
void Start()
{
C_text.text = score.ToString() +" 点"; // int型をstring型に変換
}
}
インスペクターのC_textにオブジェクトを追加しましょう。
Unityの画面でいうと↓の画像です。A_ScoreManagerのインスペクター画面を開くと「なし(テキスト)」となっていますので、そこにB_Textをドラッグアンドドロップしてください。
こうすることでUnityに「このコンポーネントのtextに表示するんだよ」という事が伝わりますので、GetComponentを使わなくてもTextを変更できます。これも正常に表示されました。
もしここが違うとか、こうした方が良いなどありましたら教えてください。
コメント