"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

2025/04 20

유니티 클래스 필드 초기화 시점(Awake 이전)에 가능/불가능한 작업

필드 초기화는 Awake() 메서드가 호출되기 전, 클래스 인스턴스가 생성될 때 수행되는 중요한 단계입니다. 이 시점에서 가능한 작업과 불가능한 작업을 명확히 이해하면 안정적인 초기화 코드를 작성하는 데 도움이 됩니다.가능한 작업1. 기본 값 할당단순 타입 초기화단순 타입 초기화public int health = 100;public float speed = 5.0f;public string playerName = "Hero";public bool isActive = true;배열 및 컬렉션 초기화public int[] scores = { 10, 20, 30 };public List items = new List() { "Sword", "Shield" };readonly 필드 초기화public readon..

C#] 오브젝트 컨테이너에 대하여

오브젝트 컨테이너(Object Container)는 런타임에 생성·소멸·관리되는 다수의 객체를 하나의 논리적 공간에 모아 생명주기와 의존성을 통제하는 구조적 장치이다. 흔히 “DI 컨테이너(Dependency Injection Container)”·“서비스 로케이터”·“오브젝트 풀”이 같은 범주에 언급되나, 본 글에서는 의존성 주입을 중심으로 한 컨테이너를 다룬다.1. 필요성결합도 감소 : new를 직접 호출하지 않고 컨테이너가 객체를 주입하므로 클래스 간 직접 의존이 사라진다.테스트 용이성 : 모킹(Mock)을 등록해 교체하면 단위 테스트가 수월해진다.수명 주기 일원화 : Singleton, Scoped, Transient 같은 정책을 메타데이터로 선언해 메모리·성능을 예측 가능하게 만든다.설정 기반 ..

Unity] HealthBar 최적화

단일 Canvas에서 다수 Enemy HealthBar를 효율적으로 그리기대규모 전투 씬에서 적(Enemy)이 50-100마리 이상 등장하면, 각 개체에 World-Space Canvas를 붙이는 전통적 방식은 (1) Canvas Rebuild 비용 증가, (2) GPU Draw Call 분산 실패, (3) 메모리 단편화를 동시에 초래한다. 오늘은 단일 Canvas를 사용하면서도 HealthBar를 실시간으로 갱신할 때 퍼포먼스를 확보한 과정을 정리한다.1. 구조 설계Screen Space - Camera Canvas 1개를 루트에 배치한다. Overlay보다 Camera 모드를 선택한 이유는 UI 카메라가 클립 거리 밖 오브젝트를 무시하므로, 불필요한 HealthBar 좌표 계산을 줄일 수 있기 때문이..

TCP와 UDP비교

TCP와 UDP는 모두 전송 계층(Transport Layer)에 속하는 프로토콜이며, 네트워크 상에서 데이터를 송수신할 때 각각의 목적과 특성에 따라 선택적으로 사용됩니다. 이 둘은 설계 철학이 매우 다르며, 안정성과 속도를 놓고 절충하는 구조입니다.1. 기본 개념항목TCP (Transmission Control Protocol)UDP (User Datagram Protocol)연결 방식연결지향(Connection-Oriented)비연결지향(Connectionless)신뢰성보장됨 (패킷 손실시 재전송)보장 안됨 (손실 무시)순서 보장O (전송 순서 유지)X (순서 보장 안함)흐름 제어있음없음오류 검사있음있음 (간단함)속도상대적으로 느림매우 빠름용도파일 전송, 웹, 이메일 등실시간 스트리밍, 게임, DN..

리플렉션 Reflection

**리플렉션(Reflection)**은 C#을 포함한 .NET 언어에서 런타임에 타입의 메타데이터에 접근하고, 객체의 구조나 멤버를 동적으로 탐색하거나 조작할 수 있는 기능입니다. 정적인 코드 작성 시점이 아닌, 실행 중에 클래스, 메서드, 필드, 속성 등에 접근할 수 있게 해주기 때문에, 매우 유연하고 강력한 기능입니다.1. 리플렉션이 무엇인가?정확히 말하면 System.Reflection 네임스페이스에 포함된 클래스들을 이용해 다음과 같은 작업을 수행할 수 있습니다:특정 타입의 정보(Type, MethodInfo, PropertyInfo 등) 조회인스턴스 생성 (Activator.CreateInstance)메서드 호출 (MethodInfo.Invoke)필드/속성 값 읽기 또는 쓰기 (FieldInfo..

박싱과 언박싱에 메모리에서 일어나는 과정

