Android 与 Unity3D 项目的整合的Bug
2015-11-26 17:01
441 查看
一、整合步骤
1、首先在Unity中将Unity3D项目build一下或者运行一下,需要在build settings——> platform中选择Android平台。编译好或者运行后,
就会在Unity3D项目的目录下\Temp\StagingArea中自动生成一个Android工程目录结构的包,这个包就是Android项目需要引用的包
(图1)
2、根据..\Temp\StagingArea的目录包,在Eclipse中的新建一个项目,这个项目是根据existing code 进行创建的项目
(图2)
这个existing code 就是上面提到的..\Temp\StagingArea这个目录,并将这个项目设置为Library
(图3)
3、将这个Library项目中的assets目录下bin目录与libs目录拷贝到需要整合的Android项目中的assets目录下
(图4)
4、需要与Unity3D进行整合的Android项目需要引用刚才的Library
(图5)
5、最后把Unity3D安装目录如C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\development目录下的classes.jar拷贝到Android项目下libs的目录下,并引用它。
(图6)
6、经过以上步骤后基本上完成了前奏工作了。但为了能够在Android项目中进入Unity3D开发的页面,需要在Android项目中新疆一个Activity,这个Activity是继承于UnityPlayerActivity
这个OverrideExample就可以在Android项目中使用Intent来启动它。这个Activity就会启动Unity3D中的页面。如果需要Unity3D与Android互传信息的话可以参考
http://www.xuanyusong.com/archives/667 http://www.xuanyusong.com/archives/676
二、问题
麦洛遇到的问题是:当从OverrideExample这个Unity3D页面返回到Android原生页面时,然后再次进入OverrideExample这个页面时,logcat中就已经报错了
(图7)。后来发现这是由于
UnityPlayerActivity内部调用了UnityPlayer.quit()方法,该方法是退出Unity,但也引起了其它Activity的crash。麦洛翻查了许多资料,依然无解。
从官方的Unity3D升级报告中,可以看出UnityPlayer.quit()在其它平台上曾经也引起过问题,只不过后来修复了。所以麦洛猜测可能是Unity3D对Android的支持还不够引起的。
三、解决方法
问题出现了,然后这个需求也是要满足的。百思不得其解之下,麦洛想只要不关闭OverrideExample这个Activity不就行了么。于是把OverrideExample这个Activiy的
launchMode设置为”singleInstance”,这样它就是单例的,而退出这个OverrideExample时不使用finish(),每次发Intent给OverrideExample都是同一个实例。
而只有在最后一个Activity关闭时才调用UnityPlayer.quit()方法。这样就避免了一个Unity3D与Android整合的一个bug。
1、首先在Unity中将Unity3D项目build一下或者运行一下,需要在build settings——> platform中选择Android平台。编译好或者运行后,
就会在Unity3D项目的目录下\Temp\StagingArea中自动生成一个Android工程目录结构的包,这个包就是Android项目需要引用的包
(图1)
2、根据..\Temp\StagingArea的目录包,在Eclipse中的新建一个项目,这个项目是根据existing code 进行创建的项目
(图2)
这个existing code 就是上面提到的..\Temp\StagingArea这个目录,并将这个项目设置为Library
(图3)
3、将这个Library项目中的assets目录下bin目录与libs目录拷贝到需要整合的Android项目中的assets目录下
(图4)
4、需要与Unity3D进行整合的Android项目需要引用刚才的Library
(图5)
5、最后把Unity3D安装目录如C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\development目录下的classes.jar拷贝到Android项目下libs的目录下,并引用它。
(图6)
6、经过以上步骤后基本上完成了前奏工作了。但为了能够在Android项目中进入Unity3D开发的页面,需要在Android项目中新疆一个Activity,这个Activity是继承于UnityPlayerActivity
package com.company.product; import com.unity3d.player.UnityPlayerActivity; import android.os.Bundle; import android.util.Log; public class OverrideExample extends UnityPlayerActivity { protected void onCreate(Bundle savedInstanceState) { // call UnityPlayerActivity.onCreate() super.onCreate(savedInstanceState); // print debug message to logcat Log.d("OverrideActivity", "onCreate called!"); } public void onBackPressed() { // instead of calling UnityPlayerActivity.onBackPressed() we just ignore the back button event // super.onBackPressed(); } }
这个OverrideExample就可以在Android项目中使用Intent来启动它。这个Activity就会启动Unity3D中的页面。如果需要Unity3D与Android互传信息的话可以参考
http://www.xuanyusong.com/archives/667 http://www.xuanyusong.com/archives/676
二、问题
麦洛遇到的问题是:当从OverrideExample这个Unity3D页面返回到Android原生页面时,然后再次进入OverrideExample这个页面时,logcat中就已经报错了
(图7)。后来发现这是由于
UnityPlayerActivity内部调用了UnityPlayer.quit()方法,该方法是退出Unity,但也引起了其它Activity的crash。麦洛翻查了许多资料,依然无解。
从官方的Unity3D升级报告中,可以看出UnityPlayer.quit()在其它平台上曾经也引起过问题,只不过后来修复了。所以麦洛猜测可能是Unity3D对Android的支持还不够引起的。
三、解决方法
问题出现了,然后这个需求也是要满足的。百思不得其解之下,麦洛想只要不关闭OverrideExample这个Activity不就行了么。于是把OverrideExample这个Activiy的
launchMode设置为”singleInstance”,这样它就是单例的,而退出这个OverrideExample时不使用finish(),每次发Intent给OverrideExample都是同一个实例。
而只有在最后一个Activity关闭时才调用UnityPlayer.quit()方法。这样就避免了一个Unity3D与Android整合的一个bug。
相关文章推荐
- Unity3D爬坑手记——Prefab篇2
- unity 实现炸弹人放炸弹后只进不出的一种方法
- 一个简单的小程序演示Unity的三种依赖注入方式
- Unity C# XmlDoc.LoadXml() il2cpp not implemented exception
- Unity之AnimationCurve
- Unity 几种优化建议
- 总结使用Unity 3D优化游戏运行性能的经验
- 基于Unity3d 引擎的Android游戏优化
- Unity3d中的属性(Attributes)整理
- Unity Mathf 数学运算(C#)
- Unity5 AssetBundle 打包以及加载
- Unity3D中自带事件函数的执行顺序
- unity 5.3 中新增加的 Attribute
- unity摇杆
- ubuntu-unity桌面禁用客人会话
- Unity3D-优化
- unity3D 实战 《小十传奇》系列之二:控制层(上)
- unity3D 实战 《小十传奇》系列之一:构建UI系统
- 腾讯Unity3D手游加密分析
- unity3d 游戏加密与解密