#20221124 :: 월드터미널 상상도, 싱글톤 배우기
#20221125 :: 매니저와 데이터관리법 시행착오
#20221127 :: 터미널데이터 시행착오
#20221128 :: 노드데이터 관리법 상상
#20221124 :: 월드터미널 상상도, 싱글톤 배우기
월드 터미널


월드 터미널
스테이지 선택과 요리시스템을 어떻게 만들까 고민하다가 노드 그래프를 활용한 아이디어를 떠올림.

수정하고 싶은 사항
터미널 뒷 배경은 + 모양 패턴의 반복이 아니라
고양이 얼굴 아이콘(외곽선만) 패턴으로 바꾸는 것도 좋을 듯
넣을 요소
마우스 왼 클릭 : 스테이지 선택(상세 설명 보기), 재료, 도구 위치 옮기기, 노드 드래그
마우스 오른 클릭 : 터미널 이동(둘러보기)
재료, 도구 : 마우스 왼 클릭으로 드래그해서 위치를 옮길 수 있음
보조, 스테이지 : 위치 옮기기 불가능, 터미널의 최좌 측에 기본 위치
싱글톤
게임매니저(싱글톤) :
- 현재 진행상태 월드상태, 내가 깬 레벨, 얻은 재료, 걸린 시간, 세이브 -> 스프레드시트로 데이터베이스화 및 암호화
- 현재 재생 중 월드상태, 터미널상태 → 터미널에서 조작한 노드들 위치 그대로 저장
- 설정 상태
타이틀매니저 : 타이틀 ~ 애니메이션 관리
TitleScene
월드(들) 매니저 : 현재월드, 열어야 하는 터미널 관리
월드 터미널 총 6개 중 1개만 SetActive (오브젝트 풀링)
WorldSelectScene
레벨(들) 매니저 : 현재씬에서 열어야 하는 레벨 관리
수십 개의 레벨들 중 1개만 SetActive
World1Scene~World6Scene
#20221125 :: 매니저와 데이터관리법 시행착오
세이브는 언제?
- 레벨클리어시 levelManager에서 dataManager.save
- 월드 터미널에서
오브젝트를 들고 '놓았을 때'(위치변경)
노드를 연결했을 때
노드 연결을 해제했을 때 worldManager에서 dataManager.save - 월드 이동했을 때 worldManager 에서 dataManager.save
월드 레벨 데이터
<월드1<레벨1<클리어 상태(Y/N), 소요 턴, 소요시간>, 레벨2<…>, 레벨3<…>, …>
<월드2<레벨1<클리어 상태(Y/N), 소요 턴, 소요시간>, 레벨2<…>, 레벨3<…>, …>
Dictionary<월드(int), 레벨데이터(클래스)들[]>
매니저 하이어라키
/*** ManagerClass들은 전부 싱글톤임 ***/
/*GameDataClass*/
var worldLevelStatus = new Dictionary<int, new LevelData[10]>();
void save(){};
/*GameManagerClass*/
public Data data1 = new Data(); // 데이터들은 전부 DB상에 존재(파일입출력), 만약 없다면 new 로 생성
public Data data2 = new Data();
public Data data3 = new Data();
Data CurrentData(){
// 내가 선택한 데이터 슬롯 ex) data = data1
return data;
}
/*DataManagerClass*/
Data data = GameManager.Instance.CurrentData(); // 세 데이터중 하나 고름
Save(){
data.save();
}
/*TerminalManagerClass*/
/*WorldLevelManagerClass*/
public int currentWorld;
public int currentLevel;
public LevelData[] worldStatus;
this.worldStatus = DataManager.Instance.data.worldLevelStatus(currentWorld);
worldStatus[currentLevel].Set("Y", 10, 021454); // 레벨 상태 저장
//만약 갱신을 안해도 월드매니저에 적용되면 얕은복사라서 그럼.
//WorldManager.Instance.worldLevelStatus(currentWorld) = this.worldStatus; --> 갱신코드
/*LevelDataClass*/
public string clear = "N";
public int turn = 0;
public int time = 000000;
void Set(string c, int t, int time){
clear = c;
if(turn > t)
turn = t;
if(this.time > time)
this.time = time;
}

결과 : 얕은 복사라서 GameData 객체는 다 같이 공유.
월드레벨매니저에서 GameData 변경했더니 다같이 변경됨.
정리
게임매니저에서 어떤 세이브데이터를 사용할지 결정
ㄴ데이터매니저에서 데이터의 저장을 결정
ㄴ월드레벨매니저에서 데이터 속 레벨 클리어 상태를 결정

