김산나
[멋쟁이사자처럼부트캠프 유니티 게임 개발 7기] 2026년 2월 9일 회고록 - 씬 이동, PlaformEffector, Timeline, Inventory 구현(자료구조) 본문
[멋쟁이사자처럼부트캠프 유니티 게임 개발 7기] 2026년 2월 9일 회고록 - 씬 이동, PlaformEffector, Timeline, Inventory 구현(자료구조)
김산나 2026. 2. 9. 17:532026_02_09 강의 요약본

오늘도 고봉밥.
힘내보자
1. 씬 이동
using UnityEngine.SceneManagement;
--- 어딘가의 메서드
SceneManager.LoadScene("Boss");
---
Boss Scene으로 넘어가는 법
참고로

실제로 씬 목록(File > Build Profile > Scene List)에 있어야 넘어갈 수 있다.
Scene목록에 Boss없으니까 저거 작동 안 함
2. PlaformEffector

당연히 딱딱한 바닥은 플레이어에게 차갑다.

2D에도 이런 기능을 구현할 수 있을까?
이걸 가능하게 하는 방법이 PlaformEffector이다.

올라갈 발판에 Platform Effector 2D 컴포넌트 설치

콜라이더에 Used By Effector 체크 on

그럼 뭔가 이런 반구가 뜬다.

이렇게 올라갈 수 있다.
메이플 밑점같은 거도 구현할 수 있다. (저 타일에서 걷는 중에 하단 키를 누르면 Surface Arc 각도를 일시적으로 0으로 만든다거나....)
3. Timeline
어려운 내용은 아닌데
구라안치고버그가1분에하나씩터져서
뇌를 비웠다.
카메라 애니메이션 그냥 타임라인 내부에서 촬영하세요
시작합니다.

빈 오브젝트에 Playable Dirctor추가.


Timeline창을 준비합니다.
Window > Sequencing > Timeline
Timeline오브젝트를 클릭하면 아래처럼 바뀌는데

Create클릭, 적당히 저장합니다.

그럼 뭔 애니메이션같은 화면 나옴.

왼쪽 창 우클하면 생성할 수 있는 트랙이 쭉 뜬다.

오늘 배운 건 대충 이정도이다.
- Screen Fader Track: 페이드 인, 아웃 제어
- Activation Track: 오브젝트 켜고 끄기
- Animation Track: 애니메이션 재생
- Audio Track: 음성 재생
- Text Switcher Track: Text교체
1) 페이드 인


PPAP전법으로 둘이 합체한다
그럼 페이드 인 완성
2) 애니메이션

애니메이터 넣어두고 여러 애니메이션을 한 트랙에 넣을 수도 있지만, 겹쳐넣고 싶은 경우,

이렇게 오버라이드 트랙을 하나 만들어서 거기에 넣으면 된다.
3) 말풍선

말풍선과 대사가 있는 캔버스를 Activation 트랙에 올려두고, 대사 표시할 때만 Active하면 된다.

텍스트는 이런 식으로 설정할 수 있다.
4) 사운드

평범하게 사운드 리소스를 끌어다 붙여넣으면 된다. EZ
5) 카메라
카메라가 레전드인데, 방법을 찾아보았다.
애니메이션 트랙 생성

시네머신 카메라를 넣어준다. (메인 카메라에 cinemachine Brain있어야함)
넣어줬으면 게임화면을 본다. 높은 확률로 z값이 틀어져 세팅을 해줘야 할 거임.
-10, -20정도로 세팅해준다.

레코딩 On

우리는 줌인을 구현할 거기 때문에 이거 두 개 Add Key해서 입맛대로 조정한다.

