Inspector의 리스트
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 16번째.
[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에는 개수와 항목별 접기/펼치기 메뉴가 있는 Stops가 표시됩니다. Element 0, Element 1 등 각 항목에는 Point와 Wait가 있습니다. + 버튼은 항목을 추가하고, 빼기 버튼은 선택한 항목을 제거합니다. 행 왼쪽의 핸들을 드래그하면 경로에서 새 위치로 옮길 수 있습니다. 코드는 평소처럼 목록을 읽습니다. stops.Count개의 항목, stops[current].point를 사용하며, (current + 1) % stops.Count는 마지막 정지 지점 다음에 첫 번째 정지 지점으로 돌아갑니다. 레벨 디자이너는 스크립트를 수정하지 않고도 한 경비병에게 정지 지점 세 개를, 다른 경비병에게 열 개를 지정할 수 있습니다.
배열인 public Stop[] stops;도 같은 방식으로 표시됩니다. Unity의 + 버튼은 마지막 항목을 복사하므로 새 정지 지점은 바로 위 항목과 같은 point와 wait로 시작합니다. Unity는 List<List<Stop>>와 같은 목록의 목록이나 Dictionary를 표시하거나 저장하지 않습니다. 대신 내부 목록을 Route처럼 자체 List<Stop>을 가진 [Serializable] 클래스로 감싼 다음, 해당 클래스의 목록을 사용하세요.
챌린지
쉬움Mira와 Tom은 부서진 다리 앞에서 꼼짝 못 하고 있습니다. HUD에 대화 상자를 Dialogue.cs로 작성하세요. 장면에는 box, speakerText, lineText가 연결되어 있고, lines라는 목록에 대화가 준비되어 있습니다.
- Inspector에 표시할 수 있는 공개 문자열 두 개
speaker와text를 가진Line클래스를 선언하고, Dialogue에lines라는 공개List<Line>을 추가하세요. - 시작할 때 상자에 첫 번째 대사가 표시됩니다. 화자는
speakerText에, 대사 내용은lineText에 표시하세요. - 스페이스바를 누를 때마다 다음 대사를 표시하세요. 대화의 대사 수는 제한이 없으므로 목록의 개수를 기준으로 하세요.
- 마지막 대사에서 스페이스바를 누르면 상자를 숨기고
Dialogue over를 로그에 출력하세요. 그 후에는 스페이스바를 눌러도 아무 일도 일어나지 않습니다.
Play를 누르고, 스페이스바를 눌러 대화를 읽은 다음 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: 다음 대사로 넘어가거나 대화를 끝낸다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.