xiaobai_dafei 2021-01-22 18:13 采纳率: 100%
浏览 807
已采纳

【Android调取Unity】如何解决Android调取Unity3D界面时加载时间过长的问题?

大家好,首先祝大家调试顺利,不出Bug,下面是我的问题:

    我现在正在学习如何在Android代码中调取Unity3D的界面,最近刚刚成功,但是出现了加载时间过长的问题,在Android调取Unity的时候会有大约10s的时间延迟,在此期间,手机屏幕会显示纯灰色背景,没有其他的反应。有大佬知道产生这个问题的具体原因是什么吗?该如何解决?

构成情况如下:

1、Unity3D部分:

    Unity3D主要内容为数字人体模型,模型的组成比较复杂,当初在导入这个模型的时候,Unity就会工作好久,但是后面导出的android软件打开速度正常,Unity3D Logo动画播放完就会正常打开。

2、Android部分:

android导入了Unity的module,本身一个简单的界面,只有一个按钮打开Unity。

  • 写回答

2条回答 默认 最新

  • 清澈@Cherry 2021-01-28 09:40
    关注

    参考下这个链接:http://www.wingmei.cn/2017/04/23/unity3d%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%90%AF%E5%8A%A8%E9%BB%91%E5%B1%8F%E6%97%B6%E9%97%B4%E5%A4%AA%E9%95%BF/

    Unity3D第一次启动黑屏时间太长

     

    最近在做一个VR眼镜项目,台北那边反应App第一次启动有很长的黑屏时间,然后才跳转到Unity3D Splash画面,需要解决。

    其实这个还是很奇怪的,我尝试了一下以前的Unity3D项目,发现启动直接就是Unity3D Splash画面。不知道是不是Unity3D更新版本后做了什么变动。

    仔细查看了一下,现在Unity3D App第一次启动时,会首先在Android/Data/包名下面缓存Shader Cache,大概有80-90个文件。之后启动,将会很快到到Unity3D Splash画面。但如果手动将Shader Cache删除,则启动依然会有很长时间黑屏来写入Shader Cache。

    这个应该就是黑屏时间长的原因了。虽然我在当前设备上测试第一次也就大概3秒左右,可台北反映有10秒以上…

    大概是设备的差异,但问题还是要解决的。

    这个问题需要我们写Android的插件,然后自己手动将Unity3D Splash覆盖掉。

    代码如下:

    public class MainActivity extends UnityPlayerActivity {
        private ImageView bgView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            super.onCreate(savedInstanceState);
            try {
                bgView = new ImageView(UnityPlayer.currentActivity);
                bgView.setImageResource(R.drawable.loading);
                bgView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                mUnityPlayer.addView(bgView, getRealWidth(), getRealHeight());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
           public void hideSplash(){
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run()
                {
                    mUnityPlayer.removeView(bgView);
                    bgView=null;
                }
            });
        }

    在这里我只是简单的增加了一个ImageView,将整个画面覆盖,我们需要在Unity3D的Scene中将这个ImageView移除掉,来显示我们的3D场景。当然,这个启动界面你可以显示Gif或者其他自定义内容,来让效果看的更好。

    		void Start () {
    		AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    		AndroidJavaObject jo = jc.GetStatic ("currentActivity");
    		jo.Call ("hideSplash");
    	}

    这样就能勉强解决这个问题了。

    希望Unity后续版本能够改进这个问题,不过当前Unity3D支持的Android最低版本已经变更为Android 4.1了,大概也在进行Android旧设备的淘汰了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 这种微信登录授权 谁可以做啊