C#은 마이크로소프트가 만든 언어로, 유니티 엔진의 스크립트 언어로 널리 쓰입니다. C++보다 문법이 깔끔하고 메모리를 자동으로 관리해 주기 때문에 게임 프로그래밍 입문 언어로도 많이 선택됩니다. 이 글은 유니티를 시작하려는 사람을 위해 C# 기초 문법을 정리합니다.
C#이 게임 개발에서 쓰이는 이유
유니티에서 캐릭터를 움직이고, 버튼을 누르면 창이 열리게 하는 코드는 대부분 C#으로 작성합니다. C#은 가비지 컬렉터(쓰지 않는 메모리를 자동으로 회수하는 기능)가 있어 메모리를 직접 해제하지 않아도 됩니다. 덕분에 초보자도 기능 구현에 먼저 집중할 수 있습니다.
대신 가비지 컬렉터가 한꺼번에 일할 때 게임이 잠깐 멈추는 현상이 생길 수 있습니다. 그래서 실무에서는 매 프레임 새 객체를 만들지 않도록 신경 쓰는 습관이 중요합니다.
자료형과 값 형식·참조 형식
| 구분 | 예 | 특징 |
|---|---|---|
| 값 형식 | int, float, bool, struct | 변수에 값 자체가 들어감, 복사하면 별개의 값 |
| 참조 형식 | class, string, 배열 | 변수에 위치 정보가 들어감, 복사해도 같은 대상을 가리킴 |
유니티의 Vector3는 struct라 값 형식입니다. 그래서 transform.position의 x만 바로 바꾸려 하면 오류가 나고, 값을 꺼내 바꾼 뒤 다시 넣어야 합니다. 초보자가 자주 만나는 이 문제도 값 형식과 참조 형식의 차이에서 나옵니다.
클래스, 프로퍼티, 접근 제한자
C#의 클래스는 C++와 비슷하게 데이터와 기능을 묶습니다. 유니티에서는 MonoBehaviour를 상속한 클래스를 게임 오브젝트에 붙여 동작을 만듭니다. Start는 시작할 때 한 번, Update는 매 프레임 불리는 함수입니다.
- public 변수: 유니티 인스펙터 창에 표시되어 값을 바로 조정할 수 있음
- private + [SerializeField]: 외부 코드에서는 숨기고 인스펙터에서만 조정
- 프로퍼티(get/set): 값을 읽고 쓸 때 검사 코드를 넣을 수 있음, 체력이 0 아래로 내려가지 않게 막는 식
컬렉션: 배열, List, Dictionary
여러 데이터를 담을 때는 배열, List, Dictionary를 씁니다. 배열은 크기가 고정되고, List는 크기가 늘었다 줄었다 하며, Dictionary는 아이템 ID 같은 키로 값을 빠르게 찾습니다.
- 배열: 고정된 스킬 슬롯 네 칸
- List: 화면에 남아 있는 적 목록
- Dictionary: 아이템 ID로 아이템 정보 찾기
foreach 문을 쓰면 컬렉션의 모든 요소를 간단히 돌 수 있습니다. 다만 도는 도중에 요소를 지우면 오류가 나므로, 삭제할 대상은 따로 모아 두었다가 반복이 끝난 뒤 지웁니다.
델리게이트와 이벤트
델리게이트는 함수를 변수처럼 담아 두는 형식이고, 이벤트는 이를 이용해 '어떤 일이 일어났다'고 여러 곳에 알리는 장치입니다. 플레이어가 죽었을 때 UI, 사운드, 점수판이 각자 반응해야 한다면, 플레이어 코드가 그들을 일일이 부르지 않고 이벤트 하나만 발생시키면 됩니다.
이 방식은 옵저버 패턴과 같은 생각으로, 코드끼리 서로 덜 얽히게 만듭니다. 이벤트 구독을 해제하지 않으면 이미 사라진 오브젝트를 부르는 오류가 생기니, 등록과 해제를 짝으로 관리합니다.
유니티에서는 비슷한 목적으로 UnityEvent도 쓰는데, 인스펙터 창에서 연결할 수 있어 기획자나 아티스트가 함께 다루기 편합니다. 코드로만 연결할지 에디터에서 연결할지는 팀 규칙에 맞춥니다.
연습 순서
- 공을 키보드로 움직이는 스크립트를 작성해 봅니다.
- List로 적을 여러 마리 생성하고 관리해 봅니다.
- 프로퍼티로 체력 값을 안전하게 바꾸도록 만들어 봅니다.
- 이벤트로 사망 시 UI가 바뀌게 연결해 봅니다.
SBS아카데미게임학원 게임프로그래밍 과정은 C# 및 C++를 활용한 게임 시스템 구현과 Unity 기반 실습을 함께 다룹니다.
자주 묻는 질문
C#만 할 줄 알아도 게임 회사에 지원할 수 있나요?
유니티를 쓰는 회사라면 C# 실력이 중심이 됩니다. 다만 자료구조, 알고리즘, 수학 같은 기초도 함께 평가하는 경우가 많습니다.
C#과 자바는 비슷한가요?
문법과 개념이 꽤 비슷해서 한쪽을 알면 다른 쪽을 배우기 쉽습니다. 다만 프로퍼티, 이벤트, struct 등 C#만의 기능은 따로 익혀야 합니다.
