Unity游戏启动时,在闪屏出现之前有两件事需要做:1、序列化Resources文件夹内的资源结构树;2、预加载/编译一些指定的Shader,如GraphicsSettings-Preloaded Shaders中设置的元素。在这两件事期间屏幕将出现黑屏,体验毫无疑问相当差。而需要等待黑屏的时间因工程而异。如果你的工程不需要在这两件事上花时间,后面的内容可忽略。
优化的策略是废弃Unity自带的闪屏,在启动时自己显示一个闪屏图片(android层去做),并在进入游戏后适时将其隐藏/销毁。以下是一些关键代码:
1、先在Android/layout/中添加布局定义:
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black" />
2、在UnityPlayerNativeActivity类的onCreate函数中初始化CustomSplash类:
public class UnityPlayerNativeActivity extends Activity {
protected UnityPlayer mUnityPlayer;
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(1);
super.onCreate(savedInstanceState);
this.mUnityPlayer = new UnityPlayer(this);
CustomSplash.Instance().onCreate(this, savedInstanceState, mUnityPlayer);
}
......
}
3、定义闪屏类CustomSplash,包含创建ImageView,并设置图片资源 :
public class CustomSplash {
static CustomSplash mInstance;
Activity acitivityHost;
String packageName;
Resources res;
ImageView splashView;
public static CustomSplash Instance()
{
if(mInstance == null)
mInstance = new CustomSplash();
return mInstance;
}
public void onCreate(Activity acitivity, Bundle savedInstanceState, UnityPlayer unityPlayer)
{
acitivityHost = acitivity;
res = acitivity.getApplicationContext().getResources();
packageName = acitivity.getApplicationContext().getPackageName();
View v = acitivityHost.findViewById(res.getIdentifier("imageView", "id", packageName));
if(v != null)
{
splashView = (ImageView)v;
if(splashView != null)
{
splashView.setImageResource(res.getIdentifier("ares_splash", "drawable", packageName));
}
}
ShowCustomSplash();
}
public void FinishCustomSplash()
{
acitivityHost.runOnUiThread(new Runnable() {
@Override
public void run() {
if(splashView != null) splashView.setVisibility(View.INVISIBLE);
}
});
}
public void ShowCustomSplash()
{
acitivityHost.runOnUiThread(new Runnable() {
@Override
public void run() {
if(splashView != null) splashView.setVisibility(View.VISIBLE);
}
});
}
}