位置: 编程技术 - 正文

Unity3D与Android项目交互中无法监听back键返回的解决办法(unity3d android)

编辑:rootadmin

推荐整理分享Unity3D与Android项目交互中无法监听back键返回的解决办法(unity3d android),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:unitystudio安卓,unitystudio安卓,unity与android交互详细,unity and unity,unity and unity,unity3d vs,unity androidx,unity和android,内容如对您有帮助,希望把文章链接给更多的朋友!

这两天为解决unity3d与android项目整合中出现的无法监听真机back实体键的问题找了很多资料,网上也有很多人遇到了这个问题,但是&#;乎都没找到有效的解决方法。

实现的效果是从A_Activity跳转到UnityPlayerNativeActivity,传入参数加载对应的三维图,按返回键或home键分别返回上一个activity和返回桌面。默认情况下按home键会返回桌面,但是按back键则无法监听到,没有任何反应。

===========UnityPlayer相关==============================

UnityPlayer里有三个类,分别是UnityPlayerProxyActivity、UnityPlayerActivity、UnityPlayerNativeActivity。

UnityPlayerProxyActivity用来判断手机的系统版本,从而确定启动UnityPlayerActivity还是UnityPlayerNativeActivity。所以UnityPlayerProxyActivity这个类自己就直接去掉不用了。

UnityPlayerNativeActivity这个类的加载速率据说会比较快,系统版本要求2.3以上,之前也一直用这个类整合使用。但是这两天在使用这个类时一直没法解决实体按键事件的问题,具体可以看下这段介绍:

UnityPlayerNativeActivity

同样我们可以创建UnityPlayerNativeActivity的子类,这与创建UnityPlayerActivity的子类具有相同的效果,但是会有较小的输入延迟。但是,需要明白的是,NativeActivity是在Gingerbread中引入的(即android 2.3),老的android版本没有这个特性,因为在NativeActivity中,触摸事件都是在native代码中处理的,java视图正常情况下是无法获取这些事件的,不过在unity3d中,有允许将事件传到DalvikVM的转发机制,要应用这个转发机制,必须修改manifest文件如下:

view sourceprint?.<?xml version="1.0" encoding="utf-8"?>.<manifest xmlns:android=" package="com.company.product">.<application android:icon="@drawable/app_icon" android:label="@string/app_name">.<activity android:name=".OverrideExampleNative".android:label="@string/app_name".android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">.<meta-data android:name="android.app.lib_name" android:value="unity" />.<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />.<intent-filter>.<action android:name="android.intent.action.MAIN" />.<category android:name="android.intent.category.LAUNCHER" />.</intent-filter>.</activity>.</application>.</manifest>

即使按照上述的xml配置后,进入三维图的UnityPlayerNativeActivity后,除home键外,其他按键都没法监听到。

Unity3D与Android项目交互中无法监听back键返回的解决办法(unity3d android)

======================在Unity中捕捉Android的常用按钮返回事件=============

另有一种办法是可以在jni脚本文件里监听到实体按键,可以在脚本文件里对按键事件进行处理。不过针对返回键只有一个方法可以调用,即Application.Quit();但是这个方法会退出整个application,按下返回键后,三维图页面退出了,同时其他页面也闪退了,无法返回到上一个activity的页面。

view sourceprint?.#pragma strict.function Start () {.}.function Update () {.if(Input.GetKey(KeyCode.Escape)){.Application.Quit();.}.}.function OnGUI () {.}

于是改用UnityPlayerActivity这个类进行尝试,通过测试终于发现可以直接在这个类里监听到按键,但是却无法识别按键。

view sourceprint?.// Pass any keys not handled by (unfocused) views straight to UnityPlayer.public boolean onKeyMultiple(int keyCode, int count, KeyEvent event).{.return mUnityPlayer.onKeyMultiple(keyCode, count, event);.}.public boolean onKeyDown(int keyCode, KeyEvent event).{.return mUnityPlayer.onKeyDown(keyCode, event);.}.public boolean onKeyUp(int keyCode, KeyEvent event).{.return mUnityPlayer.onKeyUp(keyCode, event);.}

只要有按键被按下,这三个方法都能执行,包括音量键等。但是只能监听到按键事件,却无法识别是否按下的是返回键,还是菜单键。加上KeyCode.Escape或者KeyCode.Back都无效,用onBackPressed()方法也仍然无效。网上很多一样的问题,却没有有效的答案。================继承UnityPlayerActivity获取按键事件================================== 找不到确切的解决办法,决定改变思路再尝试下。原先的UnityPlayerActivity保持不变,参数传入的接收和处理仍然在这个类里进行,自己再创建一个类来继承UnityPlayerActivity。测试后发现终于可以识别到按键了,同时正常加载UnityPlayerActivity这个视图。

