Menu
CoddyTech

Inspectorでのリスト

CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 19/64。

[System.Serializable]エントリのリストは、Inspectorで入力するテーブルです。このガードは停止地点をたどり、各地点のエントリに次のように指定されている間、そこで待機します。

[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;
        }
    }
}

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

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

challenge icon

チャレンジ

簡単

ミラとトムの会話を、1行ずつ表示しましょう。

  1. [System.Serializable]属性を持つLineクラスを宣言し、speakerとtextというpublicな文字列フィールドを作成して、public List<Line> lines;を追加します。
  2. 開始時にlines[0]を表示します。話者をspeakerTextに、本文をlineTextに表示します。
  3. Spaceキーを押すと次の行を表示し、lines.Countまで進みます。最後の行の後はboxを非表示にし、Dialogue overをログに出力します。その後はSpaceキーを押しても何も起こりません。

「プレイ」を押して、Spaceキーで読み進めましょう。その後、「確認」を押します。

自分で試してみよう

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;

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

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

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

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

自分で練習してみよう: Unityプレイグラウンド