이 글은 궁 미로 PalaceMaze 시리즈의 3번째 기록입니다. (총 4개)

오늘 한 일

  • 상자와 매니저의 역할을 다시 나눴다. 상자가 스스로 열고 이벤트 디스패처로 알리면, 매니저가 섞어둔 배열에서 위에서부터 보상을 꺼낸다.
상자     판에 올라오면 입력 켜기 → E → 열림 알림 → 자기 눌러서 표시
매니저   시작할 때 보상 섞고 모든 상자에 바인드
         알림이 오면 Rewards[Cursor]를 꺼내 적용하고 Cursor를 하나 올린다
  • 어느 상자인지 알 필요가 없다는 것을 알고 나서 구조가 크게 줄었다. 배열이 이미 섞여 있으니 순서대로 꺼내면 그게 무작위 배정이다. 인덱스를 찾던 코드도, 거리를 재던 코드도 사라졌다.
  • 입력을 켜는 시점을 옮겨서 위치 판정도 없앴다. 판 안에 있는 동안만 입력을 켜니, E를 눌러도 그 상자만 반응한다.
  • 제한시간과 게임오버를 넣었다. 기본 180초에 상자에서 얻거나 잃은 시간을 더한다. 시간이 다 되거나 생명이 0이 되면 끝난다.
  • 출구를 만들었다. 조각 다섯 개를 모았으면 클리어와 기록이 뜨고, 부족하면 부족하다고 알린다.
  • 매니저 그래프를 정리했다. 죽은 이벤트와 딸린 노드를 지워 148개에서 71개로 줄였다.
  • 궁 에셋을 임포트했다. 돈화문, 함화당, 낙선재를 합쳐 메시가 2천 개 넘게 들어왔다.

막힌 부분

  • SpeedBonus를 적용할 방법이 없다.
    • 이동속도는 캐릭터 무브먼트의 네이티브 변수라 다른 블루프린트에서 못 건드린다. 캐릭터 블루프린트에서 직접 하거나 변수를 빼야 한다.

상자를 열어도 보상이 나오지 않았다

그래프는 멀쩡해 보이는데 아무 일도 안 일어났다. 되읽어 보니 바인딩이 엉뚱한 데로 가 있었다.

지정한 이름  (AddEvent|Custom|OnChestOpened)
실제 생성     (AddEvent|Custom|Opened_Event_0)

DSL이 델리게이트를 물릴 때 지정한 이름을 무시하고 매번 빈 이벤트를 새로 만든다. 그래서 로직을 넣어 둔 이벤트는 아무도 부르지 않았다. 쌓여 있던 정체불명의 빈 이벤트들이 그 흔적이었다.

  • 해결: 먼저 바인딩만 쓰고, 되읽어서 생성된 이름을 확인한 뒤 그 이름으로 본문을 썼다.
  • 남은 한계: 쓸 때마다 빈 이벤트가 하나씩 는다. 주기적으로 치워야 한다.

첫 상자가 두 번째 보상을 줬다

커서로 배열을 읽고 나서 커서를 올리도록 썼는데, 컴파일된 결과는 반대였다.

(SetCursor (+ Cursor 1))
(switch (Get Rewards Cursor) ...)

bind로 값을 묶어둬도 소용없었다. 순수 노드는 필요할 때 값을 당겨오기 때문에, 실제 읽기가 스위치 시점에 일어난다. 그때는 이미 커서가 올라가 있다.

  • 해결: 값을 변수에 먼저 담았다. 변수 설정은 실행 순서를 타는 노드라 순서가 보장된다.
  • 배운 것: bind는 이름을 붙이는 것이지 그 시점에 계산하라는 뜻이 아니다.

상자 스물다섯 개 중 두 개만 E를 받았다

프롬프트는 뜨는데 E가 안 먹었다. 로그를 액터별로 세어보니 원인이 보였다.

입력 활성화된 상자   25개
TryOpen 발동한 상자   2개
서 있던 상자          0회

키 입력 노드의 bConsumeInput이 기본으로 켜져 있다. 입력 스택 맨 위 액터가 키를 삼켜서 나머지는 받지 못한다.

  • 해결: 처음에는 이 값을 꺼서 전부 받게 했다. 그런데 그러면 스물다섯 개가 다 반응하니 누가 대상인지 다시 골라야 한다.
  • 더 나은 해결: 판에 올라온 동안만 입력을 켜기로 했다. 그러면 대상이 하나뿐이라 고를 일이 없다.

죽은 노드 정리 조건이 E 노드까지 지웠다

죽은 노드를 치울 때 입력 노드를 뿌리로 인정하는 조건이 이렇게 짜여 있었다.

"InputKey" in type_id

실제 타입은 Input|KeyboardEvents|E다. InputKey는 내부 클래스 이름이지 타입 ID가 아니다. 그래서 E 노드가 고아로 판정돼 지워졌고 개봉이 멈췄다.

  • 해결: 다시 만들어 연결했다.
  • 배운 것: 이름은 짐작하지 말고 확인하고 쓴다. 노드 제목을 짐작해 검색하면 있는 노드도 0개로 나온다.

궁 에셋으로 담장을 갈아끼우지 못했다

메시가 2천 개나 들어왔는데 쓸 수 있는 담장이 없었다. 이름 대신 비율로 찾아 후보를 골랐다.

SM_Wall04A   246 × 12 × 288

담장 90개를 이 판 330장으로 교체했더니 대부분이 텍스처 없는 흰 판으로 나왔다. Wall 폴더는 전각 내벽 부재였다. 게다가 궁 담장은 기단과 벽체와 기와 세 겹인데 벽체 한 겹만 세운 셈이라 담장으로 보이지도 않았다.

  • 해결: 되돌렸다. 큐브를 지우지 않고 숨겨둬서 복구가 간단했다. 교체 전에 커밋도 해뒀다.
  • 남은 것: 에셋이 전부 부재 단위다. 담장 세트나 전각을 사람이 한 번 조립해 블루프린트로 묶어야 배치를 스크립트에 맡길 수 있다.

다음에 할 일

  • 궁 에셋 조립. 담장 세트나 전각 하나를 블루프린트로 묶으면 그다음 배치는 스크립트가 맡는다.
  • 마패조각 퍼즐. 조각을 다 모으면 방향을 돌려 끼우는 미니게임을 만든다.
  • SpeedBonus 적용 여부 결정. 캐릭터 블루프린트에서 직접 하거나 변수를 뺀다.
  • 열린 상자 비주얼 교체. 지금은 스케일로 눌러 표시하고 있다.
  • 마당별 오브제 배치. 마당이 전부 똑같이 생겨서 길을 외우기 어렵다.
  • 매니저의 빈 커스텀 이벤트 정리.
  • 제한시간 180초가 적당한지 실제로 돌아보고 조정한다.
  • 기와 마감. 담장 위 이동이 문제가 되면 경사진 기와를 올려 막는다.
  • 상자가 시작 지점과 겹치지 않도록 배치할 때 시작 주변을 비운다.

Series: 궁 미로 PalaceMaze


Suggested Posts