Unity x C++プラグインの連携【Windows/OSX】
[C++]側でライブライを作って、Unityから呼び出したい!
今回は目的として UnityのC#側から呼び出すことなので、
C++側でライブラリーを作るメリット/デメリットは触ら
ないことにします。
まず ライブラリーですが、 StaticではなくDynamicの方で
作ることになります。なので、Windowsの場合は dll,OSXの
場合は dylibファイルが作成されます。
MyLibrary.h
#include <iostream>
using namespace std;
extern "C"
{
int sum(int a, int b);
};
MyLibrary.cpp
#include "MyLibrary.h"
int sum(int a, int b)
{
return a + b;
}
単純に a と bを足して結果を返す関数を作り
これをUnityから呼び出します。
まず、このコードを書いて
Windows => Visual Studio => dll
OSX => CLion => dylibを作成します。
その後、Unityに Pluginsフォルダーを作って
MyLibrary.dll と MyLibrary.dylibを配置してC#から呼んでみます。
※同じ内容が入ってる dllとdylibを混在させても問題はなかった!
PluginTest.cs
using UnityEngine;
using System.Runtime.InterpoServices;
using System;
public class PluginTest
{
[DllImport("MyLibrary")] // BUNDLEを呼ぶ場合
//[DllImport("__Internal")] // DLLを呼ぶ場合
private static extern int sum( int a , int b );
public static void Sum(int a, int b )
{
var test = string.Format( "Sum of {0} and {1} is {2}", a ,b ,sum(5,10) );
Debug.Log(test);
}
}
まず、dllの場合は簡単に [DllImport("__Internal")]を付けて、
関数を定義すれば問題なく呼ばれました。
そして、今度は dylibの番で同じことをやってみたら、
は〜い! DllNotFoundExceptionと遭遇しました。色々対応作を調べて
やっと辿り着いたので共有して起きます。
OSXでDynamic Libraryを作ると dylibになるが、これをUnityは無視する
らしい!なので、bundleという拡張子に変えてから Unityにインポートする。
OSX側が勝手に bundleをdylibとして吸収してくれるらしく、あとは
DllImportする時に,bundleのファイル名を書いて拡張子は必要ない!
これでやっと dll も dylibも呼べるようになりました。
2017.7.27 20:18:00
This Article is Written By Kyaw Htin Bala
Tecotec,Inc