这几天一直在搜Unity怎么使用C++写的类,百度出来的都是如何在C++中调C++写的Add方法,很苦恼,然后google第一条就找到了国外网友的答案
先给出在Unity中怎么调C++写的Add方法的示例,这个示例已经是全网传遍了的。
// Add.cpp
extern "C" _declspec(dllexport) int Add(int x, int y);
int Add(int x, int y) {
return x + y;
}
public class CallCpp : MonoBehaviour {
[DllImport("UnityCall", EntryPoint = "Add")]
public static extern int Add(int x,int y);
void Start () {
Debug.Log(Add(1,2));
}
}
然后是如何在Unity中使用C++写的类,直接导出是不行的,而某外国网友提供的方法中,是使用函数来代替类的相关方法,类还是那个类,这是改用函数来是用来了,思路就像是用C来实现面向对象,实现比较简单,也很巧妙。
首先随便定义一个类
// Echo.h
#pragma once
class Echo {
public:
Echo(float xx = 0.0f);
~Echo();
float x;
void setX(float);
float getX();
};
// Echo.cpp
#include "Echo.h"
Echo::Echo(float xx) {
this->x = xx;
}
Echo::~Echo() {
}
void Echo::setX(float xx) {
this->x = xx;
}
float Echo::getX() {
return this->x;
}
然后写相关函数来操作类的指针,还包括指针的回收
#include "Echo.h"
extern "C" {
_declspec(dllexport) Echo* GenerateEcho(float x);
_declspec(dllexport) void setX(Echo* echo, float x);
_declspec(dllexport) float getX(Echo* echo);
_declspec(dllexport) void ReleaseEcho(Echo *echo);
Echo * GenerateEcho(float x)
{
return new Echo(x);
}
void setX(Echo * echo, float x)
{
echo->setX(x);
}
float getX(Echo * echo)
{
return echo->getX();
}
void ReleaseEcho(Echo * echo)
{
echo->~Echo();
delete echo;
}
}
在Unity中导入这些函数使用就行了,这也暗示了可以使用C#来封装这些函数,写成相应的同名类。
public class CallCpp : MonoBehaviour {
[DllImport("UnityCall")]
public static extern IntPtr GenerateEcho(float x);
[DllImport("UnityCall")]
public static extern void setX(IntPtr echo,float x);
[DllImport("UnityCall")]
public static extern float getX(IntPtr echo);
[DllImport("UnityCall")]
public static extern void ReleaseEcho(IntPtr echo);
private IntPtr echo;
// Use this for initialization
void Start () {
this.echo = GenerateEcho(3.0f);
Debug.Log(getX(echo));
setX(echo,2.5f);
Debug.Log(getX(echo));
ReleaseEcho(echo);
}
}
Date:2019.4.19