![[1인개발 프로젝트] 하늘소 프로젝트 6주차](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEOtJr%2FbtsFfUUf7f9%2FxNbQAl8KtQzER2ZbP3hqy1%2Fimg.png)
사실 저번 주가 6주차 되는 주였지만, 저번 주에는 OT도 가고 여러가지 행사가 겹쳐 거의 7일 중 6일을 밖에 있었기 때문에 어쩔 수 없이 한주를 더 보게 되었다. 이제 내가 선배야...?
저번 주차에 NPC 대화 기능으로 씨름을 했었는데, 이번 주차에 그것을 해결했다!
사실 스파게티 코드가 악의 근원인 것은 저번 주차에도 알고 있었지만, 이를 고치기에는 전혀 엄두가 안났다. 기어코 작동되게 만들어놨건만 이것을 뜯어고친다면... 아마 앞으로 6주동안 그것만 붙잡고있지 않을까 싶어 코드를 조금만 고쳐 버그만 잡았다.
NPC와의 대화기능 구현
저번 주차에 구현하지 못했던 대화 기능을 구현했다.
public void Communicate()
{
if (npcLocation != "none")
{
if (npcLocation == "up")
{
Vector3 loc = new Vector3(player.transform.position.x + 0.5f, player.transform.position.y, -10);
_camera.DOOrthoSize(3, 0.5f).SetEase(Ease.InOutSine);
if (!isCommunicating) _camera.transform.DOMove(loc, 0.5f).SetEase(Ease.InOutSine);
Liner(up);
}
else if (npcLocation == "down")
{
Vector3 loc = new Vector3(player.transform.position.x - 0.5f, player.transform.position.y, -10);
_camera.DOOrthoSize(3, 0.5f).SetEase(Ease.InOutSine);
if (!isCommunicating) _camera.transform.DOMove(loc, 0.5f).SetEase(Ease.InOutSine);
Liner(down);
}
else if (npcLocation == "left")
{
Vector3 loc = new Vector3(player.transform.position.x, player.transform.position.y + 0.5f, -10);
_camera.DOOrthoSize(3, 0.5f).SetEase(Ease.InOutSine);
if (!isCommunicating) _camera.transform.DOMove(loc, 0.5f).SetEase(Ease.InOutSine);
Liner(left);
}
else if (npcLocation == "right")
{
Vector3 loc = new Vector3(player.transform.position.x, player.transform.position.y - 0.5f,-10);
_camera.DOOrthoSize(3, 0.5f).SetEase(Ease.InOutSine);
if (!isCommunicating) _camera.transform.DOMove(loc, 0.5f).SetEase(Ease.InOutSine);
Liner(right);
}
else
{
_camera.GetComponent<CameraController>().enabled = false;
}
}
}
코드를 간단하게 설명하면, 버튼을 하나 생성하고 Onclick시 실행될 함수의 목적으로 Communicate 함수를 작성하였고, NPC 클래스에 자신의 위치를 담고있기 때문에 현재 플레이어 위치의 상하좌우를 판단해 플레이어의 어디 방향에 NPC가 있는지 판단한다. 그 후, 카메라의 위치와 줌을 변경하고, 본격적인 대사 함수를 불러오는 구조이다.
아래는 그 본격적인 대사 함수이다.
void Liner(Vector3Int location)
{
scriptBox.SetActive(true);
isCommunicating = true;
DataManager.NPC[] NPCs = DataManager.Instance.npcContainer.NPCs;
DataManager.NPC npc = NPCs[0];
for (int i = 0; i < NPCs.Length; i++)
{
if (NPCs[i].location == location)
{
npc = NPCs[i];
break;
}
}
if (scriptStack == npc.defaultTalks.Length)
{
isCommunicating = false;
scriptStack = 0;
scriptBox.SetActive(false);
_camera.DOOrthoSize(5, 0.5f).SetEase(Ease.InOutSine);
}
else
{
Speak(npc.defaultTalks[scriptStack]);
}
}
void Speak(string script)
{
commuBox.DOText("", 0.01f);
commuBox.DOText(script, 1f).OnComplete(() => { endCursor.SetActive(true); });
}
대사를 출력할 텍스트 블럭을 받아와 활성화시키고, 대화중임을 나타내는 bool 값을 true로 설정해준다. 그 후, 어떤 NPC인지 위치로 판단해 현재 대화중인 NPC를 설정하고, 그 NPC가 가지고있는 대사 목록을 돌며 대화를 하는 구조이다.
대사 목록을 끝까지 돌면 카메라 줌아웃과 함께 대사창이 비활성화된다.
사실 이런 문제는 금방 해결했다. 함수 몇개 만들고 내부 구조만 탄탄하게 짜면 되기 때문에 어려움은 없었다.
이번 주차에 개발을 별로 못한 것을 보면 알겠지만, 최근 들어 갑자기 너무 바빠졌다. 그리고 이제 슬슬 이것보다 더 중요한 팀 프로젝트가 시작되기에 이 프로젝트의 유지에 대한 고민을 정말 많이 했다.
이 프로젝트는 꽉찬 컨텐츠, 참신한 기획, 지속적인 운영 이 세가지 요소를 가지고 시작하게 된 프로젝트이다. 이 세가지 만큼은 꼭 지키겠다! 하고 시작했는데, 사실 생각해보면 이것들은 혼자 해내기에는 굉장히 힘든 일들이다. 1인 개발에 성공한 사례들을 보면 대부분 인디게임, 혹은 업데이트 주기가 굉장히 긴 개인 플레이류 게임들인데, 이 게임은 기념일마다 그에 맞는 것들을 업데이트하고, 유저들을 잡기 위해 수시로 푸시 알림도 뿌려야하는 어떻게보면 조금 귀찮은(?) 한국형 게임이다.
내가 이 모든 것을 해내겠어! 하고 시작하기는 했지만 하면 할수록 점점 빨간약의 농도가 짙어져가는 것을 느꼈기 때문에 매일 그 다음 개발 상황을 생각하는 것이 마냥 즐겁지만은 않았다.
그래서, 조금은 더 대학 생활에 집중하기 위해, 팀 프로젝트에 힘을 쏟기 위해 이 프로젝트를 잠정 무기한 중단하려고 한다. 시간이 난다면 짬을 내서 하겠지만, 아무래도 시간이 나지 않을 것 같다.
6주간 정말 많은 것을 했다. 기획부터 초기 개발, 에셋 제작, 작곡, 기능 구현까지. 짧다면 짧은 시간이지만 많은 것을 배웠다. 이제 여기서 배운 것들을 다른 곳에서 쓸 차례이다.
금방 올게요...!

그리고... 20 21 22 23
'1인 개발 > 하늘소 프로젝트' 카테고리의 다른 글
[1인개발 프로젝트] 하늘소 프로젝트 5주차 (1) | 2024.02.15 |
---|---|
[1인개발 프로젝트] 하늘소 프로젝트 4주차 (1) | 2024.02.09 |
[1인개발 프로젝트] 하늘소 프로젝트 3주차 (2) | 2024.02.02 |
[1인개발 프로젝트] 하늘소 프로젝트 2주차 (1) | 2024.01.19 |
[1인개발 프로젝트] 하늘소 프로젝트 1주차 (4) | 2024.01.12 |
안녕하세요! 코드 짜는 농부입니다! 경희대학교 소프트웨어융합학과 23학번 재학중입니다. 문의 : dsblue_jun@khu.ac.kr
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!