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