박싱(Boxing)은 값 형식(Value Type)을 참조 형식(Reference Type)으로 변환하는 과정이다. C#에서 int, struct 등 값 형식은 기본적으로 스택(Stack)에 직접 저장된다. 그러나 박싱이 발생하면 CLR(또는 Unity의 Mono/IL2CPP 런타임)이 다음 절차로 힙(Heap)에 객체를 생성하고 값을 복사한다.힙 영역에 객체 헤더(Object Header) 및 내부 저장소를 위한 메모리 할당스택의 값 형식 비트를 힙 객체의 내부 필드에 복사힙 객체의 주소(참조 Reference)가 스택 변수 영역에 저장힙 객체는 내부에 sync block, 타입 메타데이터 포인터 등 런타임 관리 정보를 포함하며, 32비트 환경에서는 객체 헤더만으로 8바이트 내외의 추가 오버헤드가 발생..

Unity] GetComponent를 최소한으로 사용해야하는 이유

GetComponent()는 Unity에서 매우 자주 사용되는 API이지만, 성능 상의 부담이 있는 함수로 자주 언급됩니다. 그 이유는 호출 시 내부적으로 비교적 무거운 탐색 과정을 수행하고, 네이티브⇄매니지드 경계를 넘는 비용이 있기 때문입니다. 아래는 GetComponent의 동작 원리를 정리한 내용입니다.1. 내부 동작 원리C# → 네이티브 호출GetComponent()는 C# 레벨의 제네릭 메서드로 보이지만, 실제 구현은 Unity 엔진의 C++ 레이어에 있는 GetComponentFastPath 같은 InternalCall을 통해 수행됩니다.// C# 코드MyComponent comp = GetComponent(); 이 호출은 네이티브 코드로 진입하며, 매번 관리 코드와 네이티브 코드 간의 경계..

Unity] Assembly Definition

Unity의 **Assembly Definition(어셈블리 정의)**은 프로젝트의 컴파일 시간을 줄이고, 코드의 모듈화와 의존성 관리를 돕기 위한 기능이다. Unity 2017.3 이후 버전부터 제공되며, 대규모 프로젝트에서 특히 유용하게 사용된다. 이 글에서는 Assembly Definition의 개념, 사용하는 이유, 설정 방법, 그리고 주의할 점에 대해 정리한다.1. 어셈블리 정의란?Unity의 기본 빌드 파이프라인은 Assets 폴더 내부의 스크립트를 전부 **하나의 어셈블리(Assembly-CSharp.dll)**로 묶어 컴파일한다. 이 방식은 프로젝트가 작을 때는 문제가 없지만, 스크립트가 수백 개 이상으로 늘어나면 컴파일 속도가 현저히 느려지고, 변경되지 않은 스크립트도 다시 컴파일하는 문..

Unity] Addressables

Unity의 **Addressable Asset System(어드레서블)**은 게임 개발 시 리소스 관리와 빌드, 로딩을 유연하게 제어하기 위해 도입된 에셋 관리 시스템이다. Addressables은 Unity가 기존에 제공하던 Resources, AssetBundle, SceneManager.LoadScene() 등의 리소스 로딩 기법의 한계를 극복하기 위해 만들어진 고수준 API이며, 특히 대규모 프로젝트나 LiveOps 환경에서 리소스 최적화, 동적 로딩, 패치 관리 측면에서 강력한 기능을 제공한다.1. Addressables의 핵심 개념어드레서블 시스템은 "이름을 통해 에셋을 참조"하는 구조이다. 프로젝트 내 에셋들에 대해 Addressable이라는 라벨을 부여하면, 해당 리소스를 이름(strin..

[TIL] RxModel을 가시화

RxModel을 가시화게임 개발에서 데이터 구조를 시각적으로 검토하는 것은 디버깅과 밸런싱 측면에서 매우 중요하다. 특히 복잡한 반응형(Reactive) 모델을 사용하는 경우, 내부 값의 실시간 변화를 추적할 수 있는 에디터 도구는 개발 효율성과 안정성을 크게 향상시킨다. 오늘은 Unity 에디터에서 RxModel의 내부 값을 효율적으로 시각화하는 방법에 대해 학습하였다.RxModel과 인스펙터 가시화의 과제RxModel은 기본적으로 런타임 중심 구조이며, RxVar, RxFlag, RxEvent 등의 필드를 포함한다. 그러나 이들은 일반 Unity 인스펙터에서 바로 노출되지 않으며, 특히 제네릭 기반 구조는 리플렉션을 통해서도 필드 정보가 정확히 드러나지 않는 경우가 많다. 이러한 점에서, Unity ..

내일배움캠프 2025.04.17