전체 글 48

내일배움캠프 유니티 후기

시작하기 전에수능이 끝난 후, 잠깐의 자유를 즐기고 나니 앞으로 뭘 해야 할지 고민이 많아졌습니다.워킹홀리데이를 준비하며 시간을 보내기도 했지만, 마음 한편엔 “내가 정말 하고 싶은 건 뭘까?”라는 생각이 계속 따라다녔습니다.그때 우연히 보게 된 게 바로 내일배움캠프 유니티 과정이었습니다.게임은 늘 좋아했지만, "내가 직접 만들어본다"라는 발상은 사실 두렵고 낯설었습니다. 그래도 “한 번쯤 해보자. 실패해도 경험이 될 테니까.” 라는 마음으로 지원했고, 그렇게 제 첫 게임 개발 도전이 시작됐습니다.캠프의 장점가장 큰 장점은 실전 위주 학습이었습니다.처음 유니티를 설치할 때만 해도 뭘 눌러야 할지 막막했는데, 매일 주어지는 과제를 따라가다 보니 어느새 기본기를 익히고 있었습니다. 단순히 이론 강의만 듣는 ..

카테고리 없음 2025.08.17

하루에 하나라도 배우자!(11.07.2025)

[Unity 개발 TIL] 'FindObjectOfType'의 함정과 로직 책임 리팩토링상점 시스템을 완성하는 과정에서, 단순히 눈에 보이는 버그를 잡는 것을 넘어 코드의 구조 자체를 더 견고하게 만드는 두 가지 중요한 교훈을 얻었다.## 1. 누구를 찾아야 할지 모르는 FindObjectOfType의 함정현상: DialogueManager에서 ShopManager를 참조하기 위해 Start() 함수에서 FindObjectOfType()를 사용했지만, 계속 null이 반환되며 NullReferenceException이 발생했다. 씬에는 분명 ShopManager 오브젝트가 존재했다.원인: FindObjectOfType은 씬에서 활성화(Active)된 오브젝트만 찾을 수 있다. 나는 보통 UI 패널처럼 시..

카테고리 없음 2025.07.11

하루에 하나라도 배우자!(10.07.2025)

[Unity 개발 TIL] 호출 스택(Call Stack)과 상태 머신(State Machine)의 숨은 함정오늘은 NPC와 대화 후 상점을 열고, 상점에서 나온 뒤 다시 대화를 이어가는 복잡한 상호작용 시스템을 구현했다. 이 과정에서 컴파일 에러는 없지만 로직이 꼬여버리는 두 가지 중요한 문제를 만났고, 해결 과정을 통해 디버깅의 핵심 원칙을 다시 한번 되새길 수 있었다.## 1. 호출 스택(Call Stack)은 위에서부터 읽는 지도다현상: NullReferenceException 에러가 발생했다. 콘솔에 여러 줄의 에러 로그가 출력되었지만, 정확히 어느 스크립트의 어느 부분에서 문제가 시작된 것인지 막막했다.잘못된 생각: "에러 로그가 너무 길고 복잡해서 정확한 원인을 알 수 없다. 그냥 이 과정 ..

카테고리 없음 2025.07.10

하루에 하나라도 배우자!(09.07.2025)

[Unity 개발 TIL] 상태 머신과 UI 입력 시스템 디버깅 기록오늘은 NPC와 상호작용하여 대화를 나누고, 대화 선택지를 통해 상점을 여는 시스템을 구현했다. 기능이 복잡하게 얽히면서, 컴파일 에러는 없지만 로직이 꼬이는 두 가지 까다로운 버그를 만났고 이를 해결하는 과정을 기록한다.## 1. 유령처럼 남아있는 이전 상태 (Stale State) 문제현상: 상점에 들어갔다가 나온 후, 다시 NPC에게 말을 걸면 두 번째 대화가 시작되지 않고 곧바로 다시 상점이 열리는 무한 루프에 빠졌다. PlayerShopState의 진입 로그는 찍히지 않았다.원인: 문제의 흐름은 다음과 같았다.상점이 열릴 때 DialogueManager의 상태(CurrentState)는 Paused가 된다.플레이어가 상점을 닫으..

카테고리 없음 2025.07.09

하루에 하나라도 배우자!(08.07.2025)

[Unity 개발 TIL] 상점 시스템 구현 중 마주친 3가지 주요 오류와 해결 과정오늘은 대화 시스템과 연동되는 상점(Shop) UI를 구현했다. 단순히 기능을 만드는 것을 넘어, 여러 시스템(StatManager, Inventory, Player State Machine)이 유기적으로 통신하는 과정에서 몇 가지 중요한 문제들을 만났고, 이를 해결하며 배운 점을 기록한다.## 1. void의 배신: 로직 순서의 중요성가장 먼저 부딪힌 문제. 아이템 구매 시, 돈이 부족해서 실제 구매는 실패했는데 인벤토리에서는 아이템이 사라지는 현상이 발생했다.문제 원인: UIInventory가 아이템 사용 버튼을 누르자마자 quantity--로 아이템 개수를 먼저 차감한 뒤, StatManager에 돈이 충분한지 물어..

