一日分の備忘録

ゲーム制作におけるいろいろな実装の備忘録。基本的にはゲームエンジン中心。その中でもUE4がメイン。

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回できてしまえば後はあっさりできた。