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> を持たせて、そのクラスのリストを作成します。
チャレンジ
簡単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: 次のセリフに進むか、会話を終了する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。