전체 글 26

[Unity/C#] 리플렉션은 왜 느리고, 왜 IL2CPP에서 위험한가

유니티 프로젝트에서 이름(문자열)으로 메서드/필드/프로퍼티를 찾거나 호출하는 순간, 대부분 “리플렉션(Reflection) 계열” 문제(성능/안정성/스트리핑)를 만나게 됩니다.이 글은 Unity + IL2CPP(AOT) 환경을 기준으로, “언제 써도 되는지/언제 피해야 하는지/피할 수 없으면 어떻게 안전장치를 거는지”를 정리합니다.0) 한 줄 요약link.xml / [Preserve]는 코드가 빌드에서 삭제(스트리핑)되는 문제를 막는 장치입니다.하지만 리플렉션 호출이 느린 것(탐색/메타데이터 접근 비용) 자체를 빠르게 만들진 못합니다.런타임(특히 매 프레임) 에서 리플렉션을 쓰면 성능이 무너질 수 있고, IL2CPP(AOT) 에서는 “에디터에서는 OK, 기기에서는 실패” 패턴이 쉽게 나옵니다.1) 유니티..

Public 2026.01.31

[Unity\] On-Screen Stick 으로 모바일 조이스틱 구현하기

모바일 게임을 개발할 때 가장 먼저 부딪히는 난관 중 하나는 바로 이동 컨트롤입니다. 과거에는 Joystick Pack 같은 외부 에셋을 다운로드하거나, UI 터치 좌표를 계산하는 복잡한 코드를 직접 짜야 했습니다.하지만 유니티의 New Input System이 등장하면서, 이제는 On-Screen Stick 컴포넌트 하나로 아주 손쉽게 가상 조이스틱을 구현할 수 있게 되었습니다.오늘은 유니티 공식 기능을 활용해 깔끔하고 반응성 좋은 모바일 조이스틱을 만드는 방법을 알아보겠습니다.1. 사전 준비 (Package 설치)가장 먼저 프로젝트에 Input System 패키지가 설치되어 있어야 합니다.Window > Package Manager를 엽니다.Packages를 Unity Registry로 변경합니다.I..

Public 2025.12.20

[Unity] while 문 그만! Coroutine에서 '우아하게' 기다리기 : WaitUntil, WaitWhile

게임 로직을 짜다 보면 "특정 조건이 만족될 때까지 대기"해야 하는 상황이 정말 많이 발생합니다.플레이어의 HP가 0이 될 때까지 대기스페이스 바를 누를 때까지 대기적들이 모두 사라질 때까지 대기보통 우리는 Coroutine(코루틴)을 사용해 이 문제를 해결하는데요. 여러분은 이 코드를 어떻게 작성하고 계신가요? 오늘은 고전적인 방식과 유니티가 제공하는 조금 더 '우아한' 방식을 비교해 보겠습니다.1. 고전적인 방식: while 루프와 yield return null가장 흔하게 사용되는 패턴입니다. while 문으로 조건을 검사하고, 조건이 만족되지 않으면 yield return null을 통해 1 프레임을 쉬는 방식이죠.예를 들어, 플레이어의 HP가 0 이하가 될 때까지 기다리는 코드는 보통 이렇게 작..

Public 2025.12.20

[Unity] Prefab Variant vs Nested Prefab

1. 한눈에 보는 차이점: 포함 vs 상속가장 많이 하는 실수가 이 둘의 용도를 혼동하는 것입니다. 아래 표로 확실히 정리해 드립니다.핵심 개념포함 (Composition)상속 (Inheritance)관계"A Has a B" (A는 B를 가지고 있다)"B Is a A" (B는 A의 일종이다)예시자동차는 바퀴를 가지고 있다.스포츠카는 자동차의 일종이다.아이콘일반 파란색 큐브화살표가 있는 큐브 아이콘주 사용처씬 구성, 복합 오브젝트 조립 (건물, UI 패널)데이터 변형이 필요한 개체 (적 캐릭터, 아이템)2. 실전 전략: 두 기능을 섞어 쓰기 (The Killer Combo) ⚔️고수들은 이 두 가지를 따로 쓰지 않고 함께 사용합니다. RPG 게임의 아이템 시스템을 예로 들어보겠습니다.단계 1: Nested..

Public 2025.12.18

[Unity] 프리팹 안의 프리팹 : Nested Prefab (중첩 프리팹)

안녕하세요! 유니티로 게임을 개발하다 보면 '프리팹(Prefab)'은 떼려야 뗄 수 없는 존재입니다. 하지만 혹시, 프리팹 안에 다른 프리팹을 넣었다가 수정 사항이 반영되지 않아 고생했던 기억, 없으신가요?과거(Unity 2018.3 이전)에는 프리팹 안에 다른 프리팹을 넣으면 그 연결 고리가 끊어져 버리는 악몽 같은 문제가 있었습니다. 하지만 Nested Prefab(중첩 프리팹) 시스템이 도입되면서 개발 환경은 완전히 달라졌습니다.오늘은 유니티 개발의 생산성을 200% 올려주는 Nested Prefab에 대해 아주 쉽게 정리해 드립니다.1. Nested Prefab이란 무엇인가요?간단히 말해 "프리팹 안에 들어있는 또 다른 프리팹"을 의미합니다.과거에는 '집(House)' 프리팹 안에 '의자(Chai..

