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

Unity를 처음 사용하는 프로그래머의 경우

Unity에서는 스크립트를 사용하여 게임의 거의 모든 부분 또는 기타 실시간 인터랙티브 콘텐츠를 개발할 수 있습니다. Unity는 C# 언어 스크립팅을 지원합니다. Unity에서 C# 스크립팅을 설계하는 주요 방법으로는 2가지가 있는데, 바로 기존의 가장 널리 사용되는 방식인 오브젝트 지향 설계와 현재 Unity에서 지원하는 데이터 지향 설계입니다. 데이터 지향 설계는 현재 Unity의 최신 고성능 멀티스레드 데이터 지향 기술 스택(DOTS)을 통해 특정 사용 사례에 적용할 수 있습니다.

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

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

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

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

Unity의 게임 오브젝트 및 컴포넌트

Unity로 개발한 모든 게임플레이 및 인터랙티브 환경은 게임 오브젝트, 컴포넌트, 변수라는 3가지 기초적인 요소에 기반하여 구성됩니다.

캐릭터, 조명, 특수 효과, 소품 등 게임 내 모든 오브젝트는 게임 오브젝트입니다.

컴포넌트 
게임 오브젝트 자체만으로는 아무 일도 일어나지 않습니다. 실제로 어떤 동작이 발생하려면 컴포넌트를 추가함으로써 게임 오브젝트에 프로퍼티를 적용해야 합니다. 

컴포넌트는 연결된 게임 오브젝트의 동작을 정의하고 제어합니다. 간단한 예로는 광원 생성을 들 수 있습니다. 광원을 생성하려면 광원 컴포넌트를 게임 오브젝트에 연결해야 합니다(아래 참조). 또 다른 예로는 오브젝트에 리지드바디 컴포넌트를 추가하여 해당 오브젝트를 낙하하게 하는 것입니다. 

컴포넌트에는 Unity 에디터의 인스펙터 창이나 스크립트를 통해 미세 조정할 수 있는 편집 가능한 프로퍼티 가 있으며 프로퍼티의 수에는 제한이 없습니다. 위 예에서 광원의 프로퍼티는 범위, 컬러, 강도 등입니다.

Unity의 스크립팅 컴포넌트

Unity의 빌트인 컴포넌트는 용도가 매우 다양하지만, 게임플레이 로직을 직접 구현하려면 빌트인 컴포넌트가 제공할 수 있는 기능보다 많은 기능이 필요함을 곧 알게 됩니다. 이를 위해 스크립트를 사용하여 사용자 지정 게임 로직 및 동작을 구현하고 그런 다음 이러한 스크립트를 게임 오브젝트에 컴포넌트로서 추가할 수 있습니다. 각 스크립트는 MonoBehaviour라고 불리는 빌트인 클래스에서 파생된 클래스를 구현함으로써 Unity의 내부 작업에 연결됩니다.

스크립트 컴포넌트를 사용하면 게임 이벤트를 트리거하거나, 충돌 여부를 확인하거나, 물리를 적용하거나, 사용자 입력에 반응하는 등의 매우 많은 작업을 수행할 수 있습니다. 자세한 내용은 Unity 스크립팅 API를 참조하세요.

Unity Megacity Demo built on DOTS

DOTS롤 통한 데이터 지향 설계의 이점

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

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

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

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

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

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

Unity Megacity Demo built on DOTS

최신 하드웨어 최대한 활용하기

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

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

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

The Unity Profiler for optimizing performance

Unity에서 디버깅하기

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

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

프로파일러 

프로파일러 분석기

메모리 프로파일러 

Unity의 최적화 기능 알아보기

그래픽 성능 최적화

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

Unity의 스크립팅 백엔드

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

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

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

프로그래머는 Unity에서 인스펙터, 씬 또는 기본 에디터의 기타 빌트인 창과 똑같이 동작하는 자체 커스텀 창으로 에디터를 확장할 수 있기 때문에 매우 융통성 있게 작업할 수 있습니다. 원하는 툴을 Unity에 추가해 팀의 고유한 워크플로와 요구 사항을 지원하여 궁극적으로 효율을 높일 수 있습니다.

유니티에서는 최적의 웹사이트 환경을 제공하기 위해 쿠키를 사용합니다. 자세한 내용은 쿠키 정책 페이지를 참조하세요.

확인