250604

凡愚·2025년 6월 4일

개발 일지

목록 보기
192/350

✅ What I did today


  • LD Challenge : L001 : Day 6


🎯 LD Challenge : L001 : Day 6


계획

노드 조건을 지정하려고 했더니 enum으로 관리해야했다.
delegate를 넣으면 유연성이 떨어지고,
scriptable object를 넣으면 ide에서 편집 못 함.
별도 클래스 만들어서 GameState에서 enum을 키로하는 딕셔너리로 관리.

직렬화한 클래스 안에
Condition이라는 자료형의 배열이 있고
Condition은 조건 enum과 비교문 enum (같다, 다르다, 크다, 작다) 과 값 (float) 이 있다.
(string같은 걸로도 비교하려면 string용 TextEdge를 따로 만들고 Condition도 따로 선언한 후 인터페이스로 묶으면 될듯)
게임 로직에서 이를 읽을 때 조건 enum은 딕셔너리에서 해당되는 키를 가져오고, 비교문 enum은 switch문을 통해 해당되는 조건문을 연산한다.
condition 배열에 들어있는 모든 조건이 true라면 해당 노드로 간다.

condVar를 편집했을 경우를 대비하여 condVar enum은 enum 그대로가 아닌 string으로의 변환을 한 후 dictionary에 넣는다. 하지만 만약 enum 중간에 조건을 추가하면 기존에 있던 것들이 뒤로 밀린다.
(테스트용 enum을 만든뒤에 실험해보니 a,b,c 만들고 b를 삭제했을 때 기존 b로 설정돼있던 조건이 c로 변경됨. 앞에 하나를 더 만들면 선지가 앞으로 한 칸씩 밀림)

enum을 그대로 쓰려면 순서를 명시화하고, 추가할 때 기존 값이 아니라 반드시 새로 추가한 다음, 딕셔너리에 로드돼있는 데이터들을 변경하는 메서드도 만들어서 호출하는 버튼을 만들어야 하는데, 현실적이지 않다.

근데 다른 자료형을 쓴다고 하더라도 결국 이름 변경을 했을 때 Condition에 있는 값들은 따로 처리해야 함. 차라리 동적으로 저장해야 함. enum 대신 string으로 조건 이름을 관리하고, 저장할 때 field name에 해당되는 field가 GameState에 있는지 검증하는 방어 로직을 하나 넣는게 나을듯.

string에 조건 이름 매번 넣어야 하면 귀찮기도 하거니와 이름 변경도 일일이 수동으로 해줘야 하므로 현실적이지 못함. 조금 복잡해지긴 하겠지만, 드롭다운용 문자열을 별도로 관리하고, 노드에서 condition을 지정할 땐 드롭다운에서 동적으로 지정한 후, 향후 문자열을 동적으로 편집하면 모든 노드를 순회하며 이전 문자열을 포함하고 있던 condition들을 변경해줘야 함.

드롭다운에서 필드 이름 문자열을 동적으로 지정했을 때 파일에 실제로 문자열을 지정하는게 나음. 문자열 enum 이런거 지정하면 또 그거 관리를 해줘야 해서 복잡성도 올라가고, 혹시라도 파일을 열어봤을 때 명시성이 떨어짐. 문자열로 저장한다고 해서 어마어마하게 용량이 증가하지도 않을 것.

계획 정리

노드의 Condition에 저장한 string에 있던 필드 이름으로 GameState에 있는 필드의 값을 reflection을 통해 가져온다.
(GameState에 있는 필드 이외의 값을 가져오려면 유연성은 조금 떨어지겠지만 property를 사용하던가 하면 될듯.)

비교문은 enum switch문으로 해당되는 연산을 지정한다.

condition 배열에 들어있는 모든 조건이 true라면 해당 노드로 간다.

DropDown용 필드 이름 문자열은 파일을 불러오면서 노드를 전부 순회할 때 Editor Script의 List<string>으로 저장한다.
만약 List에 있던 문자열을 변경한다면 모든 노드를 순회하면서 이전 문자열을 갖고 있던 노드들을 수정한다.
노드들을 저장할 때 List<string>을 한 번 순회하며 GameState에 해당되는 field가 있는지 확인하고, 없다면 경고를 띄운다.

번역은 dictionary를 선언한 뒤 필드 이름과 비슷하게 드롭다운으로 관리.
파일을 불러올 때 언어 이름들을 갖고오고, 런타임에 추가할 수도 있다.
저장할 때는 딕셔너리에 해당되는 키를 이용하여 저장한다.
저장할 때 특정 언어에 빈 노드가 있으면 경고를 띄운다.

Troubleshooting

flex-grow 지정했는데 다른 요소 무시하고 전체 길이 차지해버림

  • 부모 요소에 display: flex, flex-direction: row; 지정
  • 무시당한 요소에서 position: absolute; 삭제

border의 alpha는 기본 0이라서 두께 지정해도 바로 안 보임.

Editor Window로 만든 창 우측 상단 점 세 개 누르면 UI Toolkit Debugger로 Hierarchy 등 정보 확인 가능

0개의 댓글