무엇을 찾고 계신가요?
Hero background image

숙련된 프로그래머를 위한 Unity 스크립팅

Unity 사용에 앞서 C++ 관련 배경 지식이 있으신가요?

Unity는 Java 또는 C++와 유사한 업계 표준 언어인 C#을 지원합니다.

C#은 C++보다 배우기가 더 쉽습니다. 또한 C#은 "관리형 언어"입니다. 즉, 메모리 할당/할당 취소, 메모리 누수 관리 등 메모리 관리를 자동으로 대신 수행해 줍니다.

게임을 먼저 만든 다음 프로그래밍의 더 세부적인 부분들을 나중에 처리하고 싶은 경우 일반적으로 C#이 C++보다 더 효과적입니다.

Unity의 게임 오브젝트 및 컴포넌트
Unity의 게임 오브젝트 및 컴포넌트
Unity의 스크립팅 컴포넌트
DOTS 기반 Unity 메가시티 데모
DOTS롤 통한 데이터 지향 설계의 이점

기존 게임 오브젝트-컴포넌트 개념은 프로그래머와 비프로그래머 모두가 이해하기 쉽고 직관적인 UI를 구축하기가 간단하여 꾸준히 별 탈 없이 이용되고 있습니다. 게임 오브젝트에 리지드바디 컴포넌트를 추가하면 낙하하기 시작하고, 게임 오브젝트에 광원 컴포넌트를 추가하면 빛을 발산합니다. 이 외에도 적용할 수 있는 다양한 컴포넌트가 있습니다.

하지만 컴포넌트 시스템이 오브젝트 지향 프레임워크로 작성되었기 때문에 개발자는 지속적으로 발전하는 하드웨어의 캐시 및 메모리를 관리하는 데 있어 어려움에 직면합니다.

컴포넌트와 게임 오브젝트는 “C++ 사용이 많은” 오브젝트입니다. 모든 게임 오브젝트는 이름을 지닙니다. 게임 오브젝트의 컴포넌트는 C++ 컴포넌트에 구축된 C# 래퍼입니다. 이러한 이유로 작업하기에는 간편하지만 체계적이지 않은 방식으로 저장될 가능성이 있어 성능 저하가 발생할 수 있습니다. 이러한 C# 오브젝트는 메모리 어디에나 존재할 수 있고, C++ 오브젝트도 마찬가지로 메모리 어디에나 존재할 수 있습니다. 이로 인해 오브젝트들이 서로 인접한 메모리에 그룹화되지 않습니다. 오브젝트가 CPU에 로드되서 처리될 때마다 여러 위치에서 모든 오브젝트를 가져와야 합니다. 이 때문에 처리 과정이 비효율적이고 시간이 많이 걸려 최적화 해결책이 많이 필요하게 됩니다.

이러한 성능 문제를 해결하기 위해 유니티는 고성능 멀티스레드 데이터 지향 기술 스택, 즉 DOTS(현재 프리뷰로 제공)로 Unity의 핵심 기반을 재구축하고 있습니다.

DOTS를 통해 게임에서 최신 멀티코어 프로세서를 최대한 효율적으로 활용할 수 있습니다. DOTS의 구성 요소는 다음과 같습니다.

DOTS에서 ECS는 새로운 컴포넌트 시스템으로, 기존의 오브젝트 지향 방식으로 게임 오브젝트에 수행하던 작업을 이 새로운 시스템에서는 엔티티로 수행합니다. 컴포넌트는 여전히 컴포넌트라고 합니다. 주요 차이점은 데이터 레이아웃입니다. 이에 대한 자세한 내용은 블로그 게시물 “DOTS에서: 엔티티 컴포넌트 시스템(ECS)

DOTS 기반 Unity 메가시티 데모
최신 하드웨어 최대한 활용하기