Public 2025.12.18

[Unity] 프리팹 간에 상속이 가능하다고? Prefab Variant 활용법

객체 지향 프로그래밍(OOP)에서 클래스 상속(Inheritance)은 코드의 재사용성을 높이는 핵심 개념입니다. 유니티의 Prefab Variant(프리팹 바리언트)를 사용하면, 게임 오브젝트(Prefab) 단계에서도 이 상속의 이점을 그대로 누릴 수 있습니다.단순 복제(Ctrl+D)로 인해 발생하는 유지보수의 문제를 해결하고, 효율적으로 프리팹을 계층화하는 방법을 소개합니다.1. 프리팹의 상속 개념 (Duplicate vs Variant)유니티에서 프리팹을 기반으로 새로운 프리팹을 만들 때는 두 가지 방식이 존재합니다.단순 복제 (Duplicate, Ctrl+D)원본과 완전히 독립된 개체가 됩니다.원본이 수정되어도 복제본에는 아무런 영향을 주지 않습니다.비유: 코드를 복사해서 새 파일(ClassB.c..

Public 2025.12.11

Unity에서 `MonoBehaviour`를 `new`로 만들면 무슨 일이 일어날까?

Unity 개발 중 MonoBehaviour를 만들 때, 보통은 AddComponent()를 사용합니다.그런데 혹시 new 키워드로 MonoBehaviour를 직접 생성하면 어떤 일이 일어날까요?이 글에서는 MonoBehaviour를 AddComponent로 만든 경우와 new로 만든 경우의 차이점을동작, 구조, 런타임 관점에서 자세히 살펴보겠습니다.🧩 1. MonoBehaviour는 일반 C# 클래스가 아니다MonoBehaviour는 단순한 C# 객체가 아니라,Unity 엔진(C++) 쪽 객체와 C# 객체가 연결된 하이브리드 구조입니다.즉,C# 객체: 우리가 코드에서 접근하고 조작하는 부분Unity 네이티브 객체: Unity 엔진 내부에서 실제로 관리되는 GameObject 컴포넌트따라서 new 키워..

Public 2025.10.21

Unity Vector2.Reflect 함수 완벽 가이드

게임 속 물리 계산이나 충돌 처리에서 중요한 개념 중 하나가 바로 "반사"입니다. 예를 들어, 공이 벽에 튕겨 나가거나, 레이캐스트가 표면에 맞고 반사되는 경우를 구현할 때 유용합니다. Unity에서는 이런 상황을 쉽게 처리할 수 있도록 Vector2.Reflect 함수를 제공합니다.1. 기본 정의public static Vector2 Reflect(Vector2 inDirection, Vector2 inNormal); inDirection : 진행 중인 벡터(예: 공의 이동 방향) inNormal : 맞닿은 표면의 법선 벡터(normal) 반환값 : 반사된 새로운 방향 벡터즉, 특정 표면에 어떤 방향 벡터가 부딪혔을 때, 그 표면을 기준으로 대칭된 방향을 계산해서 돌려줍니다.2. 방향 벡터와 ..

Public 2025.08.24

Unity Mathf.Lerp 함수 완벽 가이드

게임에서 자연스럽게 값이 변하거나 점점 다가가는 느낌을 줄 때 자주 사용하는 함수가 있습니다. 바로 Mathf.Lerp 입니다. 예를 들어, 카메라가 부드럽게 이동하거나 UI 값이 서서히 변할 때 이 함수를 활용하면 간단하게 구현할 수 있습니다.1. 기본 정의Mathf.Lerp 함수는 다음과 같이 정의됩니다:public static float Lerp(float a, float b, float t); a : 시작 값 b : 목표 값 t : 보간 계수(0 ~ 1 사이의 값 권장)t가 0일 때는 a, 1일 때는 b를 반환합니다. 0과 1 사이 값에서는 a와 b 사이의 중간 값을 계산해 줍니다.2. 동작 예시// 0과 10 사이에서 절반 지점float value = Mathf.Lerp(0f, 10f, 0..

Public 2025.08.23

Unity Mathf.Clamp 함수 완벽 가이드

게임 개발을 하다 보면, 값이 특정 범위를 벗어나지 않도록 제한해야 할 때가 자주 있습니다. 예를 들어 플레이어 체력(HP) 은 0보다 작아지면 안 되고, 최대 체력을 넘어가서도 안 됩니다. 이럴 때 바로 유용하게 쓰이는 함수가 Mathf.Clamp 입니다.1. 기본 정의Mathf.Clamp 함수는 다음과 같이 정의됩니다:public static float Clamp(float value, float min, float max);value : 제한할 대상 값min : 최소 허용 값max : 최대 허용 값즉, value가 min보다 작으면 min을 반환하고, max보다 크면 max를 반환합니다. 범위 안에 있다면 그대로 반환합니다.2. 동작 예시float hp = 120f;hp = Mathf.Clamp(h..

Public 2025.08.23