안녕하세요.
이번에는 Unity에서 C++코드 사용하는 다양한 방법을 알아보았고, 정리 겸해서 블로깅 하게 되었습니다.
제가 확인했던 부분은 Editor에서는 Windows, macOS확인했고 Build로 확인한 건 Windows, macOS, Android, iOS, WebGL 입니다. 콘솔 플랫폼을 제외하고는 대부분 확인 진행한 것 같네요.
1. 정리
우선은 제가 알아본 것들의 결론을 표로 정리해보았습니다.
플랫폼 | 라이브러리 파일 임포트 | 소스 파일 임포트 |
Editor (Windows) | *.dll | X |
Editor (macOS) | *.bundle | X |
Windows | *.dll | IL2CPP 필요 |
macOS | *.bundle | IL2CPP 필요 |
Android | *.so | IL2CPP 필요 |
iOS | X | O |
WebGL | X | O |
(macOS의 경우 IL2CPP로 빌드하면 크래시가 나는데 이유는 모르겠습니다. 매뉴얼로는 가능하다고 적혀있어서 IL2CPP필요 라고 적어두었는데, 혹시 이 부분에 대해 잘 아시는 분은 덧글로 남겨주세요)
라이브러리 파일 임포트와 소스 파일 임포트로 구분했는데, 위 이미지처럼 특정 확장자의 파일로 빌드하여 임포트하는 것과 소스파일(cpp)와 헤더파일(h)을 그대로 임포트 하는 것을 구분 지었습니다.
IL2CPP가 필요한 플랫폼은 [Player Settings] - [Player]로 들어가시면 위 이미지처럼 플랫폼별로 설정이 가능합니다.
iOS나 WebGL은 따로 존재하지 않는데 기본적으로 IL2CPP로 빌드되고 있기 때문입니다.
라이브러리 파일이 각각 플랫폼마다 달라지는 이유는 OS가 다르기 때문에 어쩔 수 없는 것 같습니다.
그래도 IL2CPP를 지원하는 플랫폼은 소스 파일을 그대로 사용하면 되어서 어렵지 않으나, IL2CPP가 아니라 Mono로 빌드해야 하는 경우도 있어서 범용성을 위해 라이브러리 파일로 빌드하는 경우도 많습니다. 더군다나 에디터에서는 소스 파일 그대로 사용할 수 없는 게 가장 큰 문제입니다.
개인적으로는 라이브러리 파일을 버리고 싶지만, 어쩔 수 없이 계속 써 나가야 할 것 같습니다.
2. 라이브러리 파일 빌드
라이브러리 파일을 빌드하는 부분은 설명이 잘 되어있는 다른 링크들을 적어두겠습니다.
- *.dll: https://docs.microsoft.com/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp
- *.bundle: https://techtoart.tistory.com/91
- *.so: https://xmobile.tistory.com/entry/Android-SO-%ED%8C%8C%EC%9D%BC-%EB%A7%8C%EB%93%A4%EC%96%B4-%EB%8B%A4%EB%A5%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0
(Visual Studio에서도 so파일을 빌드할 수 있다고 해서 테스트해봤는데, 저는 아무리 해도 안되고 삽질만 하다 포기했습니다. 혹시 이 부분에 대해 아시는 분 계시면 덧글로 남겨주시길 바랍니다...😢)
so파일을 빌드하는 방법은 워낙 다양하고 많아서 직접 찾아보시길 권장드립니다.
3. 유니티에서 사용하기
https://docs.unity3d.com/Manual/Plugins.html
Unity - Manual: Plug-ins
Assembly Definition File Format Import and configure plug-ins Plug-ins In Unity, you normally use scriptsA piece of code that allows you to create your own Components, trigger game events, modify Component properties over time and respond to user input in
docs.unity3d.com
유니티 메뉴얼에 자세한 내용들이 다 담겨있습니다.
제가 설명드리는 것보다는 매뉴얼이 자세하고 정확하게 나와있어 메뉴얼 링크만 첨부하겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
public static class DLLClass
{
#if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
const string DLL_NAME = "DLLTest2_macOS";
#elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
const string DLL_NAME = "DLLTest2_CLR";
#elif UNITY_ANDROID
const string DLL_NAME = "dlltest2_android";
#elif UNITY_IOS || UNITY_WEBGL
const string DLL_NAME = "__Internal";
#else
const string DLL_NAME = "__Internal";
#endif
[DllImport(DLL_NAME)]
public static extern void fibonacci_init(ulong a, ulong b);
[DllImport(DLL_NAME)]
public static extern bool fibonacci_next();
[DllImport(DLL_NAME)]
public static extern ulong fibonacci_current();
[DllImport(DLL_NAME)]
public static extern int fibonacci_index();
}
제가 공부해보면서 사용한 C# Class입니다.
DLL이름을 라이브러리 파일의 경우 파일명, 소스 파일의 경우 __Internal로 쓰고 있습니다.
아래는 참고 링크입니다.
- Native Plugins: https://docs.unity3d.com/Manual/NativePlugins.html
- Windows(IL2CPP): https://docs.unity3d.com/Manual/WindowsPlayerCPlusPlusSourceCodePluginsForIL2CPP
- macOS(IL2CPP): https://docs.unity3d.com/Manual/macOSPlayerCPlusPlusSourceCodePluginsForIL2CPP
- Android: https://docs.unity3d.com/Manual/AndroidNativePlugins
- iOS: https://docs.unity3d.com/Manual/PluginsForIOS
- WebGL: https://docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting
처음에는 라이브러리 파일 빌드 및 플랫폼별로 글을 써볼까 했는데, 잘 설명된 글도 많고 이 부분을 종합적으로 정리해두는 것만으로도 좋겠다는 생각이 들어서 정리만 해두었습니다. (사실 라이브러리 파일들 전부 딥하게 들어가려니 감당못하겠어요...)
혹시나 틀린 부분이 있다거나 좀 더 좋은 방법이 있거나 제가 테스트해보지 못한 부분에 대해 알고 계신 분 계시면 덧글로 남겨주세요.
오늘도 글 읽어주셔서 감사합니다.
'Unity Tips' 카테고리의 다른 글
Unity에서 Enum.Parse함수 GC 발생 줄이기 (0) | 2022.05.01 |
---|---|
Unity에서 계층이 있는 데이터 저장 (JSON vs XML vs Scriptable Object) (0) | 2022.04.30 |
Unity에서의 Singleton 3편 - Singleton끼리 서로 참조하는 문제 (0) | 2022.03.09 |
Unity에서의 Singleton 2편 - MonoBehaviour Singleton의 문제점 (0) | 2022.03.06 |
Unity에서의 Singleton 1편 - 싱글턴 클래스 만들기 (5) | 2022.02.20 |