スコアを表示する
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 2/56。
テキストのtextは文字列なので、数値は表示する前にテキストにする必要があります。+で文字列に連結すると変換できます。"Wood: " + woodは、woodが12のときWood: 12になり、wood.ToString()は12になります。int単体では代入できません。woodText.text = wood;はCS0029、Cannot implicitly convert type 'int' to 'string'. というエラーになります。
数値はintフィールドに保持し、テキストはその値を表示するだけです。フィールドの値からテキストを書き換えるメソッドを1つ用意し、数値が変わるたびに呼び出します。また、Start()からも呼び出すことで、最初のフレームにInspectorで入力した値ではなく実際の値が表示されます。ここではSpaceキーを押すと、ログを3つ切ります。
public TMP_Text woodText;
private int wood;
void Start()
{
ShowWood();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
wood += 3;
ShowWood();
}
}
void ShowWood()
{
woodText.text = "Wood: " + wood;
}テキストが変わるのはwoodが変わったときだけです。毎回のUpdate()で書き換えても見た目は同じですが、必要もないのに1秒間に60回、新しい文字列を作ることになります。順序が重要です。wood += 3より前にShowWood()を呼び出すと、古い数が表示され、1回分遅れます。
チャレンジ
簡単庭師は木を植えます。矢印キーで庭師を動かし、種が残っている間は Space キーで苗木を植えます。これはすでに Gardener.cs が行っています。画面に数を表示しましょう。シーンでは seedsText と treesText が設定されています。
seedsTextには残りの種をSeeds: 4のように表示し、treesTextには植えた木をTrees: 1のように表示します。- どちらの表示も、最初のフレームから、また植えるたびに正しい値になります。Inspector では庭師に種を 5 個設定していますが、シーン内のテキストはまだ
Seeds: 10とTrees: ?のままです。 - 両方のテキストを設定するメソッドを 1 つ作り、必要な箇所から呼び出します。
Play を押して、種がなくなるまで植えてから、Check を押します。
自分で試してみよう
using UnityEngine;
using TMPro;
public class Gardener : MonoBehaviour
{
public float speed = 4f;
public int seeds = 10;
public GameObject saplingPrefab;
public TMP_Text seedsText;
public TMP_Text treesText;
private int trees;
void Update()
{
float move = Input.GetAxisRaw("Horizontal");
transform.Translate(move * speed * Time.deltaTime, 0f, 0f);
if (Input.GetKeyDown(KeyCode.Space) && seeds > 0)
{
Vector3 spot = new Vector3(transform.position.x, 0.5f, 1.5f);
Instantiate(saplingPrefab, spot, Quaternion.identity);
seeds--;
trees++;
}
}
// 最初のフレームから、2つのテキストにそれぞれ Seeds: と Trees: を表示する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。