Windows 플레이어용 프로젝트를 빌드할 때 스크립팅 백엔드에 Mono 대신 IL2CPP를 사용할 수 있습니다.
IL2CPP를 사용하여 프로젝트를 빌드하는 경우 Unity는 스크립트의 IL 코드를 변환하고, C++로 다시 조립한 후 네이티브 바이너리를 생성합니다. 자세한 내용은 IL2CPP를 참조하십시오.
IL2CPP 스크립팅 백엔드를 사용할 때 C++(.cpp) 코드 파일을 Unity 프로젝트에 직접 추가할 수 있습니다.C++ 파일은 플러그인 인스펙터 내에서 플러그인 역할을 합니다.Windows 플레이어와 호환되도록 C++ 파일을 설정하면 Unity는 해당 파일을 관리되는 어셈블리에서 생성되는 C++ 코드와 함께 컴파일합니다.
C++ 파일에 대한 플러그인 임포터 설정을 확인하려면 .cpp 파일을 클릭하고 인스펙터의 플랫폼 설정 섹션에서 적절한 Windows 옵션을 선택합니다.
함수들은 생성된 C++ 코드와 연결되어 있으므로 _P/Invoke를 호출할 별도의 DLL 파일은 없습니다. 이런 이유로 DLL 이름 대신 "__Internal" 키워드를 사용할 수 있으며, 이 경우 다음 예제와 같이 런타임 시점에 함수를 로드하는 대신 C++ 링커가 함수를 확인하는 역할을 맡습니다.
[DllImport("__Internal")]
private static extern int
CountLettersInString([MarshalAs(UnmanagedType.LPWStr)]string str);
다음과 같이 NativeFunctions.cpp에서 이러한 종류의 함수를 정의할 수 있습니다.
extern "C" __declspec(dllexport) int __stdcall CountLettersInString(wchar_t* str)
{
int length = 0;
while (*str++ != L'\0')
length++;
return length;
}
링커가 함수 호출을 확인하기 때문에 관리되는 측(관리되는 런타임에서 실행되는 C# 코드)의 함수 선언에서 오류가 발생하면 런타임 오류가 아닌 링커 오류가 발생합니다.즉, 런타임 중에 동적 로딩이 발생하지 않으며, 함수가 C#에서 직접 호출되므로 P/Invoke 호출의 성능 오버헤드가 크게 감소합니다.
Unity는 소스 코드 플러그인을 생성된 C++ 코드와 동일한 C++ 컴파일러 인자를 사용하여 컴파일하며, 이는 수정할 수 없습니다.일부 플러그인 소스 코드에 C++ 컴파일러 인자를 제어해야 하는 경우 대신 네이티브 플러그인을 빌드해야 합니다.자세한 내용은 네이티브 플러그인을 참조하십시오.
IL2CPP 스크립팅 백엔드를 사용하는 프로젝트는 일반적으로 다음 파일을 생성합니다.
다음 파일은 IL2CPP를 사용하는 프로젝트에 공통적으로 생성됩니다.
| 파일: | 설명: |
|---|---|
| a_Data | 게임 데이터가 있는 폴더입니다. |
| a.exe | 메인 게임 실행 파일입니다. |
| UnityCrashHandler64.exe | 크래시 핸들러 실행 파일입니다. |
| UnityPlayer.dll | 모든 네이티브 코드가 포함된 Unity 플레이어 라이브러리입니다. |
| WinPixEventRuntime.dll | Windows 런타임용 PIX입니다.이 파일은 개발 빌드에만 있습니다. |
| a_BackUpThisFolder_ButDontShipItWithYourGame | 게임 디버깅에 필요한 데이터가 들어 있는 폴더입니다. 여기에는 스크립트에서 생성되는 C++ 코드와 PDB(디버그 정보) 파일이 포함됩니다. 빌드를 배포할 때마다 이 폴더를 백업해야 하지만, 재배포하지는 마십시오. |
| GameAssembly.dll | IL2CPP 런타임과 모든 스크립트 코드가 포함된 라이브러리입니다. |
| SymbolMap | 모든 관리되는 함수 주소와 해당 길이 리스트가 포함된 파일입니다.IL2CPP는 이 파일이 있어야 관리되는 스택 추적을 확인할 수 있습니다.이 파일을 삭제해도 게임은 여전히 실행되지만 예외가 적절한 호출 스택을 생성하지 않습니다. |