Unity 스크립팅 API 가이드 (2022.3)
이 문서는 Unity의 스크립팅 API를 소개하고, 이를 효과적으로 활용하기 위한 방법과 주의사항에 대해 설명합니다.
Unity의 .NET 개요
Unity는 오픈 소스 .NET 플랫폼을 사용하여 다양한 하드웨어 설정에서 실행될 수 있도록 합니다. .NET 플랫폼은 여러 언어와 API 라이브러리를 지원합니다.
스크립팅 백엔드
Unity에는 두 가지 스크립팅 백엔드가 있습니다: Mono와 IL2CPP. 이들은 각각 다른 컴파일 기술을 사용합니다.
- Mono: JIT(Just-In-Time) 컴파일을 사용하며, 런타임 시점에 코드를 컴파일합니다.
- IL2CPP: AOT(ahead-of-time)를 사용하여 실행되기 전에 전체 애플리케이션을 컴파일합니다.
스크립팅 백엔드 선택
애플리케이션용 플레이어를 빌드할 때 사용할 스크립팅 백엔드를 선택할 수 있습니다. Unity 에디터에서 Edit > Project Settings > Player
로 이동하여 Other Settings
패널에서 Scripting Backend
드롭다운을 통해 선택 가능합니다.
관리되는 코드 스트리핑
Unity는 빌드 과정에서 사용하지 않는 코드를 감지하고 제거하여 최종 바이너리 크기를 줄입니다. 관리되는 코드 스트리핑은 기본적으로 Mono에서는 비활성화되어 있지만, IL2CPP에서는 비활성화할 수 없습니다.
스트리핑 수준을 설정하려면 다음을 따르세요: 1. Edit > Project Settings > Player
로 가세요. 2. Other Settings
패널에서 Managed Stripping Level
드롭다운을 클릭하여 설정합니다.
코드 스트리핑 위험
스트리핑 레벨을 높이면 Unity가 더 많은 코드를 제거합니다. 이로 인해 리플렉션을 사용하거나 런타임에 코드를 생성하는 경우 의도한 코드를 제거할 위험이 있습니다.
가비지 컬렉션
Unity에서는 Mono와 IL2CPP 백엔드 모두에 대해 Boehm 가비지 컬렉터를 사용합니다. 기본적으로 증분 모드를 권장하며, 이를 통해 CPU 스파이크를 줄일 수 있습니다.
가비지 컬렉션을 비활성화하고 싶다면, Edit > Project Settings > Player
로 가서 Other Settings
패널에서 Use incremental GC
체크박스를 클릭하면 됩니다.
.NET 시스템 라이브러리
Unity는 여러 플랫폼을 지원하지만, 플랫폼별로 .NET 시스템 라이브러리에 대한 지원이 다를 수 있습니다. 다음과 같은 사항에 유의해야 합니다:
- Unity는 System.Drawing 라이브러리를 지원하지 않습니다.
- Mono 백엔드에서는 JIT 컴파일을 통해 동적 코드를 생성할 수 있습니다.
타사 .NET 라이브러리 사용
타사 .NET 라이브러리를 사용할 때는 광범위하게 테스트된 라이브러리만 사용하는 것이 좋습니다. 이는 JIT와 AOT의 성능 특성이 많이 다를 수 있기 때문입니다.
타사 라이브러리 고려사항
- 호환성: 모든 Unity 플랫폼 및 스크립팅 백엔드와 호환되지 않을 수 있습니다.
- 성능: Unity의 성능 특성이 다른 .NET 런타임에 비해 차이가 있을 수 있습니다.
- AOT 바이너리 크기: 종속성 개수로 인해 바이너리 크기가 커질 수 있습니다.
가비지 컬렉터 오버헤드 최소화
C# 리플렉션 오브젝트는 내부적으로 캐싱되며 가비지 컬렉터가 이를 스캔하지 않습니다. 가비지 컬렉터 오버헤드를 줄이기 위해, 다음과 같은 메서드를 피하는 것이 좋습니다:
Assembly.GetTypes
Type.GetMethods()
UnityEngine.Object 특수 동작
UnityEngine.Object는 네이티브 C++ 오브젝트와 연결된 C# 오브젝트로, 메모리와 가비지 컬렉션 관리에 특이점을 가집니다. 예를 들어, MonoBehaviour나 ScriptableObject는 파괴되면 다시 로드되지 않습니다.
async 작업 및 await 작업의 제약 사항
Unity API는 스레드에 안전하지 않으므로 UnitySynchronizationContext
안에서만 async 작업을 사용해야 합니다. 이해를 돕기 위해 다음과 같은 상황을 피해야 합니다:
Task.Run
API를 사용하여 스레드를 수동으로 생성하는 것.- 플레이 모드를 종료할 때 async 작업을 자동으로 멈추지 않음.
요약
Unity의 스크립팅 환경은 유연하나, 성능과 안정성 유지를 위해 주의가 필요합니다. 특히 타사 라이브러리 사용 시, 그 호환성 및 성능을 철저히 검토해야 하며, 가비지 컬렉션 및 스트리핑 처리에도 유의해야 합니다.
이 문서의 내용을 바탕으로 Unity의 스크립팅 API를 효과적으로 활용해보세요!