다음을 통해 공유


Unity 및 UWP에서 .NET API 누락

.NET을 사용하여 UWP 게임을 빌드할 때 Unity 편집기 또는 독립 실행형 PC 게임에 사용할 수 있는 일부 API가 UWP에 없는 것을 알 수 있습니다. UWP 앱용 .NET에는 각 네임스페이스에 대한 전체 .NET Framework에 제공된 형식의 하위 집합이 포함되어 있기 때문입니다.

또한 일부 게임 엔진은 Unity의 Mono와 같이 UWP용 .NET과 완전히 호환되지 않는 다양한 버전의 .NET을 사용합니다. 따라서 게임을 작성할 때 편집기에서 모든 것이 제대로 작동할 수 있지만 UWP용 빌드로 이동하면 다음과 같은 오류가 발생할 수 있습니다. 형식 또는 네임스페이스 'Formatters'가 네임스페이스 'System.Runtime.Serialization'에 없습니다(어셈블리 참조가 누락되었나요?)

다행히 Unity는 이러한 누락된 API 중 일부를 확장 메서드 및 대체 형식으로 제공하며, 이는 유니버설 Windows 플랫폼: .NET Scripting 백 엔드에서의 .NET 형식 누락에 설명되어 있습니다. 그러나 필요한 기능이 여기에 없는 경우 Windows 8.x 앱용 .NET 개요 에서는 Windows 런타임 API용 WinRT 또는 .NET을 사용하도록 코드를 변환할 수 있는 방법에 대해 설명합니다. (Windows 8에 대해 설명하지만 Windows 10 UWP 앱에도 적용할 수 있습니다.)

.NET Standard

일부 API가 작동하지 않는 이유를 이해하려면 다양한 .NET 버전과 UWP가 .NET을 구현하는 방법을 이해하는 것이 중요합니다. .NET Standard는 플랫폼 간에 사용될 수 있으며 다양한 .NET 변형을 통합하기 위한 .NET API의 공식 사양입니다. .NET의 각 구현은 특정 버전의 .NET Standard를 지원합니다. 표준 및 구현 테이블은.NET 구현 지원에서 볼 수 있습니다.

UWP SDK의 각 버전은 다른 수준의 .NET Standard를 준수합니다. 예를 들어 16299 SDK(Fall Creators Update)는 .NET Standard 2.0을 지원합니다.

대상으로 지정하는 UWP 버전에서 특정 .NET API가 지원되는지 확인하려면 .NET Standard API 참조 를 확인하고 해당 버전의 UWP에서 지원하는 .NET Standard 버전을 선택할 수 있습니다.

스크립팅 백엔드 구성

UWP를 빌드하는 데 문제가 있는 경우 가장 먼저 해야 할 일은 플레이어 설정을 확인하는 것입니다 (파일 > 빌드 설정에서 유니버설 Windows 플랫폼을 선택한 다음, 플레이어 설정을 확인하십시오). 다른 설정 > 구성에서 처음 세 개의 드롭다운(스크립팅 런타임 버전, 스크립팅 백 엔드Api 호환성 수준)은 모두 고려해야 할 중요한 설정입니다.

스크립팅 런타임 버전은 Unity 스크립팅 백 엔드에서 사용하는 버전으로, 선택한 (대략적인) 동등한 버전의 .NET Framework 지원을 가져올 수 있습니다. 그러나 해당 버전의 .NET Framework의 모든 API가 지원되는 것은 아니며 UWP가 대상으로 하는 .NET Standard 버전에 있는 API만 지원됩니다.

새 .NET 릴리스에서는 독립 실행형 및 UWP에서 동일한 코드를 사용할 수 있는 더 많은 API가 .NET Standard에 추가되는 경우가 많습니다. 예를 들어 System.Runtime.Serialization.Json 네임스페이스는 .NET Standard 2.0에서 도입되었습니다. 스크립팅 런타임 버전 이전 버전의 .NET 3.5 등가 설정하면 API를 사용하려고 할 때 오류가 발생합니다. .NET Standard 2.0을 지원하는 .NET 4.6 등가 전환하면 API가 작동합니다.

스크립팅 백 엔드 .NET IL2CPP수 있습니다. 이 주제에서는 여기서 논의된 문제가 발생하기 때문에 .NET을 선택했다고 가정합니다. 자세한 내용은 백 엔드 스크립팅 을 참조하세요.

마지막으로, Api 호환성 수준을 게임을 실행하려는 .NET 버전으로 설정해야 합니다. 이는 스크립팅 런타임 버전과 일치해야 합니다.

일반적으로 런타임 버전 및 API 호환성 수준스크립팅의 경우 .NET Framework와의 호환성을 높일 수 있도록 사용 가능한 최신 버전을 선택해야 하므로 더 많은 .NET API를 사용할 수 있습니다.

구성: 런타임 버전 스크립팅; 백 엔드 스크립팅; API 호환성 수준

플랫폼 종속적인 컴파일

