🧠 오늘의 핵심 정리

  • 여전히 초보라 결과물이 엉성한 건 인정… 그래도 계속 공부하면 됨
  • 이번 과제는 씬 이동 + 데이터 유지 때문에 트러블 슈팅이 폭발
  • NPC/오브젝트 상호작용 + 대화/초상화 시스템 추가
  • 미니게임(플래피 버드 - 상어 버전) 제작 + 최고기록 게시판
  • 골드(코인) 시스템, 상점/펫 구매, 효과음·배경음악까지 붙이면서 “게임처럼” 만들기

 

 

😵  아직 초보입니다;;;

뭔가 열심히 만들어봤는데 결과물이 엉성한 건… 아직 초보라서? 라고 합리화해본다.

그래도 결론은 하나. 더 공부하면 된다. 휴…

 

 

🧨  트러블 슈팅

이번 과제 트러블 슈팅은 정말 많았습니다… (진짜로)

 

① 여러 씬 이동 + 플레이어 상태 유지 문제

메인 씬과 서브 씬들을 이동하면서 플레이어 오브젝트 상태를 유지하고 재사용하는 과정에서 오류가 많이 발생했다. 특히 플레이어가 필요 없는 미니게임 씬에서 NullReferenceException 같은 예외가 자주 터졌다.

싱글톤 / DontDestroyOnLoad로 관리해보려고 했는데, 씬 로드 시 플레이어 초기화 시점과 다른 스크립트의 Player 참조 시점이 꼬이면서 문제가 해결되지 않았다.

그래서… 정말 임시방편이지만 Player 오브젝트를 복붙하는 방식으로 막았다. 물론 옳은 방법이 아닌 건 알지만, 내일 제출이라는 현실 때문에 어쩔 수 없었다. 다음엔 이런 구조를 미리 공부하고 설계부터 해야겠다.

 

② 퀘스트 기능 삽질

유튜브 강의를 보고 퀘스트 시스템을 붙이려고 했는데, 강의가 조건 없는 인덱스 기반 진행 방식이라 내가 만들려는 방향과 달랐다. 결국 5시간 동안 만든 결과물을 한꺼번에 날려야 했다.

discard 할 때 진짜 마음이 너무 아팠고… 이 시간에 다른 도전 기능을 했어야 했는데… 싶었다. 그래도 다음부턴 강의 마지막 파트까지 먼저 훑고 내 목표랑 맞는지 확인한 다음 따라하는 습관을 들여야겠다.

 

③ 씬 넘어가도 정보 전달 (골드/점수/펫 등)

씬을 이동할 때 플레이어 골드, 점수, 펫 보유 상태 같은 핵심 정보를 넘기는 것도 어려웠다. DontDestroyOnLoad/싱글톤으로 해보려 했지만 또 미니게임 씬에서 무너져서… 결국 PlayerPrefs로 저장/로드하는 방식으로 마무리했다.

하면서도 “이 방법은 좋은 방식이 아닌 것 같은데…”라는 느낌이 들었지만, 역시 시간에 쫓기니까 일단 제출 가능한 형태로 만들었다. 일주일도 안 되는 시간 안에 개발하려니, 지식이 부족한 부분에서 프로젝트가 이상한 방향으로 굴러가는 느낌… 미래의 내가 보면 웃을 것 같다.

그래도 앞으로 공부하면, 추가/보완할 수 있을 거라고 믿는다.

 

 

 

🧩  오늘 만든 것들

  • NPC / 오브젝트 상호작용 — ObjectData(id, isNpc)로 구분
  • 대화 시스템 추가 — TalkManager(Dictionary 기반)로 대사/초상화 관리
  • 대화 UI에 초상화(Portrait) 표시 + NPC일 때만 보이도록 처리
  • 미니게임(플래피 버드 상어 버전) 생성
  • 마을 최고기록 게시판 제작 — PlayerPrefs의 BestScore 표시
  • 상호작용 중 마우스 이동 방지 — Action 중 클릭 이동 차단
  • 동굴/터널 씬 이동 구현 — TriggerEnter2D로 씬 전환
  • 골드(코인) 시스템 — 좌측 상단 표시 + PlayerPrefs 저장
  • 상점/펫 구매 — 코인 차감 후 펫 소환, 씬 넘어가도 따라오게 처리
  • 효과음/배경음악 — 미니게임 점프 시 효과음, 씬별 BGM

