android unity页面关闭报错,Unity和Android交互

Unity和Android交互

Unity和Android的交互一般涉及两种场景:

Unity开发为主,安卓开发作为辅助:以提供aar包等形式提供给Unity使用手机端的功能。如:访问Wifi信息,进行定位等。

Android开发为主,Unity只负责开发部分场景功能 :手机中嵌入一些Unity开发的小游戏,或者需要呈现AR,VR效果的场景。

Android插件辅助Unity开发

Android端准备

新建Android工程,并在新工程中新建Module,选择Android Library

89e4985a2bb6

编写功能类,实现供Unity端调用的功能方法

89e4985a2bb6

Android Studio中选择菜单Build -> Make Module 'xxxxxx',对当前Module进行构建,构建成功后可找到生成的aar包

89e4985a2bb6

89e4985a2bb6

Unity端准备

工程目录Assets目录下新建Plugins/Android子目录,然后将Android端生成的aar包放入。

89e4985a2bb6

脚本中新建AndroidJavaObject对象(入参为Android代码中需要用到的方法所在类的完整类名),调用Call方法即可(入参为Android代码中要调用的方法名)。

public string GetWifi() {

WifiHelper = new AndroidJavaObject("com.zxy.gpuimagehelp.WifiHelper");

return WifiHelper.Call("getWifiName");

}

关于AndroidJavaObject以及Call方法的更多详细信息,可参考官方文档说明

Android端对Unity端主动通信

Android代码中编写方法,反射调用该类com.unity3d.player.UnityPlayer中的静态方法UnitySendMessage,第二个入参为Unity中的GameObject对象名称,第三个入参为要执行的方法名,第四个参数为要传递的数据(只能传递一个字符串,需要传递多种类型,可约定好分隔符后拼接成字符串,Unity端按分隔符进行分割)。

89e4985a2bb6

2.Unity中编写对应脚本方法,提供给Android使用。

89e4985a2bb6

Tips

若Unity脚本需要在子线程中调用Android代码,调用前必须先将线程依附到Java虚拟机,执行完后需要对线程进行分离。否则,直接在子线程中调用Android方法,程序会出报错退出。详见AndroidJNI.AttachCurrentThread和AndroidJNI.DetachCurrentThread

Unity打包嵌入到Android程序

Unity端编写好程序后,打包并导出。在File -> Build Settings 里面进行一些打包设置。Buile System 选择Gradle,Export Project 勾选上,Package Name 和 Company Name / Product Name 要对应,之后选择Export进行导出。

89e4985a2bb6

将导出后的工程文件夹打开

libs文件夹下的jar包要添加Android Studio工程中并依赖

assets和jniLibs目录下的的内容也直接复制到Android Studio工程中。

需要嵌入Unity场景的页面Activity必须继承UnityPlayerActivity(需要先导入Unity导出工程中libs工程中的jar包),在onCreate方法中嵌入Unity页面。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_unity);

// Unity视图的容器

FrameLayout fl_unity_container = findViewById(R.id.fl_unity_container);

fl_unity_container.addView(mUnityPlayer);

mUnityPlayer.requestFocus();

}

Tips

Unity退出时会调用整个进程的退出,并且在Activity中嵌入的Unity场景,将会拦截Android的回退事件。如果想要重新捕获Android的回退事件,并在Unity退出时只关闭当前Activity,可以在onKeyDown中捕获回退事件,并调用UnityPlayer的quit方法。

@Override

public boolean onKeyDown(int keyCode, KeyEvent event)

{

if(keyCode == KeyEvent.KEYCODE_BACK)

{

Log.d("onKeyDown", "KEYCODE_BACK");

mUnityPlayer.quit();

}

return super.onKeyDown(keyCode, event);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值