잘 된다.
이게 제일 쉬운듯 ㅠㅠ
4. Inventory 구현(자료구조)
List를 활용한 인벤토리를 가볍게 배웠다.
using System.Collections.Generic;
using UnityEngine;
public class InventorySystem : MonoBehaviour
{
// 인벤토리 내부 저장소
public List<Item> items = new List<Item>();
// Item 추가: List.Add는 평균 O(1)
public void AddItem(Item item)
{
items.Add(item);
}
public void RemoveAt(int index)
{
if (index < 0 || index >= items.Count) return;
var it = items[index];
items.RemoveAt(index);
}
// 특정 ID를 가진 아이템의 인덱스 찾기 (선형 분석)
public int IndexOf(string id) => items.FindIndex(i => i.id == id);
}
리스트를 생성하고
아이템을 리스트에 추가하는 메서드
특정 인덱스의 아이템을 배열에서 제거하는 메서드
public int IndexOf(string id) => items.FindIndex(i => i.id == id);
얜 먼가요?
public int IndexOf(string id)
{
return items.FindIndex(i => i.id == id);
}
이거랑 같은 뜻입니다.
간단하게 테스트해볼 UI를 만들어봅시당
[Header("인벤토리 참조")]
public InventorySystem inventory;
[Header("UI 버튼 (Inspector에서 연결)")]
public Button btnAddPotion;
public Button btnAddSword;
public Button btnRemoveFirst;
public Button btnClear;
[Header("인벤토리 표시 텍스트")]
public Text txtDisplay; // UnityEngine.UI.Text 사용
// 아이템 추가 시 번호를 붙이기 위한 카운터
int potionCount = 0;
int swordCount = 0;
필드
void Start()
{
// inventory가 비어있으면 같은 오브젝트에서 찾기
if (inventory == null)
inventory = GetComponent<InventorySystem>();
// 버튼 이벤트 연결
if (btnAddPotion != null)
btnAddPotion.onClick.AddListener(OnAddPotion);
if (btnAddSword != null)
btnAddSword.onClick.AddListener(OnAddSword);
if (btnRemoveFirst != null)
btnRemoveFirst.onClick.AddListener(OnRemoveFirst);
if (btnClear != null)
btnClear.onClick.AddListener(OnClear);
RefreshDisplay();
}
시작 메서드
컴포넌트, 버튼들의 준비운동
void OnAddPotion()
{
potionCount++;
inventory.AddItem(new Item("potion", $"포션 #{potionCount}"));
LogCapacity();
RefreshDisplay();
}
포션을 추가하는 메서드.
포션 개수를 ++하고
인벤토리에 문자열 두 개를 집어넣는다. (이름, 개수)
void OnAddSword()
{
swordCount++;
inventory.AddItem(new Item("sword", $"검 #{swordCount}"));
LogCapacity();
RefreshDisplay();
}
이번에는 칼 아이템을 추가한다. 내용은 동일함.
void OnRemoveFirst()
{
if (inventory.items.Count == 0)
{
Debug.LogWarning("인벤토리가 비어있습니다!");
return;
}
inventory.RemoveAt(0);
RefreshDisplay();
}
이번에는 첫 번째 배열의 아이템을 제거하는 메서드
0번 아이템을 제거한다.
void OnClear()
{
inventory.items.Clear();
Debug.Log("인벤토리 전체 삭제");
RefreshDisplay();
}
이건 전체 배열 삭제 메서드.
사실 메서드랄게 필요없는데, RefreshDisplay쓴다고 만든듯
void RefreshDisplay()
{
if (txtDisplay == null) return;
var items = inventory.items;
string text = $"=== 인벤토리 (Count: {items.Count} / Capacity: {items.Capacity}) ===\n\n";
if (items.Count == 0)
{
text += "(비어 있음)";
}
else
{
for (int i = 0; i < items.Count; i++)
{
text += $"[{i}] {items[i].displayName} (id: {items[i].id})\n";
}
}
txtDisplay.text = text;
}
배열에 있는 애들 싹꺼내서 새로고침해주는 메서드.
// Capacity 변화를 콘솔에 출력 (List의 동적 배열 확장 관찰용)
void LogCapacity()
{
Debug.Log($" → List.Count = {inventory.items.Count}, List.Capacity = {inventory.items.Capacity}");
}
머이건 콘솔확인용입니다.

기가막히는군요
===========================================================
씬 이동을 할 수 있게 되었다 !
PlatformEffector2D 사용법을 배웠다 !
씬 연출을 배웠다 !
인벤토리를 구현했다 !

'Unity Engine' 카테고리의 다른 글
| 유니티 세팅 (0) | 2026.02.11 |
|---|---|
| [멋쟁이사자처럼부트캠프 유니티 게임 개발 7기] 2026년 2월 10일 회고록 - Stack, Queue, Tree 그리고 enum (0) | 2026.02.10 |
| [멋쟁이사자처럼부트캠프 유니티 게임 개발 7기] 2026년 2월 6일 회고록 - 공격, 산테비스탄, 커서 변경, 포스트 프로세싱, 슬로우, 적 인식 및 유도까지 (0) | 2026.02.06 |
| [멋쟁이사자처럼부트캠프 유니티 게임 개발 7기] 2026년 2월 5일 회고록 - 플랫포머 2 - 맵 세팅,점프, 벽점프, 각종 이펙트 (0) | 2026.02.06 |
| [멋쟁이사자처럼부트캠프 유니티 게임 개발 7기] 2026년 2월 4일 회고록 - 깃 협업 2, NavMeshplus, 플랫포머 1 (0) | 2026.02.04 |