UnityでC++を使いたい
UnityでC++のコードを使いたいけどいまいちよく分からない
Windowsでの記事はたくさんあるがMacの記事は少ない
X Codeをインストールすればいいらしいけど、そんな機能の割に容量の喰うアプリを入れたくないと言うことでUnityとC++の開発環境(g++/clang++)があればできる方法を伝えます。
ターミナルでg++は使える前提で話をします。
C++ファイルの作成
lib.h
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
extern "C"
{
int sum(int a, int b); // a+bを求める関数
int listsum(int* array, int size); // 配列の総和を求める関数
};
lib.cpp
#include "lib.h"
int sum(int a, int b)
{
return a + b;
}
int listsum(int* array, int size)
{
int r = 0;
for (int i=0;i<size;i++)
{
r += array[i];
}
return r;
}
ビルドしてUnityで使う
Apple clangを使ってビルドします
Apple clangの導入方法はターミナルで clang
または gcc
と打つだけ
あとは指示に従だけ......
clang++ --version
または g++ --version
と打ってみて何も異常がなければ大丈夫です
多分、clang
と一緒にclang++
もインストールされると思う
実は、Macのg++
コマンドというのは、clang++
コマンドのリンクが貼ってあるだけ
本当のg++
の使い方はまた今度......
$ clang++ -dynamiclib -o lib.bundle lib.cpp
UnityでC#と連携
MainScript.cs
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
static class DLL
{
[DllImport("lib")]
public static extern int sum(int a, int b);
[DllImport("lib")]
public static extern int listsum(System.IntPtr array, int size);
}
public class MainScript : MonoBehaviour
{
public int[] Array;
// Start is called before the first frame update
void Start()
{
Debug.Log(DLL.sum(1, 2));
System.IntPtr ptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * Array.Length);
Marshal.Copy(Array, 0, ptr, Array.Length);
Debug.Log(DLL.listsum(ptr, Array.Length));
Marshal.FreeCoTaskMem(ptr);
}
// Update is called once per frame
void Update()
{
}
}
Asset内の適当なフォルダにlib.bundle
を置いてUnityEditor上から配列の中身を適当に設定して実行する。
ちゃんとConsoleに出力されれば成功!!!