dadadaxによるしがない技術ブログ

IT系の記事を書いていこうと思う

UnityでC++(NativePlugin)を使う方法1

この記事は2018/5/30に書いたものです

1.はじめに

UnityでC++を使う方法を簡単に説明していきます。

UnityでC++を使うには基本的にC++ソースコードをビルドしてdllを作成し

unity側で参照するだけなので特に難しいことはありませんが、

dllを作成するときにC++の仕様上少し特殊な書き方をする必要があります。

• 環境

  • Windows10 Home 64bit
  • Visual Studio 2017 Version15.7.2 (Language:English)
  • Unity 2018.1.1f1

• 目標

  • 二つのint型変数(引数)の合計を返す簡単な関数ADD_2を持つADD.dllを作成
  • Unity側からADD.dllを参照後ADD_2を呼び出し3dTextに反映する

2.dllの作成

Project→Visual C++Windows Desktop→Windows Desktop Wizardを選択

Nameは短くADDにしました、長ったらしい名前だとコードに書くのに面倒だからです

サンプルプログラムなので特に問題ないと思います。

Dynamic-Link LibraryにしないのはDllMainというエントリポイント等、

余計なファイルが多いのでEmptyを選べるWindows Desktop Wizardにしました。

 Application typeをDynamic Link LibraryにEmpty ProjectとExport Symbolsにチェック

SDLはどっちでもいいです。

 

f:id:dadadax:20180530170857p:plain

まず、ConfigurationをRelease、Platformをx64に変えて

Source FilesにADD.cppをHeader FilesにADD.hを作ります。

次に関数をADD.cppに書いていきましょう

• ADD.cpp

gist84699f3ecf3de1b89c7eaf208d18687d

戻り値型の前についているADD_APIはマクロです。

ヘッダーでマクロ定義します。

• ADD.h

gist324c5bef14316daafad31bcbef584b00

プロジェクトの名前_EXPORTS(ADD_EXPORTS)がすでにマクロ定義されていると

思います。

これを使って#ifdefで分岐させ、ADD_APIを__declspec(dllexport)でマクロ定義します

で、この__declspec(dllexport)がなんなのかというとDLLのエクスポートセクションに

関数名を書き込むためのもの、つまるところこの関数が外部で使われることを解釈させ

るために必要です、これがないと関数はDLL内部で使われるものと解釈されてしまい

ます。

__declspec(dllimport)も同様です、こちらは参照する側つまりEXE側がこの関数が外部

のものであると解釈するのに必要です。

一見これだけでも十分そうですがC++の仕様上名前装飾という問題があります

先ほど、DLLのエクスポートセクションに関数名を書き込むと書きましたが

そのままの関数名で書き込まれるわけではありません

これはマングリングなどと呼ばれるものですが、オーバーロード等の機能を実現するた

の仕様です。

このままエクスポートするとEXE側でエラーを起こします、つまりEXE側が関数を

見つけられないというわけです

どうすればいいかというとextern "C" というキーワードを使ってこの仕様を無効に

できます。

それではビルドしてみましょう、とくに問題なくビルドできると思います。

3.Unityからdllを参照

Unityで適当なプロジェクトを作成していましょう。

私はUnity_ADDという名前にしました

できたらAssetsにPluginsフォルダを作成、先ほど作ったADD→x64→Releaseにある

ADD.dllをコピーします。

ADD.dllを選択後、InspectorタブからPlatform settingsでCPUをx86_64

OSをWindowsに、Platform settingsの隣のタブに移動してx86のチェックを外し

Applyしてください。(この操作はなくても動作しますが一応)

それではSceneに3DTextをMain Cameraの正面に配置してください

名前はADD_Textにしました。

ADD_Textを選択、Add ComponentからNew scriptでScriptを追加してください

名前はADD_Scriptにしました。

f:id:dadadax:20180613201448j:plain

ADD_Scriptを編集していきます。

• ADD_Script.cs

gist55b6d5d8a4608d6db266a979d6dd9e5b

DllImport属性を使ってADD_2を宣言するわけですが、この時

staticとexternの指定を忘れないでください。

usingディレクティブも忘れずに、空間名はSystem.Runtime.InteropServices

になります。

あとはTextMeshコンポーネントのtextプロパティにADD_2の戻り値を代入。

それではゲームをスタートしてください。

f:id:dadadax:20180613201452j:plain

_Aが1、_Bが2なので3です。

無事変わったと思います。