csharp12 4

C# 12 람다 기본값으로 게임 이벤트 필터를 더 작게 설계하기

게임 코드에서 이벤트 필터는 생각보다 자주 커진다. 퀘스트 조건, 전투 로그, 업적, 튜토리얼 트리거, 서버 검증 로직까지 거의 모든 곳에서 “이 이벤트가 내가 원하는 조건인가?”를 반복해서 묻는다. 문제는 조건이 늘어날수록 메서드 오버로드와 작은 헬퍼 함수가 우후죽순 생긴다는 점이다.C# 12의 람다 기본 매개변수는 이런 코드를 조금 더 작고 읽기 쉽게 만든다. 기존에는 람다 안에서 기본값을 직접 처리하거나 별도 메서드를 만들어야 했다. 이제는 일반 메서드처럼 람다 매개변수에도 기본값을 둘 수 있다.특히 게임 서버나 툴 코드처럼 최신 .NET 런타임을 쓰는 영역에서 유용하다. Unity 본 프로젝트가 아직 해당 문법을 바로 쓰지 못하더라도, 밸런스 검증기, 로그 분석기, 시뮬레이션 툴, 서버 공용 라이..

C#·C++ 모던 2026.07.07

C# 12 [InlineArray]로 Unity 핫패스에서 힙 없이 고정 크기 버퍼 구현하기

왜 고정 크기 버퍼가 필요한가?게임 로직을 짜다 보면 "최대 8개 스킬", "최대 4명 파티원", "최대 16개 투사체" 같이 상한이 명확한 소규모 컬렉션을 수시로 만나게 된다. 가장 손쉬운 선택은 List나 T[]지만, 둘 다 힙 객체를 만들어 GC 추적 대상이 된다. 캐릭터가 1000명이고 스킬이 8개라면 별것 아닌 float[]가 1000개의 소형 힙 오브젝트로 쌓인다.그렇다고 unsafe fixed float[8]로 가자니 unsafe 블록이 코드 전반에 퍼지고, Unity DOTS의 IComponentData처럼 unmanaged 제약이 강한 컨텍스트에서는 fixed 버퍼조차 쓸 수 없는 경우가 생긴다.C# 12에서 도입된 [InlineArray] 어트리뷰트는 이 딜레마를 깔끔하게 해결한다. 단..

C#·C++ 모던 2026.06.14

C# 12 컬렉션 표현식(Collection Expressions)으로 Unity 게임 초기화 코드 반으로 줄이기

Unity 프로젝트를 오래 작업하다 보면 특정 패턴의 코드가 반복적으로 눈에 밟힌다. 아이템 드롭 테이블 초기화, 스폰 포인트 등록, 웨이브 구성 설정 같은 코드들이다. new List() 를 만들고, Add() 를 줄줄이 호출하거나, 중괄호 안에 값을 나열하는 방식은 여전히 작동하지만 읽기 불편하고 길다.C# 12에서 도입된 컬렉션 표현식(Collection Expressions) 은 이 고민을 언어 차원에서 해결한다. 배열, 리스트, 스팬(Span)을 모두 동일한 대괄호 [] 문법으로 초기화할 수 있으며, 여기에 스프레드 연산자 .. 를 더하면 두 컬렉션을 한 줄로 합칠 수도 있다. 코드량이 줄어드는 것 이상으로, 의도를 읽기 쉬운 표현으로 전달할 수 있다는 게 핵심이다.이 글에서는 C# 12 컬렉션..

C#·C++ 모던 2026.06.02

Unity에서 큰 struct 복사 비용 잡기: in, ref readonly, 그리고 defensive copy 함정

게임 코드에서 struct는 GC 압박을 피하려는 우리의 최선의 친구다. Vector3, Matrix4x4, 커스텀 Transform 데이터 묶음처럼 자주 만들고 자주 버리는 값들은 class 대신 struct로 두는 게 정석이다. 그런데 struct가 커지면 다른 문제가 슬그머니 들어온다. 바로 복사 비용이다.class는 참조 하나(8바이트 포인터)만 넘어가지만 struct는 메서드에 넘길 때마다 통째로 복사된다. 16바이트 Vector4 정도면 무시할 만하지만, 64바이트짜리 Matrix4x4나 필드가 잔뜩 박힌 게임 상태 struct를 매 프레임 수천 번 함수에 넘긴다면 이 복사가 누적되어 측정 가능한 비용이 된다. 더 나쁜 건, 우리가 알아채지 못하는 사이에 컴파일러가 몰래 추가로 복사하는 경우다..

C#·C++ 모던 2026.05.24