CMakeでUWP用のプロジェクトを生成してDracoのUnity Native Pluginをビルドする

# はじめに
[前回の記事](https://qiita.com/sotanmochi/items/13f0e95da573767be9bf)では、3Dデータ圧縮ライブラリDracoのUnityネイティブプラグインをHoloLensで実行してみました。DracoのDLLをビルドするのに苦戦したので、今後のために手順をメモしておきます。CMakeを使ってビルドするライブラリをHoloLens(UWP)で利用する場合にも参考になるはずです。

# 開発・検証環境
- [Draco Version 1.3.3 release](https://github.com/google/draco/tree/1.3.3)
- CMake 3.11.4
- Visual Studio 2017 (Version 15.6.6)
- Unity 2017.4.2.f2
- Windows 10 Pro

# Dracoとは
Dracoは、Google が開発している、3Dメッシュと点群データの圧縮/解凍のためのオープンソース・ライブラリです。3Dモデルデータの保存や転送を改善することを目的に開発されています。
https://google.github.io/draco/

# DracoのUnity Native Pluginをビルドする
## 手順
1. CMakeのインストール
2. CMakeでVisual Studioのプロジェクトを生成
3. Visual StudioでDLLのビルドを実行

## 1. CMakeのインストール（Windows）
[https://cmake.org/download/](https://cmake.org/download/)にアクセスしてインストーラーをダウンロードする。ダウンロードしたインストーラーを実行する。

![CMake00.png](https://qiita-image-store.s3.amazonaws.com/0/162000/3a0e95d6-f373-d53d-0228-6667b8f02f8b.png)

インストーラーでCMakeをPathに追加するように選択する。

![CMake03.png](https://qiita-image-store.s3.amazonaws.com/0/162000/00258da8-d112-0d3c-acd9-f14652ef6a30.png)

インストール終了後、コマンドプロンプトでCMakeのバージョンを確認する。

```
cmake --version
```

![CMake08.png](https://qiita-image-store.s3.amazonaws.com/0/162000/c82e1e9d-7915-8833-a2bd-c819a15198aa.png)

## 2. CMakeでUWP用のVisual Studioプロジェクトを生成
Dracoのプロジェクトのルートディレクトリ直下にbuildディレクトリを作成する。

![DracoBuildDir.png](https://qiita-image-store.s3.amazonaws.com/0/162000/910f54a9-dfa4-785f-36e7-3d68ca3115cc.png)

buildディレクトリに移動して、コマンドプロンプトで以下のコマンドを実行する。

```
cmake .. -G"Visual Studio 15 2017" -D"CMAKE_SYSTEM_NAME=WindowsStore" -D"CMAKE_SYSTEM_VERSION=10.0" -D"CMAKE_SYSTEM_PROCESSOR=x86" -D"BUILD_UNITY_PLUGIN=ON" -D"CMAKE_CXX_FLAGS=/DWIN32 /D_WINDOWS /W2 /DUNICODE /D_UNICODE /GR /EHsc /wd4146"
```

![DracoCMake.png](https://qiita-image-store.s3.amazonaws.com/0/162000/2c6b74b6-1bd6-24f3-96f4-dbf643cbeadc.png)

Visual Studio 2017のソリューションとプロジェクトが生成される。
![DracoCMakeBuildResult.png](https://qiita-image-store.s3.amazonaws.com/0/162000/d766d81f-4af1-7e1c-82e1-9d548d14af38.png)

## 3. Visual StudioでDLLのビルドを実行

buildディレクトリに生成された「draco.sln」をVisual Studio 2017で開く。

![CMakeVS.png](https://qiita-image-store.s3.amazonaws.com/0/162000/4d302996-44ae-3912-08bf-90381ea3d777.png)

「ビルド->バッチビルド」から「dracodec_unity」のReleaseにチェックを入れて、ビルドを実行する。

![DracoVSBuild.png](https://qiita-image-store.s3.amazonaws.com/0/162000/081449cf-2c7a-f29b-64b1-08d10dcc0a90.png)

ビルドが上手くいくと「build/Release」の直下にDLLファイルが生成されている。

![DracoVSBuildResult01.png](https://qiita-image-store.s3.amazonaws.com/0/162000/bb262535-908d-0fdc-0135-01462ba0fe0f.png)

![DracoVSBuildResult02.png](https://qiita-image-store.s3.amazonaws.com/0/162000/f42d075c-1b27-fb56-8917-954c6ef1edfb.png)

# CMakeコマンドのオプションについて
DracoのUnity Native Pluginをビルドするために実行したCMakeコマンド。

```
cmake .. -G"Visual Studio 15 2017" -D"CMAKE_SYSTEM_NAME=WindowsStore" -D"CMAKE_SYSTEM_VERSION=10.0" -D"CMAKE_SYSTEM_PROCESSOR=x86" -D"BUILD_UNITY_PLUGIN=ON" -D"CMAKE_CXX_FLAGS=/DWIN32 /D_WINDOWS /W2 /DUNICODE /D_UNICODE /GR /EHsc /wd4146"
```

UWP向けにVisual Studio 2017のプロジェクトを生成するオプション。

```
-G"Visual Studio 15 2017" -D"CMAKE_SYSTEM_NAME=WindowsStore" -D"CMAKE_SYSTEM_VERSION=10.0"
```

HoloLens用にDLLをビルドするためにx86を指定するオプション。

```
-D"CMAKE_SYSTEM_PROCESSOR=x86"
```

DracoのUnity Native Plugin(DLL)をビルドできるようにするオプション。

```
-D"BUILD_UNITY_PLUGIN=ON"
```

ビルド時に発生するコンパイラの警告「C4146」を無視するように設定するオプション。

```
-D"CMAKE_CXX_FLAGS=/DWIN32 /D_WINDOWS /W2 /DUNICODE /D_UNICODE /GR /EHsc /wd4146"
```

「/wd4146」以外のフラグは、オプションを指定しない場合でも設定されている値。オプションを指定しない場合にCMAKE_CXX_FLAGSに設定される値は、buildディレクトリに生成されるCMakeCache.txtを見ると確認できる。

オプションでコンパイラの警告「C4146」を無視するように設定しないと、ビルドした時に以下のようにエラーが発生する。

![Warning4146.png](https://qiita-image-store.s3.amazonaws.com/0/162000/1c4235ca-9099-2f1b-eca4-c8cee29e5565.png)

# DLLの動作確認
[前回の記事](https://qiita.com/sotanmochi/items/13f0e95da573767be9bf)で紹介したサンプルプロジェクト「[DracoSampleForHoloLens](https://github.com/sotanmochi/DracoSampleForHoloLens)」に含まれているDLLを自分でビルドしたものに置き換えて動作すれば問題ありません。

HoloLens(UWP)用の「dracodec_unity.dll」を「Plugins\WSA\x86」に配置する時の設定は以下の通りです。

![UnityNativePluginSetting.png](https://qiita-image-store.s3.amazonaws.com/0/162000/95f067d2-dd53-647a-9fa9-6209268f0ed2.png)

実行結果

![DracoSampleForHoloLensResult.jpg](https://qiita-image-store.s3.amazonaws.com/0/162000/95e9a87a-41d3-6dca-09c6-ccc9695773bc.jpeg)

# まとめ
3Dデータ圧縮ライブラリDracoのUnity Native PluginをHoloLensで実行するためにDLLをビルドする手順を紹介しました。CMakeを使ってビルドするライブラリをHoloLens(UWP)で利用する場合の参考になればと思います。

# 参考情報
- [UWPでNativeDllを使う - 三次元日誌(hugo)](http://ousttrue.github.io/post/2017/05/uwp_dll/)