本文简单说明Unity3d c++插件,并采用boost asio打开串口设备状态在windows android平台下的交互通信。
Unity3d插件简介
Unity3D底层是c++实现的,用户用c#进行开发,不过是用mono开源,开源的 .NET 开发框架。在实际应用中,我们总有一些代码是其他编程语言实现,历史遗留。插件可以是C、C++、Objective-C等语言实现的。
构建插件
1、插件代码
1、百度云盘:里面有SimplestPluginExample-4.0和boost asio打开串口的例子http://pan.baidu.com/s/1mgy47jU
2、目录jni的MyClass.h是关于boost asio打开串口设备代码
3、下面代码来自官方SimplestPluginExample-4.0
#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
2、构建Windows插件
打开SimplestPluginExample-4.0SimplestPluginExampleVS2008PluginVisualStudioASimplePlugin.sln
3、构建Android插件
- 本机环境windows7
- 下载NDK,将Androidandroid-ndk-r9d加到系统环境变量
- 进入目录Unity3dPlugin-boostAsioboost-asio
- 执行:ndk-build
注意:一定要动态libgnustl_shared.so
Unity3d插件boost asio应用
1、拷贝库
将编译好的dll和so文件放对应入AssetsPlugins目录下的Android、x86
2、添加到unity3d工程代码
using System.Runtime.InteropServices; [DllImport("paokunet")] private static extern void startNet(); [DllImport("paokunet")] private static extern void stopNet(); [DllImport("paokunet")] private static extern bool getNetStats();
3、windows应用
boost库地址:http://sourceforge.net/projects/boost/files/boost-binaries/
没什么好说的
4、安卓应用
- boost 安卓库 里面有说明编译,如不想看就结尾有现成库。
- unity3d导出安卓项目记得导出地方对google android打勾
- boost asio是因动态加载stl才能工作正常
1、添加一个java文件类似这样的
import com.unity3d.player.UnityPlayerActivity; import android.os.Bundle; import android.util.Log; public class OverrideExample extends UnityPlayerNativeActivity { static { //加载.so文件 Log.d("OverrideActivity", "paokunet freeyun ???????"); { System.loadLibrary("gnustl_shared"); System.loadLibrary("paokunet"); } } }
2、AndroidManifest.xml类似这样
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.Unity3d.u3d" android:versionName="1.0" android:versionCode="1" android:installLocation="auto"> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> <application android:theme="@android:style/Theme.NoTitleBar" android:icon="@drawable/app_icon" android:label="@string/app_name" > <activity android:label="@string/app_name" android:screenOrientation="landscape" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:name="com.hj.u3d.OverrideExample"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" /> </activity> </application> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="22" /> <uses-feature android:glEsVersion="0x00020000" /> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> </manifest>
总结
只是用用boost aiso串口代码,注意串口的设备打开是不一样的,安卓和Linux设备类似“”/dev/ttyS1”,windows类“COM8”如果需要用tcp udp通信也是可以的。