카테고리 없음 2025.07.08

하루에 하나라도 배우자!(07.07.2025)

유니티 로컬라이제이션 (Localization) 기능이것은 게임을 다양한 언어와 문화권에 맞춰 현지화하는 작업을 아주 쉽고 체계적으로 만들어주는 공식 기능입니다.과거에는 여러 언어를 지원하려면 코드 내의 텍스트를 직접 바꾸거나 복잡한 시스템을 개발자가 직접 만들어야 했습니다. 하지만 유니티의 로컬라이제이션 패키지를 사용하면 이런 과정이 매우 간단해집니다.주요 특징:리소스 분리: 게임 코드에서 텍스트(대사, UI 문구), 이미지, 오디오 등 언어별로 바뀌어야 할 리소스를 분리하여 별도의 테이블로 관리합니다.간편한 언어 추가: 개발이 끝난 후에도 코드를 전혀 건드리지 않고, 단순히 새 언어 테이블을 추가하고 번역된 내용만 입력하면 새로운 언어를 손쉽게 지원할 수 있습니다.다양한 현지화: 단순 언어 번역을 넘..

카테고리 없음 2025.07.07

하루에 하나라도 배우자!(04.07.2025)

Cinemachine 대화 카메라 타겟팅 문제 해결겪고 있는 문제 (Problem) 🧐DialogueManager에 연결된 CinemachineCamera가 단 하나의 고정된 타겟(CinemachineTarget)만 바라보도록 설정되어 있습니다.이 때문에 여러 NPC나 아이템과 상호작용하더라도, 대화 카메라가 항상 처음에 지정된 타겟만 비추게 됩니다. 새로운 NPC와 대화해도 카메라가 그 NPC를 동적으로 따라가지 않아 원하는 연출이 불가능한 상황입니다.해결 목표 (Goal) 🎯플레이어가 특정 NPC나 아이템과 상호작용할 때, 대화 카메라가 해당 상호작용 대상의 CinemachineTarget을 자동으로 찾아 Follow 하도록 시스템을 수정합니다.원인 분석 (Analysis) 📝문제의 근본 원인은..

카테고리 없음 2025.07.04

하루에 하나라도 배우자!(03.07.2025)

문제 1: 원인 불명의 'Idle' 로그 메시지🔍 증상 (Symptom)C# 스크립트에서 직접 작성한 적 없는 'Idle'이라는 로그가 콘솔 창에 계속해서 출력됨.로그를 클릭하면 Unity.Behavior 관련 코드로 연결됨.🎯 원인 (Cause)해당 로그는 일반 C# 스크립트가 아닌 Unity Behavior Graph라는 비주얼 스크립팅 툴 내부의 Log Message To Console Action 노드에 의해 발생함.그래프 내의 특정 노드가 'Idle'이라는 텍스트를 출력하도록 설정되어 있었음.✅ 해결 (Solution)씬(Scene)에서 BehaviorGraphAgent 컴포넌트를 가진 게임 오브젝트를 찾음.해당 컴포넌트에 연결된 비헤이비어 그래프 에셋을 열기.그래프 에디터 내에서 Log M..

카테고리 없음 2025.07.03

하루에 하나라도 배우자(02.07.2025)

스탯 시스템 리팩토링: 플레이어 전용으로 스탯 시스템을 개편하고, 기획에 맞춰 새로운 스탯(HP, 스킬 횟수/게이지)과 로직을 추가했습니다.버프/디버프 시스템 전면 개편: 복잡했던 스크립터블 오브젝트 구조를 버리고, **enum 기반의 단일 EffectSO**를 사용하여 관리가 쉽고 직관적인 시스템을 새로 설계했습니다.상태 머신 연동 및 버그 해결: PlayerController와 PlayerBaseState의 역할을 명확히 하여, '혼란' 버프의 조작 반전 로직을 적용하고 지상에서 움직이지 않던 핵심적인 이동 버그를 해결했습니다.구조 정리: 어떤 스크립트를 어디에 붙여야 하는지, 데이터(ScriptableObject)와 실행 로직(MonoBehaviour)이 어떻게 상호작용하는지에 대한 전체적인 구조를..

카테고리 없음 2025.07.02

하루에 하나라도 배우자!(01.07.2025)

스탯 매니저를 조금 더 깔끔하게 쓰는 법을 알아보자.일단 엔티티한테 각각의 스탯을 스크립터블오브젝트로 달아주는 게 가장 편하고 나을 것 같다는 생각이 들었다.캐릭터 스탯을 스크립터블 오브젝트화 시키면 몬스터한테도, 플레이어한테도 각각의 스탯이 생기는 것이다.스탯은 아이템과도 연관이 있다.아이템을 먹었을 때 회복, 또는 소모를 극단적으로 둘이 나눠서 각 아이템의 효과를 둘 중 어느 것인지, 어느 정도의 value인지를 설정해 보기쉽게 설정할 수 있다.다음은 내가 만든 스탯 매니저의 일부이다.public void Recover(StatType type, float amount){ if (stats.TryGetValue(type, out var stat)) { stat.Recover(a..

카테고리 없음 2025.07.01