unity在android平台发布apk,应⽤启动⿊屏时间过长的问题解
决
如果将unity发布的apk⼯程放到低配置的android平台上启动着实太慢了,因为unity从启动开始到看见场景界⾯需要经过,unity刚启动的⿊屏、Splash显⽰、然后游戏场景加载出来这个过程有的时候能达到⼗秒,但是这⼏个过程在unityAPK启动过程中,⽆法避免,所有在这个就是让⽤户在这个过程中看见⼀个动画层,利⽤这个动画层覆盖unity显⽰的⿊屏和splash图标。⼤概思路如下:
1、Unity⽣成的Android应⽤必然要从这个UnityPlayerActivity启动,那么他的启动Splash view必然显⽰在这个activity⾥⾯;
2、因为每次启动apk都会先执⾏OnCreate⽅法,所有在onCreate⽅法⾥⾯在创建⼀个view来覆盖Splash。
3、在这个启动页⾯中我们也可以添加动画和各种像填⼊显⽰的效果和声⾳。
4、最后我们在unity场景初始化完成后我们在unity⾥⾯将新创建的View隐藏并销毁上⾯的动画和声⾳即可。
⼀、android studio3.5.3⼯程准备。
1、创建activity⼯程
2、将unity版本对应的classes.jar导⼊android⼯程
3、修改MainActivity类继承UnityPlayerActivity
4、修改l
修改android:theme的值为android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
添加<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
5、修改adle
修改apply plugin的值为apply plugin: 'com.android.library'
去掉applicationId "com.MMPark.splash"//com.MMPark.splash为你的项⽬包名
6、如果想将项⽬打包jar给unity使⽤可以在adle添加如下代码。(如果你想直接使⽤aar包可以不添加如下代码)
def UNITY_BASENAME = "unity";
def SDK_VERSION = "${android.defaultConfig.versionName}";
def sdkDestinationPath = "build/jar/";
def zipFile = file('build/intermediates/packaged-classes/debug/classes.jar'); // 待打包⽂件位置
task deleteBuild(type: Delete) {
delete sdkDestinationPath + UNITY_BASENAME + SDK_VERSION + ".jar"
}
task makeJar(type: Jar) {
exclude('com/jason/test/')
from zipTree(zipFile)
baseName = UNITY_BASENAME + SDK_VERSION
destinationDir = file(sdkDestinationPath)
}
makeJar.dependsOn(deleteBuild, build)
7、修改MainActivity类,我们将android的主要启动界⾯流程和关闭都写在这⾥。
package com.MMPark.splash;
import java.util.Locale;
import android.annotation.SuppressLint;
t.Context;
aphics.drawable.AnimationDrawable;
aphics.drawable.AnimationDrawable;
dia.AudioManager;
dia.AudioManager.OnAudioFocusChangeListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity
{
static final String TAG = "MainActivity测试";
private ImageView bgView = null;
private View view = null;
AnimationDrawable animationDrawable = null;
@SuppressLint("NewApi") @Override
protected void onCreate(Bundle arg0)
{
/
/先为画布添加⼀层背景
bgView=new ImageView(this);
String Default().getLanguage();
String bgName="splash_bg_en";
if(lanStr.equals("zh"))
{
bgName="splash_bg_zh";
}
Log.d(TAG, "System Lan:"+bgName);
int splash_bg=getResources().getIdentifier(bgName, "drawable", getPackageName()); bgView.setBackgroundResource(splash_bg);
mUnityPlayer.addView(bgView);
//获取屏幕尺⼨等相关信息
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
float scaleX=dm.widthPixels/1024f;
float scaleY=dm.heightPixels/600f;
Log.d(TAG, "Screen Width:"+dm.widthPixels+";Screen Height:"+dm.heightPixels);
//将我们创建的活动页添加到应⽤画布上
LayoutInflater flater = LayoutInflater.from(this);
int layoutID=getResources().getIdentifier("activity_main", "layout", getPackageName()); view = flater.inflate(layoutID, null);
int frame_Resources().getIdentifier("splash_frame", "id", getPackageName()); ImageView frameView=(ImageView)view.findViewById(frame_id);//new ImageView(this); frameVi
ew.setBackgroundResource(R.drawable.sequence);
mUnityPlayer.addView(view);
//根据屏幕调节图像⽐例
frameView.setScaleX(scaleX);
frameView.setScaleY(scaleY);
//启⽤动画,此处利⽤程序动态控制⽅便后⾯关闭
animationDrawable = (AnimationDrawable) Background();
animationDrawable.start();
}
public void HideSplash()
{
Log.d(TAG, "HideSplash");
new MainLooper()).post(new Runnable()
{
@Override
public void run()
{
Log.d(TAG, "HideSplash run");
animationDrawable.stop();
// ((Parent()).removeView(bgView);
/
/ ((Parent()).removeView(view);
bgView=null;
view=null;
animationDrawable=null;
}
});
}
}
8、然后我们在xml中构建⾃⼰喜欢的动画和启动界⾯样式即可(下⾯是我个⼈的布局⽂件和动画⽂件)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="schemas.android/apk/res/android"
android:id="@+id/splash_bg"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2.14"
android:orientation="horizontal" >
<ImageView
android:id="@+id/splash_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="schemas.android/apk/res/android">
<item android:duration="300" android:drawable="@drawable/loading_1" />
<item android:duration="300" android:drawable="@drawable/loading_2" />
<item android:duration="300" android:drawable="@drawable/loading_3" />
<item android:duration="300" android:drawable="@drawable/loading_4" />
</animation-list>
9、以上完成android⼯程,打包发布给unity使⽤即可,以下是我的android⼯程⽬录:
⼆、unity⼯程
1、unity⼯程很简单了,只需要调⽤即可,以下是调⽤类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/****************************************************
作者:cg
功能:
*****************************************************/
public class SplashCtrl : MonoBehaviour
{
unity3d animation
private void Start()
{
Debug.Log("开始界⾯");
}
private void Update()
{
if(Input.GetKeyDown(KeyCode.Escape))
{
Application.Quit();
}
if(Input.GetKeyDown(KeyCode.DownArrow))
{
SplashClose();
}
}
private void SplashClose()
{
Debug.Log("关闭页⾯");
//能访问到,但是在munityplayer报错
//AndroidJavaObject jo = new AndroidJavaObject("com.MMPark.splash.MainActivity");
//jo.Call("HideSplash");
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("HideSplash");
}
}
2、⼯程⽬录结构如下:(这⾥没有利⽤aar包,因为总是提⽰内部⽂件有重复,如果⼤家到好的利⽤aar包的⽂章或资源希望可以留⾔讨论O(∩_∩)O)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论