C# with C++ (DLL) in Unity

How to use a C++ DLL in Unity’s C# code

우선 다음과 같이 간단한 C++ DLL을 만든다. (DLL을 만드는 상세한 과정은 생략)

DLL(동적 연결 라이브러리)를 선택하여 새로운 프로젝트를 만든다.

DLL의 main entry 함수는 다음과 같다. (자동으로 생성된 상태 그대로)

MyCore.h 파일. 선언부. (흘러가는 시간을 기록할 멤버변수 time을 가지는 간단한 C++ class)

MyCore.cpp 파일. 구현부. (update 함수는 입력으로 들어오는 dt를 time에 더해준다.)

MyWrapper.h 파일. MyCore를 감싸는 wrapping class. (ifdef 블록은 DLL에서 내보낼 때 사용하는 표준방식의 macro이다. 하단 부분과 같이 C#에서 호출할 함수들을 하나하나 직접 선언해주어야 한다.)

MyWrapper.cpp 파일 (생성, 소멸, 그리고 업데이트를 담당하는 함수들의 구현부.)

MyWrapper.h에 명시한 것과 같이 MYLIBRARY_EXPORTS를 정의해준다.

빌드(build)의 결과로 위와 같은 .dll 파일이 만들어진다.

이제 유니티(Unity) 프로젝트를 생성한다.

Unity에서 New Project를 만들고 “Create Empty” 메뉴를 선택한다.

위의 왼쪽 Hierarchy에서 확인할 수 있는 바와 같이 GameObject가 생성되었다. 오른쪽에 있는 [Add Component] 버튼을 클릭한다.

MyTest라는 이름의 Script를 하나 생성한다. (소스코드는 아래에 있음)

Plugins 폴더를 만들고, 탐색기에서 이 위치에 1번 과정에서 생성된 .dll 파일을 복사한다.

MyTest.cs 파일 (스크립트 내용. IntPtr은 정수형으로 주소값을 저장하는 변수로서 C에서 사용하는 void pointer와 같다고 생각하면 된다. Wrapping Class를 생성, 업데이터, 소멸시켜주는 내용의 코드이다. using System.Runtime.InteropServices; 구문을 반드시 추가해주어야 한다.)

실행 결과 (상단에 있는 Play 버튼을 클릭하면 Delta Time과 Total Time을 출력하는 결과를 확인할 수 있다.)