UWP를 비롯한 여러 플랫폼용 Unity 게임을 빌드하는 경우 플랫폼 종속 컴파일을 사용하여 게임이 UWP로 빌드될 때만 UWP용 코드가 실행되도록 해야 합니다. 이렇게 하면 빌드 오류 없이 독립 실행형 데스크톱 및 기타 플랫폼 및 UWP용 WinRT API에 전체 .NET Framework를 사용할 수 있습니다.

UWP 앱으로 실행할 때만 코드를 컴파일하려면 다음 지시문을 사용합니다.

#if NETFX_CORE
    // Your UWP code here
#else
    // Your standard code here
#endif

비고

NETFX_CORE 는 .NET 스크립팅 백 엔드에 대해 C# 코드를 컴파일하는지 여부를 확인하기 위한 것입니다. IL2CPP와 같은 다른 스크립팅 백 엔드를 사용하는 경우 대신 ENABLE_WINMD_SUPPORT 사용합니다.

일반적인 이슈 및 해결 방법

다음 시나리오에서는 UWP 하위 집합에서 .NET API가 누락된 경우 발생할 수 있는 일반적인 문제와 문제를 해결하는 방법을 설명합니다.

BinaryFormatter를 사용한 데이터 직렬화

일반적으로 게임은 저장 데이터를 직렬화하여 플레이어가 쉽게 조작할 수 없도록 합니다. 그러나 개체를 이진으로 직렬화하는 BinaryFormatter는 이전 버전의 .NET Standard(2.0 이전)에서 사용할 수 없습니다. 대신 XmlSerializer 또는 DataContractJsonSerializer를 고려해보세요.

private void Save()
{
    SaveData data = new SaveData(); // User-defined object to serialize

    DataContractJsonSerializer serializer = 
      new DataContractJsonSerializer(typeof(SaveData));

    FileStream stream = 
      new FileStream(Application.persistentDataPath, FileMode.CreateNew);

    serializer.WriteObject(stream, data);
    stream.Dispose();
}

I/O 작업

FileStream과 같은 System.IO 네임스페이스의 일부 형식은 이전 버전의 .NET Standard에서 사용할 수 없습니다. 그러나 Unity는 게임에서 사용할 수 있도록 디렉터리, 파일FileStream 형식을 제공합니다.

또는 UWP 앱에서만 사용할 수 있는 Windows.Storage API를 사용할 수 있습니다. 그러나 이러한 API는 앱이 특정 스토리지에 쓰도록 제한하고 전체 파일 시스템에 대한 무료 액세스를 제공하지 않습니다. 자세한 내용은 파일, 폴더 및 라이브러리 를 참조하세요.

한 가지 중요한 점은 Close 메서드는 .NET Standard 2.0 이상에서만 사용할 수 있다는 것입니다(Unity는 확장 메서드를 제공하지만). 대신 Dispose을 사용하세요.

스레드 처리

ThreadPool과 같은 System.Threading 네임스페이스의 일부 형식은 이전 버전의 .NET Standard에서 사용할 수 없습니다. 이러한 경우 Windows.System.Threading 네임스페이스를 대신 사용할 수 있습니다.

Unity 게임에서 스레딩을 처리하는 방법으로 플랫폼 종속 컴파일을 사용하여 UWP 플랫폼과 비-UWP 플랫폼 모두에 대비하는 방법은 다음과 같습니다.

private void UsingThreads()
{
#if NETFX_CORE
    Windows.System.Threading.ThreadPool.RunAsync(workItem => SomeMethod());
#else
    System.Threading.ThreadPool.QueueUserWorkItem(workItem => SomeMethod());
#endif
}

안전

System.Security.* 네임스페이스 중 System.Security.Cryptography.X509Certificates와 같은 몇몇 네임스페이스는 UWP용 Unity 게임을 빌드할 때 사용할 수 없습니다. 이러한 경우 Windows.Security를 사용합니다.* API는 동일한 기능의 대부분을 다룹니다.

다음 예제에서는 지정된 이름의 인증서 저장소에서 인증서를 가져옵니다.

private async void GetCertificatesAsync(string certStoreName)
    {
#if NETFX_CORE
        IReadOnlyList<Certificate> certs = await CertificateStores.FindAllAsync();
        IEnumerable<Certificate> myCerts = 
            certs.Where((certificate) => certificate.StoreName == certStoreName);
#else
        X509Store store = new X509Store(certStoreName, StoreLocation.CurrentUser);
        store.Open(OpenFlags.OpenExistingOnly);
        X509Certificate2Collection certs = store.Certificates;
#endif
    }

WinRT 보안 API 사용에 대한 자세한 내용은 보안을 참조하세요.

네트워킹

System.Net 중 일부 .* System.Net.Mail과 같은 네임스페이스는 UWP용 Unity 게임을 빌드할 때도 사용할 수 없습니다. 이러한 API 대부분은 유사한 기능을 활용할 수 있도록 해당 Windows.Networking.* 및 Windows.Web.* WinRT API를 사용합니다. 자세한 내용은 네트워킹 및 웹 서비스를 참조하세요.

System.Net.Mail경우 Windows.ApplicationModel.Email 네임스페이스를 사용합니다. 자세한 내용은 전자 메일 보내기를 참조하세요.

참고하십시오