Unity中 Plugin 跨语言 类型转换

Unity 支持Plugin ,有一些代码我们可以用C++ 来编写成 Plugin 供C#调用,但是对于不同语言之间的类型转换就会很纠结。比如说 C# 里面的 string 到C++ 里面是什么?C++里面的string到C#里面是什么?

引自Unity官方的例子

C++咯平台代码如下:

Win32/64

#if _MSC_VER // this is defined when compiling with Visual Studio
#define EXPORT_API __declspec(dllexport) // Visual Studio needs annotating exported functions with this
#else
#define EXPORT_API // XCode does not need annotating exported functions, so define is empty
#endif

// ------------------------------------------------------------------------
// Plugin itself

// Link following functions C-style (required for plugins)
extern "C"
{

// The functions we will call from Unity.
//
const EXPORT_API char*  PrintHello(){
	return "Hello";
}

int EXPORT_API PrintANumber(){
	return 5;
}

int EXPORT_API AddTwoIntegers(int a, int b) {
	return a + b;
}

float EXPORT_API AddTwoFloats(float a, float b) {
	return a + b;
}

} // end of export C block

Android

/*
	This is a simple plugin, a bunch of functions that do simple things.
*/

extern "C" {
	const char* PrintHello(){
		return "Hello";
	}

	int PrintANumber(){
		return 5;
	}

	int AddTwoIntegers(int a, int b) {
		return a + b;
	}

	float AddTwoFloats(float a, float b) {
		return a + b;
	}
}

MAC/IOS

extern "C" {
	const char* PrintHello ();
	int PrintANumber ();
	int AddTwoIntegers(int, int);
	float AddTwoFloats(float, float);
}
/*
	This is a simple plugin, a bunch of functions that do simple things.
*/

#include "Plugin.pch"

const char* PrintHello(){
	return "Hello";
}

int PrintANumber(){
	return 5;
}

int AddTwoIntegers(int a, int b) {
	return a + b;
}

float AddTwoFloats(float a, float b) {
	return a + b;
}

C#调用代码

using UnityEngine;
using System.Collections;
using System;
using System.Runtime.InteropServices;

public class PluginImport : MonoBehaviour {
	//Lets make our calls from the Plugin
	[DllImport ("ASimplePlugin")]
	private static extern int PrintANumber();

	[DllImport ("ASimplePlugin")]
	private static extern IntPtr PrintHello();

	[DllImport ("ASimplePlugin")]
	private static extern int AddTwoIntegers(int i1,int i2);

	[DllImport ("ASimplePlugin")]
	private static extern float AddTwoFloats(float f1,float f2);	

	void Start () {
		Debug.Log(PrintANumber());
		Debug.Log(Marshal.PtrToStringAuto (PrintHello()));
		Debug.Log(AddTwoIntegers(2,2));
		Debug.Log(AddTwoFloats(2.5F,4F));
	}
}

在Unity3d Doc中提到,托管与非托管之间的类型转换可以参照 MSDN中的文档。

https://msdn.microsoft.com/en-us/library/fzhhdwae.aspx

Native Library的使用方法参照 Mono的文档

http://www.mono-project.com/docs/advanced/pinvoke/

上面两个网页文档很详细的介绍了Native Library使用以及托管与非托管之间的转换。

时间: 2024-11-08 10:55:38

Unity中 Plugin 跨语言 类型转换的相关文章

Go语言中调用C语言----类型转换篇

1. 基本类型转换较简单,直接用强制类型转换就可以,如下: Go转换成C: var i int ci := C.int(i) C转换成Go: var i C.int goi := int(i) 2. 字符串类型转换也不是很难,有一点需要注意,就是在将C语言中的char数组转换成Go的string时需要做一点小修改,如下: Go转换成C: var str string cstr := C.CString(str) C转换成Go: /* #include <stdlib.h> #include &

Unity中使用c#语言在开发环境正常发布却报数据类型不支持错误的注意事项

Windows Store Apps: Missing .NET Types Suggest a change Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates whe

Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要哪些组件的支持? 四.如何安装? 五.Golang.Java.Python.PHP之间通过Thrift实现跨语言调用 1) Golang 客户端和服务端的实现及交互 2) python 客户端的实现与golang 服务端的交互 3) php 客户端的实现与golang 服务端的交互 4) java

unity中使用FingerGestures插件3.0

FingerGestures是一个unity3D插件,用来处理用户动作,手势. 译自FingerGestures官方文档 目录 FingerGestures包结构 FingerGestures例子列表 设置场景 教程:识别一个轻敲手势 教程:手势识别器 教程:轻击手势识别器 教程:拖拽手势识别器 教程:滑动手势识别器 教程:长按手势识别器 教程:缩放手势识别器 教程:旋转手势识别器 教程:自定义手势识别器 教程:识别手势事件 建议:使用.net代理事件 fingerGestures包结构 路径,

Unity中所有特殊的文件夹

1. 隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2. Standard Assets在这个文件夹中的脚本最先被编译.这个文件夹中的脚本会被导出到Assembly-CSharp-firstpass, Assembly-UnityScript-firstpass 或 Assembly-Boo-firstpass项目中,依语言而定. 参考http://docs.unity3d.com/Documentation/Ma

【只怕没有几个人能说清楚】系列之二:Unity中的特殊文件夹

参考:http://www.manew.com/thread-99292-1-1.html 1. 隐藏文件夹     以.开头的文件夹会被忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.这种文件我们可以在资源浏览器的时候,能找到这些文件. 2. Standard Assets     在这个文件夹中的脚本最先被编译.一般是放一些Unity 内置的一些资源.     这个文件夹中的脚本会被导出到Assembly-CSharp-firstpass, Assem

在Unity中使用Direct2D

在Unity中可能需要在纹理上面绘制文字.图像等.比如游戏中的显示器,手机等等等等等.太多了. Unity的Textute2D类提供了设置像素的操作,但是这效率实在不敢恭维. 汉字数量巨大,全部贴在一张图上既耗空间,不方便改变字体样式. 使用FreeType2等CPU计算的文字库一帧又画不了多少,毕竟还要提交到显存 于是瞄准了Direct2D,当初学习这图像接口时就被微软说的"能与Direct3D进行完美交互"所吸引. 好在Unity支持DX11了,我们能够在Unity上面使用Dire

Unity中使用Attribute

Attribute是c#的语言特性 msdn说明如下: The Attribute class associates predefined system information or user-defined custom information with a target element. A target element can be an assembly, class, constructor, delegate, enum, event field,interface, method,

【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则

本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/53869998 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 引言 我们知道,在C++领域,作为进阶阅读材料,必看的书是<Effective C++>. 而<Effective C#>之于C# ,是类似<Effective C++>之于C++一样的存在. 这篇文章,