Menu
CoddyTech

Inspectorでのリスト

CoddyのUnityジャーニー「Unityにおけるゲームアーキテクチャ」セクションの一部。レッスン 16/50。

[System.Serializable] エントリーのリストは、インスペクターで値を入力するテーブルです。このガードは停止地点のルートをたどり、各地点でエントリーに指定された時間だけ待機します。

[System.Serializable]
public class Stop
{
    public Transform point;
    public float wait = 1f;
}

public class Patrol : MonoBehaviour
{
    public float speed = 3f;
    public List<Stop> stops;
    private int current;
    private float waited;

    void Update()
    {
        Stop stop = stops[current];
        transform.position = Vector3.MoveTowards(transform.position, stop.point.position, speed * Time.deltaTime);
        if (transform.position != stop.point.position) return;
        waited += Time.deltaTime;
        if (waited >= stop.wait)
        {
            waited = 0f;
            current = (current + 1) % stops.Count;
        }
    }
}

インスペクターには、件数とエントリーごとの折りたたみ項目(Element 0、Element 1 など)とともに、Stops が表示されます。それぞれに Point と Wait があります。+ ボタンでエントリーを追加し、マイナスボタンで選択中のエントリーを削除できます。また、行の左にあるハンドルをドラッグすると、ルート上の新しい位置に移動できます。コードでは通常どおりリストを読み取ります。stops.Count 件のエントリーがあり、stops[current].point で現在の地点を参照し、(current + 1) % stops.Count によって最後の停止地点の次に最初の停止地点へ戻ります。レベルデザイナーはスクリプトに手を加えずに、あるガードには3つ、別のガードには10個の停止地点を設定できます。

配列 public Stop[] stops; も同じように表示されます。Unity の + ボタンは最後のエントリーをコピーするため、新しい停止地点には、直前のエントリーと同じ地点と待機時間が設定されます。Unity は、List<List<Stop>> のようなリストのリストや Dictionary を表示または保存しません。代わりに、Route のような [Serializable] クラスで内側のリストをラップし、そのクラスに独自の List<Stop> を持たせて、そのクラスのリストを作成します。

challenge icon

チャレンジ

簡単

Mira と Tom は壊れた橋の前で立ち往生しています。HUD にダイアログボックスを作成するため、Dialogue.cs にコードを書きましょう。シーンでは box、speakerText、lineText がリンクされており、lines という名前のリストに会話が用意されています。

  • Inspector に表示できるよう、speaker と text という2つの public な文字列を持つクラス Line を宣言し、Dialogue に lines という名前の public な List<Line> を追加します。
  • 開始時にボックスには最初の行を表示します。話者は speakerText に、テキストは lineText に表示します。
  • Space キーを押すたびに次の行を表示します。会話の行数は任意なので、リストの件数を使います。
  • 最後の行で Space キーを押すとボックスを非表示にし、Dialogue over をログに出力します。その後は Space キーを押しても何も起きません。

Play を押し、Space キーで会話を読み進めてから、Check を押します。

自分で試してみよう

using UnityEngine;
using TMPro;

public class Dialogue : MonoBehaviour
{
    public GameObject box;
    public TMP_Text speakerText;
    public TMP_Text lineText;

    void Start()
    {
        // 最初のセリフを表示する
    }

    void Update()
    {
        // Space: 次のセリフに進むか、会話を終了する
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityにおけるゲームアーキテクチャのすべてのレッスン