✅ 상호작용 중 마우스 클릭 이동 방지 (핵심 발췌)

// Player.cs
if (!manager.isAction && Input.GetMouseButtonDown(0))
{
    // 마우스 클릭 이동
    isMovingToMouse = true;
}

if (manager.isAction && isMovingToMouse)
{
// 상호작용 중이면 이동 강제 종료
isMovingToMouse = false;
rigid.velocity = Vector2.zero;
}

대화/상호작용 중에 플레이어가 클릭 이동으로 튀어나가는 게 너무 거슬려서, Action 상태일 때 클릭 이동을 막고, 이미 이동 중이면 속도를 0으로 끊는 방식으로 처리했다.

✅ 대화 + 초상화 처리 (핵심 흐름 발췌)

// GameManager.cs (일부)
ObjectData objData = scanObj.GetComponent<ObjectData>();
Talk(objData.id, objData.isNpc);

void Talk(int id, bool isNpc)
{
string talkData = talkManager.GetTalk(id, talkIndex);
if (talkData == null)
{
isAction = false;
talkIndex = 0;
return;
}

```
if (isNpc)
{
    talkText.text = talkData.Split(':')[0];
    portraitImg.sprite = talkManager.GetPortrait(id, int.Parse(talkData.Split(":")[1]));
    portraitImg.color = new Color(1, 1, 1, 1);
}
else
{
    talkText.text = talkData;
    portraitImg.color = new Color(1, 1, 1, 0);
}

talkIndex++;
```

}

오브젝트는 설명 텍스트만 띄우고, NPC는 대사 + 초상화까지 뜨도록 분기했다. 대사 데이터는 TalkManager에서 id 기반으로 관리했고, “대사:초상화인덱스” 형태로 파싱해서 연결했다.

✅ 코인/최고기록과 연동 (핵심 발췌)

// 미니게임 GameOver에서 최고기록 갱신 시 코인 지급
bestScore = currentScore;
PlayerPrefs.SetInt(BestScoreKey, bestScore);

int coins = PlayerPrefs.GetInt("Coins");
PlayerPrefs.SetInt("Coins", coins + 5);

최고기록을 세우면 코인을 지급하도록 연결해서, “미니게임 → 보상 → 마을에서 사용(상점)” 흐름을 만들고 싶었다.

 

 

📌 오늘의 회고

 

진짜 다 만든 거 보니까… 좀 더 열심히 공부해야겠다는 생각이 들었다.

특히 씬 이동/데이터 유지 쪽은 “급하게 땜질”한 부분이 많아서, 제출이 끝나면 꼭 다시 정리하면서 제대로 이해하고 싶다.

그래도 이번에 억지로라도 붙여보면서 “왜 문제가 생겼는지”를 몸으로 배운 느낌은 있다. 다음엔 덜 무너지게… 제발… 😇

 

 

🔜 내일 할 일

  • 씬 이동/플레이어 유지 관련 오류 재점검 (미니게임 씬 포함)
  • PlayerPrefs 저장 데이터(코인/펫/점수) 로드 흐름 정리
  • 제출용 빌드/플레이 시나리오 테스트

 

💡 이 프로젝트의 기본 구조와 흐름은 골드메탈님의 쯔꾸르 스타일 탑다운 RPG 영상을 참고했습니다.

 

혹시 이거 내용 다 좋은데 ③ 씬 넘어가도 정보 전달 이런식으로 숫자 인덱스 있는 부분 가독성이 너무 안좋거든 내용은 안 고치고 이거 좀 도와줘