벌써 다음주면 스타터스 프로젝트 코스가 끝난다.
마지막 발표 전 구현하고, 버그 수정하고, 배포하고... 할 일은 산더미인데 너무나 시간이 빠르게 지나가는 것 같은 한 주였다.
그래도 어느정도 구실을 갖춰지는 모습을 보면 뭔가 할머니가 다 큰 아들을 보는 기분 같이 대견한 마음이 들기는 하는 것 같다. ㅎㅎ
레벨 에디터 모드
레벨 에디터 모드(별 생성)는 유저가 스스로 맵을 디자인하고 만들어서 플레이할 수 있는 모드이다.
스프린트 3에서 가장 중점으로 만들고 있는 새 기능 중 하나로 여기서 난 포인터를 이용해 블록을 만들어 배치하고, 카드를 부여, 시작 카드를 등록 그리고, 모든 ui창 on off하는 기능들을 만들었다.
어떻게 보면 맵을 저장하고, 테스트 플레이하는 기능 전에 구현할 부분을 모두 만들었고, 실제로 맵을 저장하기 좋게끔 생성하는 시점에서 미리 배열 등을 만들어서 저장해 놓았다.
이 부분은 그 이후 부분을 구현하실 팀원분과 레벨 에디터 모드 구현 전에 논의를 잘 하고 들어가서 가능한 부분이었는데, 이번 일로 다시 한번 개발자도 소통의 기술이 필요하다는 사실을 체감했다.
레벨 에디터 모드에서 가장 구현이 힘들었던 부분은 버튼에 연결된 함수가 state에 따라 다르게 동작하고, 블록의 타입, 카드의 타입 별로 또다시 다르게 동작하도록 하는 것이었다.
기본적으로 블록과 카드 선택은 isCard라는 bool 변수로 함수들의 동작들을 구분해주었고, 카드, 오브젝트의 타입 등은 다시 1번 타입의 수보다 클릭한 칸의 인덱스가 낮을 때에 1번 타입의 동작을 실행하게끔 구현하였다.
그 외에도 게임에서는 바로 이름이나 꾸밈의 효과가 바로 적용되던 것을 에디터 모드에서는 gameManager에 저장된 currentState가 editorLevel 모드일 경우에는 막도록 해서 맵 생성 중에 물체가 타버리거나 하는 것을 방지했다.
// 블록을 생성시키는 매서드
public void CreateBlock()
{
Vector3 pos = new Vector3(curX, curY, curZ);
// 카드 모드인지 아닌지에 따라서 카드를 가져올지 블록을 가져올지 결정
EditorBlock block = isCard? cardBtns[blockNum] : blockBtns[blockNum];
// 카드 모드
if (isCard)
{
// 선택한 카드의 타입을 확인
bool isName = block.type == EBlockType.NameCard;
InteractiveObject target = null;
// 포인터 위치에 해당하는 블록이 있다면, 타일인지 오브젝트인지 검사
// 오브젝트에만 InteractiveObject 컴포넌트가 있음
if (blocks[curX, curY, curZ] != null)
blocks[curX, curY, curZ].TryGetComponent<InteractiveObject>(out target);
// 타일인 경우
if (target == null)
{
// 타일에는 부여 불가
return;
}
// 선택한 카드의 타입이 이름인 경우
if (isName)
{
// 이름 부여
AddName(target, (EName)block.idx);
}
// 선택한 카드의 타입이 이름은 아니고, 인덱스가 0번이 아닌 경우 = 타입이 꾸밈인 경우
else if (blockNum != 0)
{
// 꾸밈 부여
AddAdjective(target, (EAdjective)(block.idx - nameCardPrefabs.Count + 1));
}
// 인덱스가 0인 경우
else
{
// 이름 삭제
AddName(target, (EName)0);
}
}
// 블록 모드
else
{
// 타일인지 오브젝트인지 검사
bool isTile = block.type == EBlockType.Tile;
// 타일이면, 타일 생성
if (isTile)
{
SetBlockInTransform(pos, (ETile)block.idx);
}
// 오브젝트이면, 오브젝트 생성
else
{
SetBlockInTransform(pos, (EName)(block.idx - tilePrefabs.Count + 1));
}
}
}
시나리오 포인터
시나리오는 생각보다 시간이 없어서 사실 하드 코딩이 많이 되어 있는 부분이다.
안 그래도 처음 구현할 때에 러프하게 짰는데, 남은 시간에 비해 시나리오의 조건이나 시나리오에서 보여줄 동작들이 많아지면서 덕지덕지 하드코드 덩어리들이 붙기 시작했다.
현재는 여러 조건의 경우는 enum으로 정리해서 조건을 정하는 부분은 조금 깔끔해졌지만.. 여전히 조건에 해당하는 각각의 변수들을 따로따로 시나리오 struct에 저장하다 보니 더 더러워지게 되었다.
// 덕지덕지 붙어있는 여러 변수들...
// 못난이 내 시나리오 struct
[System.Serializable]
public struct Scenario
{
public ERequireType type;
public SPosition destinationPos;
public SPosition targetPos;
public SPosition prePos;
public SPosition nextPos;
public string requiredName;
public EKeyType key;
public float time;
public bool isDialog;
public string message;
public string funcName;
public bool isFocus;
public bool canSkip;
public bool showArrow;
}
버그 그리고, 버그...
마지막 데모데이 전 개발 시간이라 배포까지 가능한 빌드를 뽑아야 하고, 그 과정에서 버그가 상당하다.
버그를 수정하면 새로운 버그가 생기고, 다시 버그가 생기는 이 굴레에서 아직은 빠져나오지 못했지만.. 그래도 차츰 다 해결이 되어가고 있다.(크리티컬한 버그들은)
앞으로 며칠 뒤면 마지막 데모데이와 함께 결과에 따라서 부트캠프 동료들과 헤어지게 되는데 마지막을 아름답게 끝내기 위해 다들 열심히 하는 모습이 참 멋지면서도 슬픈 것 같은 기분이 든다.
그래도.. 그 마지막 피날레에서 모두 꽃 피울 수 있을거라 생각하고 오늘도 열심히 코드를 짜야지.. ㅎㅎ
유데미 코리아 바로가기 :
Udemy Korea - 실용적인 온라인 강의, 글로벌 전문가에게 배워보세요. | Udemy Korea
유데미코리아 AI, 파이썬, 리엑트, 자바, 노션, 디자인, UI, UIX, 기획 등 전문가의 온라인 강의를 제공하고 있습니다.
www.udemykorea.com
💡 본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.
'Starters 부트캠프 > B - log' 카테고리의 다른 글
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 프로젝트 코스 6주차 학습 일지 (0) | 2023.02.20 |
---|---|
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 프로젝트 코스 5주차 학습 일지 (0) | 2023.02.12 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 프로젝트 코스 4주차 학습 일지 (0) | 2023.02.04 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 프로젝트 코스 3주차 학습 일지 (0) | 2023.01.29 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 프로젝트 코스 2주차 학습 일지 (0) | 2023.01.22 |