Unity 스크립팅 API 가이드
이 문서는 Unity의 스크립팅 API에 대해 설명합니다. Unity는 다양한 플랫폼에서 동일한 스크립팅 API를 제공하지만, 각 플랫폼마다 고유한 제약이 존재할 수 있습니다. 아래에서는 이러한 제약들을 정리하고, 스크립팅을 사용하는 방법에 대한 설명과 예제를 제공합니다.
플랫폼별 스크립팅 제약
아래 표는 각 플랫폼과 스크립팅 백엔드에 따라 AOT(Ahead-of-time compile) 지원 여부와 스레드 지원 여부를 정리한 것입니다.
| 플랫폼 | AOT 컴파일 지원 | 스레드 지원 |
|---|---|---|
| Android (IL2CPP) | 지원 | 지원 |
| Android (Mono) | 지원 안 함 | 지원 |
| iOS (IL2CPP) | 지원 | 지원 |
| Standalone (IL2CPP) | 지원 | 지원 |
| Standalone (Mono) | 지원 안 함 | 지원 |
| 유니버설 Windows 플랫폼 (IL2CPP) | 지원 | 지원 |
| WebGL (IL2CPP) | 지원 | 지원 안 함 |
AOT 컴파일
모든 플랫폼이 런타임 코드 생성을 지원하지 않기 때문에, JIT(just-in-time) 컴파일을 사용하는 관리되는 코드는 AOT(Ahead-of-time) 방식으로 컴파일되어야 합니다. AOT 방식은 런타임 성능에 영향을 줄 수 있습니다.
반사(Reflection)
반사는 AOT 플랫폼에서 지원되지만, 코드가 런타임에 존재하지 않을 수 있습니다. 이는 AOT 컴파일러가 반사를 통해 필요한 코드를 인식하지 못할 경우 발생합니다.
직렬화(Serialization)
AOT 플랫폼에서는 반사를 통해 직렬화 및 역직렬화를 수행할 때 문제가 발생할 수 있습니다. 필요한 타입이나 메서드가 인식되지 않으면 직렬화가 실패할 수 있습니다.
제네릭(Generics)
제네릭 타입 및 메서드는 AOT 스크립팅에 영향을 미칠 수 있습니다. 예를 들어, 다음과 같은 경우에 AOT가 제대로 작동하지 않을 수 있습니다.
- 런타임에 새 제네릭 인스턴스를 생성하는 경우
- 정적 메서드를 호출하는 경우
이러한 경우를 해결하기 위해서는 특정 제약을 추가하고, IL2CPP가 필요한 코드를 생성할 수 있도록 도와주는 방법이 있습니다.
코드 예제
아래 예제는 IL2CPP에서 제네릭 타입을 사용하기 위해 특별화된 메서드를 정의하는 방법을 보여줍니다.
public void UsedOnlyForAOTCodeGeneration()
{
// Ensure that IL2CPP will create code for MyGenericStruct
// using MyStruct as an argument.
new GenericType<MyStruct>();
// Ensure that IL2CPP will create code for SomeType.GenericMethod
// using MyStruct as an argument.
new SomeType().GenericMethod<MyStruct>();
public void OnMessage<T>(T value)
{
Debug.LogFormat("Message value:{0}", value);
}
throw new InvalidOperationException(
"This method is used for AOT code generation only." +
"Do not call it at runtime.");
}
네이티브 코드에서의 관리 메서드 호출
AOT 플랫폼에서는 네이티브 코드가 호출할 수 있도록 관리되는 메서드를 마셜링해야 합니다. 관리 메서드는 정적이며, 적절한 특성을 사용해야 합니다.
예제
아래는 여러 개의 MonoPInvokeCallback 특성을 가진 메서드를 정의하는 방법을 보여줍니다.
[MonoPInvokeCallback(typeof(Action<long>))]
[MonoPInvokeCallback(typeof(Action<int>))]
private static string NameOfT<T>(T item)
{
return typeof(T).Name;
}
결론
Unity의 스크립팅 API는 다양한 플랫폼에 맞추어 여러 가지 제약이 있습니다. 이러한 제약을 이해하고 적절한 방법으로 코드를 작성하면 더 나은 성능과 안정성을 확보할 수 있습니다. 위의 기술들을 활용하여 다양한 플랫폼에서의 게임 개발을 더욱 수월하게 해보세요!