view sourceprint?.public class ExtendActivity extends UnityPlayerActivity.{. .@Override.protected void onCreate(Bundle savedInstanceState).{.super.onCreate(savedInstanceState);.}. .@Override.public boolean onKeyDown(int keyCode, KeyEvent event).{.if(keyCode == KeyEvent.KEYCODE_BACK).{.finish();.Log.e("key", "key");.}.// TODO Auto-generated method stub.return super.onKeyDown(keyCode, event);.}.}

既然可以识别到返回键,那么接下来的问题应该就好办了。按照上面的处理后,进入ExtendActivity就等于加载了UnityPlayerActivity,但是按下back键后又出现了原先的问题,三维图退出了,紧接着其他activity也退出了,就跟jni脚本文件里执行Application.Quit()方法的效果一样。(这个还没整明白具体原因)。

=======================通过mUnityPlayer.quit()退出并返回上一个activity==================

于是接着继续测试修改。为UnityPlayerActivity注册了广播接收者,在按下ExtendActivity的back键时发送广播通知UnityPlayerActivity执行finish()方法。修改后发现问题一样,还是无法返回到上一个activity。

正整得头大的时候,又看了遍UnityPlayerActivity类,发现了mUnityPlayer.quit()方法。于是尝试把finish()方法换成mUnityPlayer.quit(),通过退出unityplayer来结束UnityPlayerActivity,没想最后终于成功了。喜大普奔啊。

java代码如下:

ExtendActivity类

view sourceprint?.public class ExtendActivity extends UnityPlayerActivity.{. .@Override.protected void onCreate(Bundle savedInstanceState).{.super.onCreate(savedInstanceState);.}. .@Override.public boolean onKeyDown(int keyCode, KeyEvent event).{.if(keyCode == KeyEvent.KEYCODE_BACK).{.sendBroadcast(new Intent("finish"));.// finish();.Log.e("key", "key");.}.// TODO Auto-generated method stub.return super.onKeyDown(keyCode, event);.}.}

UnityPlayerActivity类里添加的方法:

view sourceprint?1.//注册广播接受者2.private void registBroadcast()3.{4.BroadcastReceiver receiver = new FinishUnityBroadcast();5.IntentFilter filter = new IntentFilter();6.filter.addAction("finish");7.registerReceiver(receiver, filter );8.}view sourceprint?.//关闭三维图的广播.class FinishUnityBroadcast extends BroadcastReceiver.{.@Override.public void onReceive(Context context, Intent intent).{.mUnityPlayer.quit();.}.}

3dsMax插件开发环境配置 系统说明:Windows7X、3dsmax位、3dsmaxsdk、visualstudio;参考博文:万圣节福利:红孩儿3D引擎开发课程3dsmax导出插件初步(这个应该不是原博文

《炉石传说》架构设计赏析(1):游戏启动流程 转自:

Unity3D热更新全书-何谓热更新,为何热更新,如何热更新 Unity3D热更新全书-何谓热更新,为何热更新,如何热更新首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律。为何赞叹中文?因

标签: unity3d android

本文链接地址:https://www.jiuchutong.com/biancheng/375687.html 转载请保留说明!

上一篇:《Unity网络多玩家游戏开发教程(上册)》(unity局域网多人游戏)

下一篇:3dsMax插件开发环境配置

  • 其他债权投资的交易费用计入哪里
  • 以前年度损益调整结转到未分配利润
  • 固定资产残值怎么处理什么时候处理
  • 远期采购合同会查吗
  • 企业返利如何处理
  • 单品毛利计算公式怎么算
  • 把扣款挂到其它应收款的会计分录怎么做?
  • 个人所得税是否分段计算
  • 物业管理费什么时候交?
  • 自产产品用于在建工程按成本价还是销售价
  • 增值税票查无此票是什么原因
  • 年终奖怎么缴纳个税
  • 一般户开户行可以开增值税专票么
  • 红字冲回上月收入
  • 国税通用机打发票有几联
  • 合伙企业分配比例税法规定
  • 现金折扣通过财务费用核算
  • 股东投入的资金可以计入资本公积吗
  • mac小技巧
  • 把快速打开
  • 为什么win+d
  • php字符串定义的三种方式
  • PHP:spl_autoload_extensions()的用法_spl函数
  • 离职补偿金如何缴纳个人所得税?
  • 差额银行承兑汇票
  • 出口货物视同内销征税的会计核算
  • 如何防范增值税的税收风险
  • Pont Rouge (Red Bridge) over the Palmer River in Sainte-Agathe-de-Lotbinière, Quebec, Canada (© Jean Surprenant/Getty Images)
  • php写post接口
  • vue2+element-plus 密码校验及动态校验
  • 小规模报税系统登录
  • 在php中如何对多条记录进行分页
  • pytorch中的数据类型
  • php输出隔行变色的表格
  • vue怎么用bootstrap
  • js中...的用法
  • springboot+chatgpt+chatUI Pro开发智能聊天工具
  • 关联公司代缴社保会计处理
  • dedecms配置
  • 物流进项发票应纳税额
  • 企业所得税包含员工工资吗
  • 个体工商户怎么变更法人
  • 个人所得税修改密码怎么改
  • 小企业长期股权投资减值损失采用直接转销法
  • 营业利润净利润利润总额的区别
  • 小规模纳税人加工劳务的税率是多少
  • 未税金额怎么算税费
  • 其他应付款在借方资产负债表怎么填
  • 纳税人为风险纳税人怎么办
  • 以前年度多计提成本怎么处理
  • 土地储备委员会职责
  • 行政单位合并财务怎么办
  • 有形资产的例子
  • 现成的财务报表
  • 管理费用结转有余额吗
  • 联合账簿是备查账簿和序时账簿的结合
  • android-x86安装
  • centos7怎么看cpu和内存
  • windows8使用教程
  • 禁止windows安装程序
  • explore.exe是什么意思
  • Win7系统桌面图标变小
  • win8系统如何恢复出厂设置
  • win7打开文件提示用户没有访问权限怎么办
  • linux 744
  • drawand paint
  • unity3d地图定位
  • 文件夹如何取名字
  • android长按app快捷功能
  • 编写shell脚本,实现备份文件:每天18:00归档
  • 猫的喵喵
  • Binary XML file line #7: Error inflating class fragment
  • python解析算法
  • 办税大厅周六日上班吗
  • 电子税务局打印发票提示本机未检测到
  • 网上申报增值税纳税申报表怎么填写
  • 深圳企业公积金更改代扣银行
  • 深圳2021纳税
  • 地税局开发票流程?
  • 中国进口0号柴油价格
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设