
어떤 템플릿을 선택해야 할까? (핵심 요약)
사용자님이 만들 앱은 달력, 버튼, 텍스트가 중심이 되는 UI(사용자 인터페이스) 기반의 앱입니다. 화려한 3D 그래픽이나 복잡한 물리 엔진이 전혀 필요 없죠. 따라서 선택지는 2D 계열로 좁혀집니다.
| 템플릿 | 특징 | 추천 대상 |
| 2D (Built-in...) | 가장 기본적이고 표준적인 2D 프로젝트. | PC용 2D 게임이나 앱을 만들 때 주로 사용. 모바일용으로도 설정 변경해서 사용 가능. |
| 3D (Built-in...) | 3D 공간과 객체를 다루기 위한 기본 프로젝트. | (만드실 앱과는 전혀 상관없으니 선택하지 마세요.) |
| 2D Mobile | 가장 추천! 기본 2D 설정에 모바일 환경에 최적화된 설정들이 미리 적용되어 있음. | 처음부터 안드로이드/아이폰용 앱을 만들고자 하는 경우. |
왜 2D Mobile을 추천하는가?
2D Mobile 템플릿은 2D 템플릿을 기반으로 하되, 모바일 앱 개발에 필요한 몇 가지를 알아서 설정해 줍니다. 즉, 처음부터 모바일에 더 최적화된 상태로 시작할 수 있어 편리합니다.
미리 설정해 주는 것들의 예시:
- 성능 최적화: 모바일 기기는 PC보다 성능이 낮으므로, 불필요한 그래픽 옵션을 끄는 등 가볍게 돌아가도록 기본 설정이 되어 있습니다.
- 해상도 및 입력: 모바일 화면 비율에 맞게 게임 뷰가 설정되어 있거나, 터치 입력을 더 쉽게 처리할 수 있도록 준비가 되어 있습니다.
- 필수 패키지: 모바일 개발에 유용한 'Unity Device Simulator' 같은 패키지가 포함되어 있어, 실제 폰이 없어도 다양한 기기에서 어떻게 보일지 테스트하기 용이합니다.
물론, 2D로 시작해서 나중에 이 설정들을 전부 수동으로 바꿀 수도 있습니다. 하지만 목표가 명확하게 '모바일 앱'이므로, 굳이 번거로운 과정을 거칠 필요 없이 2D Mobile로 시작하는 것이 시간과 노력을 아끼는 길입니다.
1. 화면 전환: "점점 복잡해지네" -> "씬(Scene)을 나누면 돼!"
유니티는 화면(혹은 스테이지)을 씬(Scene) 이라는 단위로 관리합니다. 파워포인트 슬라이드를 생각하면 아주 쉽습니다.
- HabitListScene (습관 목록이 보이는 첫 화면, 1번 슬라이드)
- CalendarScene (습관을 클릭하면 넘어가는 달력 화면, 2번 슬라이드)
- SettingsScene (설정 화면, 3번 슬라이드)
// 대략 이런 느낌의 코드입니다. 지금은 이해 못 해도 괜찮습니다.
public void OnHabitButtonClick()
{
SceneManager.LoadScene("CalendarScene");
}
걍 해당 메소드가 어차피 일을 다해주니께
2. 달력 구현: "어떻게 만들지?" -> 2가지 길이 있습니다.
이게 가장 핵심적인 기술 질문이네요. 방법은 크게 두 가지입니다.
방법 1: '바퀴를 재발명'하지 않는다! - 에셋 스토어(Asset Store) 활용하기
사용자님이 "가져올 수 있는 import가 있는 건가"라고 하신 부분이 바로 이겁니다. 유니티에는 에셋 스토어(Asset Store) 라는 거대한 보물 창고가 있습니다. 전 세계의 개발자들이 만들어 놓은 코드, 디자인, 기능들을 가져다 쓸 수 있는 마켓이죠.
- 유니티 에디터 상단 메뉴 Window > Asset Store로 들어가서 'Calendar'라고 검색해 보세요.
- 이미 완벽하게 만들어진 달력 기능들을 무료 또는 유료로 다운로드할 수 있습니다.
- 이걸 가져와서 내 프로젝트에 맞게 디자인만 조금 수정하면, 달력의 복잡한 로직(예: 2월은 28일, 윤년 계산 등)을 전혀 고민할 필요 없이 바로 사용할 수 있습니다.
초보 단계에서는 이 방법을 강력하게 추천합니다. 핵심 기능에 집중하고, 부가적인 기능은 다른 사람의 도움을 받으며 빠르게 결과물을 만드는 경험이 중요합니다.
방법 2: 내가 직접 만든다! - 직접 구현하기 (나중을 위한 설명)
물론 직접 만드는 것도 가능하고, 이게 진짜 공부가 됩니다. 개념만 간단히 설명해 드릴게요.
- UI 틀 만들기: 42개(7일 x 6줄)의 버튼을 사각형 격자 모양으로 배치합니다.
- 로직 코딩(C#):
- DateTime이라는 C#의 기본 기능을 사용해 "오늘이 몇 월 며칠인지", "이번 달 1일은 무슨 요일인지"를 알아냅니다.
- 반복문을 사용해 42개의 버튼을 돌면서, 1일이 시작하는 요일에 맞춰 숫자 '1'을 써넣고, 순서대로 2, 3, 4...를 채워 넣습니다.
- 지난달이나 다음 달에 해당하는 버튼들은 비활성화하거나 흐리게 처리합니다.
- 두 씬을 빌드에 등록하기
- File > Build Settings로 갑니다.
- Scenes In Build 아래에 지금 열려있는 CalendarView 씬이 보일 겁니다. Add Open Scenes 버튼을 누릅니다.
- 왼쪽 프로젝트 창에서 HabitList 씬 파일을 드래그해서 Scenes In Build 목록에 추가해 줍니다. (이제 유니티가 이 두 씬의 존재를 알게 됩니다.)
- 만들어 둔 "금연" 버튼을 누르고, 오른쪽 Inspector 창의 On Click () 섹션에서 + 버튼을 누릅니다.
- 방금 스크립트를 넣은 오브젝트를 네모 칸에 끌어다 놓고, 드롭다운 메뉴에서 SceneLoader > LoadCalendarScene()을 선택합니다.
부모-자식 관계는 이럴 때 사용합니다
"부모가 움직이면, 자식도 똑같이 따라 움직이게 하고 싶을 때"
예를 들어,
- 자동차(부모)와 바퀴(자식): 자동차 몸체를 움직이면 바퀴들도 당연히 같이 따라 움직여야 합니다.
- 캐릭터(부모)와 캐릭터가 든 칼(자식): 캐릭터가 점프하면 칼도 같이 점프해야 합니다.
만약 "금연" 버튼을 "내 습관 목록" 텍스트의 자식으로 만들면, "내 습관 목록" 텍스트를 화면에서 움직일 때마다 "금연" 버튼이 껌딱지처럼 졸졸 따라다니게 됩니다. 우리는 그걸 원하지 않죠. 둘은 그냥 같은 화면에 있는 별개의 요소일 뿐입니다.
올바른 구조 (Hierarchy 창)
유니티에서 UI 요소를 처음 만들면 Canvas라는 것이 자동으로 생깁니다. 모든 UI 요소(텍스트, 버튼, 이미지 등)는 이 Canvas라는 큰 도화지 위에 그려져야 합니다.
따라서 올바른 계층 구조(Hierarchy)는 아래와 같이 보일 겁니다.
▼ Canvas (모든 UI 요소들의 부모가 되는 도화지)
L Text (TMP) - "내 습관 목록"
L Button - "금연"
EventSystem (클릭 등을 감지하는 시스템)
보시는 것처럼, Text와 Button은 서로 형제 관계이며, 둘 다 Canvas의 자식입니다.
실전 팁: 자동 정렬 기능 활용하기
나중에 "금연", "폭식 안 하기", "게임 안 하기" 처럼 버튼이 여러 개가 되면 일일이 손으로 배치하기 귀찮아집니다.
그럴 때는 Canvas 아래에 Empty Object를 하나 만들고 이름을 HabitListPanel처럼 지어줍니다. 그리고 이 패널에 Vertical Layout Group 이라는 컴포넌트를 추가하세요.
그다음, 모든 버튼들을 이 HabitListPanel의 '자식'으로 넣으면, 마치 파일 목록처럼 위에서 아래로 자동으로 예쁘게 정렬됩니다.
씬의 이름은 Hierarchy(계층) 창이 아니라 Project(프로젝트) 창에서 바꿔야 합니다.
F2를 눌러도 안 되는 이유는, 지금 보고 계신 Hierarchy 창의 씬 이름은 현재 열려있는 '작업 공간'의 이름표 같은 것이고, 실제 파일이 아니기 때문입니다.
워드 문서로 비유해 볼게요.
- Hierarchy 창: 현재 편집 중인 문서의 내용(제목, 문단, 그림 등)을 보여주는 편집 화면입니다.
- Project 창: 내 컴퓨터의 폴더처럼, 모든 파일(.docx 파일, 이미지 파일 등)이 저장된 곳입니다.
문서 파일의 이름을 바꾸려면, 편집 화면 안에서 바꾸는 게 아니라 폴더에 가서 파일 자체의 이름을 바꿔야 하죠? 유니티 씬도 똑같습니다.
※ 혹시 아직 씬을 저장하지 않았다면?
만약 File > New Scene으로 새 씬을 만들어서 Hierarchy 창에 Untitled 라고 표시되고 있다면, 이건 아직 파일로 저장되지 않은 상태입니다.
이 경우에는 '이름 바꾸기'가 아니라 **'저장하기'**를 먼저 해야 합니다.
지금 보고 계신 화면이 바로 제가 이전에 설명드렸던 **File > Save As...**를 눌렀을 때 나타나는, "새로운 씬 파일을 어디에, 어떤 이름으로 저장할까요?" 라고 유니티가 물어보는 과정입니다.
전혀 당황할 필요 없습니다. 지금 아주 잘하고 계신 겁니다.
왜 이 창이 뜨는 걸까요?
Hierarchy 창에서 Untitled*라고 보였던 것은, 아직 컴퓨터에 파일 형태로 저장되지 않은 임시 작업 공간이었기 때문입니다. 이제 이 작업 공간을 실제 .unity라는 확장자를 가진 파일로 저장해야 유니티가 정식으로 관리할 수 있게 됩니다.
지금 해야 할 일 (아주 간단합니다)
스크린샷을 보니 이미 프로젝트를 체계적으로 관리하기 위한 Scenes 폴더를 만들어 두셨네요. 정말 훌륭합니다! 개발자로서 아주 좋은 습관입니다.
- Scenes 폴더로 들어가세요.
- 지금 보이는 파일 목록에서 Scenes 폴더를 더블클릭합니다.
- 파일 이름을 정해주세요.
- 폴더로 들어간 후, 아래쪽 파일 이름(N): 이라고 된 입력 칸을 클릭합니다.
- 여기에 우리가 만들 두 번째 화면의 이름인 CalendarView 라고 입력합니다. (영어로 입력하는 습관을 들이는 것이 좋습니다.)
- 저장 버튼을 누르세요.
- 오른쪽 아래의 저장(S) 버튼을 누르면 끝입니다.
원래 다른 씬에 있는 건 안 보이는 게 정상입니다.
지금 무슨 일이 일어나고 있는 건가?
결론부터 말씀드리면, 지금 사용자님은 유니티의 '멀티 씬 편집(Multi-Scene Editing)' 기능을 우연히 활성화시킨 상태입니다.
쉽게 비유하자면, 투명한 OHP 필름 두 장을 겹쳐 놓은 것과 같습니다.
- HabitList 라는 필름 위에 "내 습관 목록"과 "금연" 버튼이 그려져 있고,
- CalendarView 라는 필름 위에 "달력" 이라는 글씨가 그려져 있는데,
- 지금 이 두 개의 필름을 동시에 겹쳐서 보고 있는 상황입니다.
Hierarchy 창을 자세히 보시면 HabitList와 CalendarView 두 개의 씬 이름이 모두 나와 있는 것을 확인할 수 있습니다. 원래는 한 번에 하나의 씬만 보여야 합니다.
이 기능은 원래 여러 개발자가 맵의 다른 부분을 동시에 작업하거나, UI 씬과 실제 게임 씬을 분리해서 관리하는 등 고급 작업을 할 때 사용됩니다. 아마 Project 창에서 씬을 더블클릭할 때, 기존 씬을 닫지 않고 추가로 여는 옵션이 선택된 것 같습니다.
해결 방법: 겹쳐진 씬 하나를 닫기
아주 간단하게 해결할 수 있습니다. 파일을 삭제하는 것이 아니라, 지금 편집 화면에서만 잠시 닫는 것이니 안심하세요.
- Hierarchy 창으로 갑니다.
- 지금 작업할 씬이 아닌, 닫고 싶은 씬의 이름 위로 마우스를 가져갑니다. (예를 들어 지금 CalendarView를 작업하고 싶다면, HabitList 이름 위로 갑니다.)
- 이름 위에서 마우스 오른쪽 버튼을 클릭합니다.
- 나타나는 메뉴에서 **씬 제거(Remove Scene)**를 선택합니다.
그러면 마법처럼 겹쳐 보였던 HabitList의 UI들이 사라지고, 현재 작업 중인 CalendarView의 요소들만 깔끔하게 남을 겁니다.
2. Build Settings: 완벽합니다! 아주 잘하셨어요.
"이렇게 뜨면 되는 건가??"
네, 완벽합니다. 지금 스크린샷에 보이는 상태가 정확히 제가 설명드린 목표 상태입니다.
- Scenes In Build 목록에 앱을 구성할 모든 씬(HabitList, CalendarView)이 등록되었습니다.
- 각 씬 옆에 붙는 숫자(0, 1)는 씬의 '인덱스(Index)' 또는 '번호표'입니다. 코드로 "1번 씬을 불러와!"라고 명령할 때 사용됩니다.
- **첫 번째로 보여주고 싶은 씬을 맨 위(0번)**에 두는 것이 중요합니다. 지금 HabitList가 0번이 아니므로, 마우스로 HabitList 씬을 드래그해서 맨 위로 올려주세요. 그러면 SampleScene은 지워지고 HabitList가 0번이 될 겁니다. (SampleScene은 필요 없으니 클릭해서 Delete 키로 지워도 됩니다.)
3. C# 스크립트: "어떤 게임 오브젝트에 넣어야 하나?"
이 질문이 정말 중요합니다. 결론부터 말씀드리면,
"논리적으로 가장 말이 되는 곳, 혹은 관리하기 편한 빈 오브젝트에 넣으면 됩니다."
스크립트는 '레시피'와 같고, 게임 오브젝트는 '요리사'와 같습니다. 어떤 요리사에게 레시피를 줘도 요리는 할 수 있죠. 하지만 보통은 역할에 맞는 요리사에게 줍니다.
추천하는 방법 (가장 깔끔하고 정석적인 방법):
- 빈 게임 오브젝트를 만드세요.
- HabitList 씬의 Hierarchy 창에서 마우스 오른쪽 클릭 > Create Empty를 선택합니다.
- 이름을 GameManager 또는 SceneController 처럼 역할이 분명하게 드러나는 이름으로 바꿔줍니다. (F2 키)
- 이 오브젝트는 눈에 보이지는 않지만, 씬의 전반적인 관리자 역할을 하게 될 겁니다.
- 이 오브젝트에 스크립트를 붙이세요.
- Project 창에서 만들어 둔 SceneLoader.cs 스크립트 파일을 방금 만든 GameManager 오브젝트 위로 드래그 앤 드롭합니다.
- GameManager를 클릭하고 Inspector 창을 보면, Scene Loader 컴포넌트가 붙어있는 것을 확인할 수 있습니다.
유니티가 "이제부터 당신의 프로젝트를 다른 컴퓨터에서도 실행할 수 있는 독립적인 프로그램(.exe 파일)으로 만들어 줄 텐데, 그 결과물들을 어디에 보관할까요?" 라고 묻는 것입니다.
지금까지 우리가 작업한 것은 '프로젝트 파일(요리의 레시피)'이고, 지금 하려는 '빌드(Build)'는 그 레시피를 보고 만든 '완성된 요리'를 포장하는 과정입니다.
정답: Builds 라는 새 폴더를 만들고 그 안에 저장하세요.
가장 깔끔하고 모든 개발자들이 사용하는 표준적인 방법입니다.
따라해 보세요 (Step-by-Step):
- 새 폴더 만들기:
- 지금 열려있는 창을 보면 stopBadHabitApp 프로젝트 폴더의 최상위 경로에 있습니다. 아주 좋습니다.
- 창의 빈 공간에서 마우스 오른쪽 버튼을 클릭 > 새로 만들기 > 폴더 를 선택하거나, 상단의 새 폴더 버튼을 누릅니다.
- 폴더 이름을 Builds 또는 Build 라고 지어주세요. (보통 복수형으로 많이 씁니다.)
- 만든 폴더 선택하기:
- 방금 만든 Builds 폴더를 더블클릭해서 그 폴더 안으로 들어갑니다.
- 그다음, 오른쪽 아래의 폴더 선택 버튼을 누릅니다.
왜 이렇게 해야 하나요?
빌드 결과물은 .exe 실행 파일 하나만 덜렁 나오는 것이 아닙니다. 그 실행 파일에 필요한 데이터 파일, 그래픽 라이브러리 파일 등이 함께 폴더 구조로 생성됩니다.
만약 프로젝트 폴더 최상위에 그냥 저장해 버리면, 기존의 Assets, Library 같은 프로젝트 관리 폴더와 빌드 결과물 파일들이 뒤섞여서 나중에 뭐가 뭔지 알아볼 수 없게 됩니다.
Builds 라는 별도의 폴더에 결과물을 깨끗하게 모아두는 것이 국룰(표준 방식)입니다.
'폴더 선택' 버튼을 누른 후에 일어나는 일
'폴더 선택' 버튼을 누르고 나면, 유니티가 열심히 일을 시작합니다. 프로젝트의 크기에 따라 몇 초에서 몇 분 정도 걸릴 수 있습니다.
빌드가 성공적으로 끝나면, 방금 만든 Builds 폴더 안에 다음과 같은 파일들이 생성될 겁니다.
- stopBadHabitApp.exe (실행 파일)
- UnityPlayer.dll
- MonoBleedingEdge 폴더
- stopBadHabitApp_Data 폴더
- 등등...
이제 저 .exe 파일을 더블클릭하면, 유니티 에디터 없이도 우리가 만든 앱이 실행되는 것을 볼 수 있습니다!
정리하자면:
- Build 버튼 누르기
- Builds 라는 새 폴더 만들기
- Builds 폴더 안으로 들어가서 폴더 선택 누르기
- 빌드가 완료될 때까지 기다리기
- Builds 폴더 안의 .exe 파일 실행해서 감격하기!
이 팝업창! 걱정 마세요. 이건 에러가 아니라 그냥 '알림'에 가깝습니다. 사용자님 프로젝트에는 아무 문제 없습니다. 거의 모든 유니티 초보자가 모바일 템플릿을 사용하면 한 번씩은 마주치는 화면입니다.
이게 도대체 뭔가요? (쉽게 설명)
- Adaptive Performance (적응형 성능): 이걸 '스마트폰을 위한 똑똑한 에어컨' 같은 기능이라고 생각하시면 됩니다.
- 기능: 스마트폰으로 게임을 오래 하면 뜨거워지거나 배터리가 빨리 닳죠? 이 기능은 폰의 온도나 상태를 감지해서, 너무 뜨거워지면 자동으로 게임의 그래픽 품질을 살짝 낮춰서 폰이 식도록 도와주는 등, 최적의 성능을 유지시켜주는 고급 기능입니다.
- Provider (제공자): 이 '똑똑한 에어컨' 기능은 삼성 폰, 구글 폰 등 제조사마다 작동 방식이 조금씩 다릅니다. 그래서 "삼성 폰을 위한 부품(Provider)", "다른 폰을 위한 부품" 등을 따로 설치해 줘야 합니다.
왜 나에게 이게 떴을까요?
사용자님께서 처음에 2D Mobile 템플릿을 선택하셨기 때문입니다.
이 템플릿에는 기본적으로 "나중에 모바일로 출시할 거지? 그럼 이 '적응형 성능' 기능을 쓰는 게 좋을 거야!"라며 이 기능이 켜져 있습니다.
하지만, 이 기능은 오직 안드로이드/아이폰용으로 빌드할 때만 의미가 있습니다.
지금은 PC용(.exe)으로 빌드하고 계시기 때문에, 이 기능은 전혀 필요가 없고 작동하지도 않습니다.
그래서 뭘 눌러야 하나요? (결론)
Ignore (무시) 버튼을 누르세요.
지금은 PC 버전을 만들고 있으므로, 모바일 전용 기능에 대한 알림은 가볍게 무시해도 아무런 문제가 없습니다.
만약 Go to Settings를 누르면, 지금 당장 필요 없는 모바일용 패키지를 설치하는 복잡한 과정으로 넘어가게 됩니다. 그건 나중에 진짜 안드로이드용으로 빌드할 때 고민해도 늦지 않습니다.
요약:
- 이건 PC 빌드와는 상관없는, 모바일 전용 기능에 대한 알림이다.
- 걱정할 필요 전혀 없다.
- Ignore 버튼을 누르고 빌드를 계속 진행한다.
이제 마지막 한 단계, 바로 그 '무슨 함수'를 선택하는 과정만 남았습니다.
지금 바로 이렇게 하세요
- 이미지에 보이는 No Function 이라고 쓰인 회색 드롭다운 메뉴를 클릭하세요.
- 그러면 메뉴 목록이 쭉 나타날 겁니다.
- 그 목록에서 우리가 만든 스크립트의 이름인 **SceneLoader**를 찾으세요.
- SceneLoader 위로 마우스를 가져가면, 그 옆으로 하위 메뉴가 열립니다.
- 그 하위 메뉴 안에 우리가 스크립트에 만들어 둔 함수 이름, LoadCalendarScene() 이 보일 겁니다. 이것을 클릭하세요!
이 과정을 마치면 어떻게 보이나요?
No Function 이라고 쓰여 있던 부분이 SceneLoader.LoadCalendarScene 으로 바뀌어 있을 겁니다.
이렇게 바뀌었다면, 드디어 "이 버튼을 클릭하면, SceneController가 가진 SceneLoader 스크립트의 LoadCalendarScene 함수를 실행하라" 는 완벽한 명령어가 완성된 것입니다.
가장 유력한 원인: CalendarView 씬에 EventSystem이 없습니다.
이게 무슨 소리인가요? (귀가 없는 버튼)
- EventSystem이란?
UI 요소(버튼, 스크롤바 등)에 대한 마우스 클릭, 터치, 키보드 입력 같은 모든 종류의 이벤트를 감지하고 처리하는 총괄 관리자입니다. 이게 없으면 UI는 그냥 '그림'일 뿐, 아무런 상호작용도 할 수 없습니다. - 지금 상황:
HabitList 씬을 처음 만들 때는 UI > Button을 만들 때 EventSystem이 자동으로 생성되었을 겁니다. 하지만 File > New Scene으로 새로운 씬(CalendarView)을 만들고 UI 요소를 추가하면, 가끔 EventSystem이 자동으로 생성되지 않는 경우가 있습니다.
Hierarchy 창의 스크린샷을 보면, CalendarView 씬 아래에 Main Camera와 Canvas는 있지만, EventSystem이 보이지 않습니다. 즉, "뒤로가기" 버튼은 클릭을 '들을' 수 있는 귀(EventSystem)가 없는 상태인 겁니다.
'개발 > 유니티' 카테고리의 다른 글
| [습관어플 만들기]#3 (나머지 기능들..) (4) | 2025.08.29 |
|---|---|
| [습관어플 만들기]#2 (달력및 스크롤뷰) (8) | 2025.08.29 |
| [유니티] 유니티 learn#9 (애니메이션) (3) | 2025.08.28 |
| [유니티] 유니티 learn #8 (5) | 2025.08.28 |
| [유니티] 유니티 learn #7 (0) | 2025.08.25 |