오늘은 UI 플로우 차트들을 바탕으로 씬들을 제작한다. 각 씬들을 넘나들 수 있게 미리 주석처리하면서 구현한다.
스테이지는 하나의 씬으로 존재한다. 해당 씬에서 스테이지 매니저가 전달받은 정보를 바탕으로, 씬을 구성한다. 스테이지 선택 화면에서 UI를 클릭 시, 스테이지의 정보를 스테이지 매니저에 넘겨야하는 문제가 있음. curScene의 경우, string으로 저장된다. 이 string을 int 값으로 월드와 스테이지 값으로 넘기는 방법이 필요함.
// 딕셔너리로 모든 씬들을 저장한다.
Dictionary<string,Scene> sceneList;
// Init()으로 프로그램 빌드에 포함된 모든 씬들을 딕셔너리에 넣는 작업 필요함
// 현재 들어온 씬 정보
public string curScene;
// 첫 번째 curScene은 TitleScene이 된다.
void SceneChange(string sceneName)
{
씬 전환 적업이 일어남
들어오는게 스테이지 =
-> 데이터 여기서 들어옴
스테이지의 스크립터블 오브젝트가 필요함
스테이지 저장
stage
s[0] => curScene
int
s[1],[2] => int.parse
curscene =
1-1 => 월드 변수, 스테이지 변수
string 숫자 받아ㅏ오면됨
curScene = sceneName
}
void SceneChange(int worldID, int stageID)
{
s
}
지상의 적을 표시하기 위해, 먼저 base 카메라에서 지상의 적을 표시하는 곳의 Empty object로 된 트랜스폼을 WorldToScreenPoint로 변환한다(또는 WorldToViewportPoint). 그 Vector3값을 기준으로 플레이어 카메라(overlay)에 있는 지상 적의 position을 Translate한다
2D와 같이 따로 레이어를 할 필요없이, 그냥 카메라 가까이 배치하면 해결 된다. 3D 개발환경의 장점이다.
세이브 파일의 책임 문제를 해결해야 한다.
UI 입장에서, 세이브된 내용을 초기에 불러올 필요가 있다. Title Scene UI.
UI로 선택한 세이브 파일을 게임 데이터로 사용해야 한다. 이를 위해 상위 매니저에서 하위 매니저들을 초기화 할 때, 세이브 매니저를 먼저 초기화 한다.
이후 게임매니저를 초기화 하고, 게임매니저에 로드된 게임 세이브 파일들을 배열로 저장한다. 현재 사용하는 세이브 파일의 정보를 저장할 필요가 있다. 이를 int index로 저장한다.
이후, 다른 곳에서 해당 세이브 파일을 참조 할 때는 게임매니저에서 index를 통해 참조하면 된다.
유틸 클래스에 함수를 추가한다
UI에서 이름을 받아올 때, 인덱스를 받을 필요가 있다. 이를 위해 함수를 추가로 구현한다. string을 입력하면, 끝에 있는 숫자를 반환한다.
public static bool ExtractTrailNumber(in string input, out int number)
{
number = -1;
if(string.IsNullOrEmpty(input))
{
Debug.LogWarning("입력이 없습니다");
return false;
}
int i = input.Length - 1;
while (i >= 0 && char.IsDigit(input[i])) i--;
if(i == input.Length - 1)
{
Debug.LogWarning("입력에 숫자가 없습니다");
return false;
}
return int.TryParse(input[(i + 1)..], out number);
}
첫 타이틀 씬에서, 씬을 넘어가기 위해 Press Any Key 안내가 나온다. 여기서 말하는 아무 키는 키보드, 게임패드의 키로 제한한다. Press Any Key UI 부분을 마우스로 클릭하는 것 또한 넘어가는 조건으로 한다.
private OnEnable()
{
InputSystem.onAnyButtonPress.Call(ctrl => OnAnyBtnPress(ctrl));
GetEvent("PressKeyBack").Click += OnAnyBtnClick;
}
private void OnAnyBtnPress(InputControl control)
{
// 버튼에 해당하면서 키보드 또는 게임패드 또는 마우스 왼쪽버튼 입력일 경우
if (control is ButtonControl && (control.device is Keyboard || control.device is Gamepad gamepad))
{
SavePanelPop();
}
}
private void OnAnyBtnClick(PointerEventData eventData)
{
if(eventData.button == PointerEventData.InputButton.Left)
{
SavePanelPop();
}
}