ECS를 사용하면 디자인 측면에서 더 나은 방식의 게임 프로그래밍이 가능할 뿐 아니라, Unity의 C# 잡 시스템과 버스트 컴파일러를 더욱 효과적으로 이용하여 최첨단 멀티코어 프로세서의 기능을 빠짐없이 활용할 수 있습니다.

DOTS의 멀티스레드 시스템을 활용하면 다양한 하드웨어에서 실행할 수 있는 게임을 만들 수 있고, 더 많은 요소와 더 복잡한 시뮬레이션이 있는 풍부한 게임 월드를 구축할 수 있습니다. 뿐만 아니라 플레이어의 모바일 기기가 과열되거나 배터리 수명이 단축되지 않도록 최적화할 수도 있습니다. 오브젝트 지향 설계에서 데이터 지향 설계로 전환하면 코드를 더 쉽게 재사용할 수 있고 다른 작업자도 해당 코드를 더 잘 이해하고 활용할 수 있게 됩니다.

일부 DOTS 기술이 프리뷰로 제공되고 있으므로 개발자는 이 기술을 전체 프로젝트를 구축하기보다는 프로젝트에서 직면하는 특정 성능 문제를 해결하는 데 활용할 것을 권해드립니다. 이 페이지 하단에 있는 "리소스 더 보기" 섹션에서 DOTS의 주요 리소스에 대한 링크를 확인하세요.

성능 최적화를 위한 Unity 프로파일러
Unity에서 디버깅하기

Unity에서는 모든 게임플레이 변수가 개발자가 플레이할 때 바로 표시되어 코드를 한 줄도 작성하지 않고 다양한 요소를 수정할 수 있기 때문에 효율적인 미세 조정과 디버깅이 가능합니다. 게임을 언제든지 일시중지하거나 코드를 한 번에 한 문(statement)씩 단계별로 처리할 수 있습니다.

Unity의 최적화 기능에 대한 자세한 내용은 다음의 유용한 리소스를 통해 확인할 수 있습니다.

프로파일러

프로파일러 분석기

메모리 프로파일러

Unity의 최적화 기능 알아보기

그래픽 성능 최적화

일반적인 베스트 프랙티스(Unity의 UI 시스템 최적화하기에 대한 광범위한 팁 포함)

Unity의 스크립팅 백엔드

.NET: .NET: Unity는 C#을 기본적으로 지원하는 스크립팅에 표준 Mono 런타임 구현을 사용해 왔습니다. Unity는 현재 macOS에서 MonoDevelop Unity 대신 Mac용 Visual Studio와 함께 제공됩니다. Unity는 Windows에서 Visual Studio와 함께 제공됩니다.

Unity의 .NET 4.6 스크립팅 런타임은 C# 6.0 이상 버전에서 사용 가능한 수많은 흥미로운 C# 신기능 및 디버깅 기능을 지원합니다. 이는 새로운 C# 기능과 더불어 우수한 C# IDE 환경을 제공합니다.

IL2CPP: IL2CPP는 Unity가 개발한 스크립팅 백엔드로, 일부 플랫폼에서 프로젝트를 빌드할 때 Mono 대신 사용할 수 있습니다. 사용자가 IL2CPP를 사용하여 프로젝트를 빌드하려는 경우, Unity는 선택한 플랫폼용 네이티브 바이너리 파일(.exe, apk, .xap 등)을 생성하기 전에 IL 코드를 스크립트와 어셈블리에서 C++ 코드로 변환합니다.

IL2CPP는 iOS와 WebGL용으로 빌드하는 경우에 유일하게 사용 가능한 스크립팅 백엔드입니다.

에디터 확장을 통한 Unity 커스터마이징

리소스 더 보기

DOTS로 게임 전환하기
DOTS로 게임 전환하기
DOTS 기반 메가시티 데모
DOTS 기술 자료
Unity 개발 플랫폼에 포함된 툴 및 서비스
Unity 실시간 3D 플랫폼 개요