UnityのProjectでDLLを使う備忘録
VisualStudio2015を開く
VisualC++ -> Win32コンソールアプリケーションを作成
Win32アプリケーションウィザードが開いたら次へ
アプリケーションの種類:DLL
追加のオプション:空のプロジェクトをonにして完了
.cppと.hを作る。
source.h
#pragma once #define CPULUSSOURCE_API __declspec(dllimport) extern "C"//Unityで使うため { CPULUSSOURCE_API float DllMultiPly(float a, float b, int loopNum = 100000000); }
source.cpp
#include "CPlusSource.h" float DllMultiPly(float a, float b, int loopNum) { for (int i = 0; i < loopNum; i++) { float p = a * b; } return a * b; }
ものすごい重い計算処理(仮)
ビルド前にソリューションプラットフォームをx64に変更。
ビルドしたらプロジェクトフォルダ内のx64内にDLLができている。
できたDLLをUnityProject/Assets/Plugins内に入れてUnity起動。
Scriptを作成しこんな感じで書く
script.cs
public class DllTestScript : MonoBehaviour { [DllImport("DLLTest", EntryPoint = "DllMultiply")]//今回作ったdll public static extern float CPlusOnlyDllMultiplyt( float a, float b, int loopNum = 100000000); void Start () { float tempFloatData = 0; //C++ ProcessLoadTimeStart(); tempFloatData = CPlusOnlyDllMultiplyt(8, 8); ProcessLoadTimeEnd(); Debug.Log(tempFloatData); //C# ProcessLoadTimeStart(); tempFloatData = TestCSharpLibrary.TestCSharpLibrary.SharpMultiply(100000000, 3, 5);//別で用意していたC#dllを使用 //for(int i = 0 ; i < 100000000 ; i++) //{ // float p = 3 * 5; //} //ない場合はこれを関数化して使用 ProcessLoadTimeEnd(); Debug.Log(tempFloatData); } private float CheckTimer = 0; void ProcessLoadTimeStart() { // 現在の経過時間を取得 CheckTimer = Time.realtimeSinceStartup; } void ProcessLoadTimeEnd() { // 処理完了後の経過時間から、保存していた経過時間を引く=処理時間 CheckTimer = Time.realtimeSinceStartup - CheckTimer; Debug.Log("ProcessLoadTime : " + CheckTimer.ToString("0.00000")); } // Update is called once per frame void Update () { } }
Emptyを作ってScriptをアタッチして実行。
割りと苦戦したが1回できてしまえば後はあっさりできた。