결국 노란색 GD는 모든 매니저가 공유하게 된다! (매니저 한 명이 바꾸면 다 바뀐다!)
아 근데 터미널 안에서 위치 조정을 어떻게 데이터화해서 저장하지
<작업진행순서>
1. 노드구현 먼저 하고
2. 세이브 구현하자
매니저구조
- 게임매니저 : 세 가지 GD 중 1개 고르기(나머지 GD는 null로 할당 풀기) → 시작버튼 누르면 나머지 매니저 생성
- 데이터매니저 : GD를 BD로 전송
- 월드레벨매니저 : GD속 LD 갱신, 월드 상태 worldLevelStatus
- 터미널매니저 : GD속 TD 갱신, 노드 연결상태 worldTerminalStatus
- 게임데이터 : 레벨데이터, 터미널데이터
- 레벨데이터 : 클리어상태, 소요 턴 수, 소요시간
- 터미널데이터 : 터미널 속 모든 오브젝트의 트랜스폼 위치정보
- 터미널 노드 : 노드리스트로 구현한 그래프?
/* GameDataClass */
var worldTerminalStatus = Dictionary<int, TerminalData[]>();
/* TerminalDataClass */ // 터미널에 존재하는 오브젝트의 데이터 ~> 인터페이스로 구현해야 할지도
// 스테이지, 도구, 재료, 월드해금장치 등등..
// 비슷한 기능 있으면서 다른 기능도있는 클래스가 많음;;
public Vector3 pos; // 위치정보
public List<TerminalData> linkNode; // 연결된 노드정보
void link(TerminalData node){
this.linkNode.Add(node);
}
void Remove(TerminalData node){
this.linkNode.Remove(node);
}
/* TerminalManagerClass */
var worldTerminalStatus = GameManager.Instance.CurrentData().worldTerminalStatus;
#20221127 :: 터미널데이터 시행착오
필요한 요소
- body position
오른쪽 마우스 클릭으로 터미널 화면을 이동할 거라서 필요함 - 스테이지 노드 정보
- 재료 노드 정보
- 도구 노드 정보
- 상점 노드 정보
- 월드 노드 정보
터미널 데이터를 List로 받자
Start 했을 때(SetActive)될 때 add를 하는 거 아니면 Set(집합) 사용?
List말고 배열을 쓴 이유
- List로 하면 언제 new할지 판단을 못하겠어서
- add 할 때마다 중복체크하기 불편, 비효율적
⇒ 그래서 걍 처음부터 배열에 넣기로 하자. 방은 정해져 있고 안의 데이터만 추가하자.
인풋과 아웃풋으로 분리?
터미널데이터 - 노드 관리법
스크립트 목록
- TerminalData : 나중에 어떤 걸 저장할지 판단의 기준
- TerminalManager : 어떤 터미널을 열지에 대한 기준, 지금 left마우스 클릭되어 있는 노드를 판단
- Node : 추상클래스, 인덱스로 TerminalData의 해당 노드(this)에 접근
- BackGround : right마우스클릭으로 이동할 때 바뀌는 위치값→TerminalData [0](항상 인덱스 0으로 고정)의 오리진
- StageNode : 스테이지에 관한 정보, 위치값, 위치수정 → TerminalData[인덱스]의 오리진
- NodeInput : 노드의 입력부 :: 입력→출력 : 연결된 노드를 해제, 오리진의 TerminalData에 반영
- NodeOutput : 노드의 출력부 :: 출력→입력 : 노드를 연결, 오리진의 TerminalData에 반영
정리
터미널 데이터의 오리진노드(Node)와 그 위치(Position)는 해당 인덱스를 가진 Node에서 관리
터미널 데이터의 연결(Link)과 삭제(Remove)는 NodeInput과 NodeOutput에서 관리
해결과제
- StageNode의 Start에서 중복으로 일어나는 node 할당
→ 이걸 막아야 됨. 왜? 기껏 위치정보 저장했는데 다시 초기화되니깐
⇒ if null 일 때만 할당하면 되겠네 그럼? start에서? 아주 쉽군 근데 내일 하겠음 귀찮 레벨셀렉트패널 움직이는 거 WorldManager(구)에서 구현하기TerminalManager.Instance.currentNode 가 BackGround냐 아니냐로 구별해서 왔다 갔다 하면 될 듯⇒ 해결완료
#20221128 :: 노드데이터 관리법 상상
오리진노드 위치정보 저장 관리
- 최초 1회 터미널데이터의 노드정보가 null 일 때 → this(오리진)를 저장 ⇒ Start에서 구현
- 위치 정보 바뀔 때마다 다시 터미널데이터의 노드정보엔 this를 저장 ⇒ 마우스 이벤트에서 구현
- Vector3을 new 하기 때문에 정보 바뀔 때마다 다시 저장해야 됨
- 단, 마우스 뗀 시점(최종적으로 위치를 결정한 시점)에만 저장하면 됨.
그 사이의 마우스 따라가는 이동은 터미널데이터에 저장할 필요 없음.
- 씬이동이 일어났을 때는 터미널데이터의 노드정보를 this에 불러오기(위치정보 초기화 방지) ⇒ Start에서 구현
'개인 프로젝트 > Node Princess' 카테고리의 다른 글
| Node Princess :: 개발일지 #6 - 캐릭터 컨셉 (0) | 2024.02.16 |
|---|---|
| Node Princess :: 개발일지 #5 - 터미널 구현 (2) (0) | 2024.02.16 |
| Node Princess :: 개발일지 #4 - 터미널 구현 (1) (0) | 2024.02.15 |
| Node Princess :: 개발일지 #2 - 타이틀 만들기 (0) | 2024.02.15 |
| Node Princess :: 개발일지 #1 - 초기 컨셉 (0) | 2024.02.15 |
틀린 부분은 언제든지 말씀해주세요!!! 감사합니다!