本文介绍将游戏APP的启动画面设置为指定的Logo或帧动画,示例代码以Unity游戏为例。
Android端
假设Unity导出的Android启动页面是com.unity3d.player.UnityPlayerActivity,在UnityPlayerActivity中实现添加游戏启动画面。
静态图
添加指定的静态Logo,需要在UnityPlayerActivity中添加以下代码:
public class UnityPlayerActivity extends Activity implements IUnityPlayerLifecycleEvents {
private ImageView splashImage;
protected UnityPlayer mUnityPlayer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUnityPlayer = new UnityPlayer(this, this);
setContentView(mUnityPlayer);
mUnityPlayer.requestFocus();
// 显示启动页
showSplashScreen();
}
private void showSplashScreen() {
splashImage = new ImageView(this);
splashImage.setBackgroundColor(Color.WHITE);
splashImage.setImageDrawable(getDrawable(R.drawable.sf_sofish_logo));
splashImage.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
mUnityPlayer.addView(splashImage, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
public void hideSplashScreen() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mUnityPlayer.removeView(splashImage);
splashImage.setImageDrawable(null);
}
});
}
...
}
动态图
添加指定的动态Logo(以帧动画为例),需要在UnityPlayerActivity中添加以下代码:
public class UnityPlayerActivity extends Activity implements IUnityPlayerLifecycleEvents {
private ImageView splashImage;
private AnimationDrawable splashAnimation;
protected UnityPlayer mUnityPlayer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUnityPlayer = new UnityPlayer(this, this);
setContentView(mUnityPlayer);
mUnityPlayer.requestFocus();
// 显示启动页
showSplashScreen();
}
private void showSplashScreen() {
splashAnimation = new AnimationDrawable();
splashAnimation.addFrame(getDrawable(R.drawable.sf_sofish_logo1), 50);
splashAnimation.addFrame(getDrawable(R.drawable.sf_sofish_logo2), 50);
splashAnimation.addFrame(getDrawable(R.drawable.sf_sofish_logo3), 50);
splashAnimation.addFrame(getDrawable(R.drawable.sf_sofish_logo4), 50);
splashAnimation.addFrame(getDrawable(R.drawable.sf_sofish_logo5), 50);
...
splashAnimation.setOneShot(false); // 设置帧动画循环播放
splashImage = new ImageView(this);
splashImage.setBackgroundColor(Color.WHITE);
splashImage.setImageDrawable(splashAnimation);
splashImage.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
mUnityPlayer.addView(splashImage, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
splashAnimation.start(); // 开始播放帧动画
}
public void hideSplashScreen() {
runOnUiThread(new Runnable() {
@Override
public void run() {
splashAnimation.stop();
mUnityPlayer.removeView(splashImage);
splashImage.setImageDrawable(null);
}
});
}
...
}
Unity端
在游戏启动后开始显示游戏画面时,在Unity端通过脚本调用Android中定义的hideSplashScreen()方法去除启动画面,示例代码如下:
using System;
using UnityEngine;
public class SplashController : MonoBehaviour
{
private void Start() {
HideSplashScreen();
}
private void HideSplashScreen() {
if (Application.platform != RuntimePlatform.Android)
{
return;
}
try
{
using AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
using AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
// 向Android发送去除启动画面的消息
jo.Call("hideSplashScreen");
}
catch (Exception e)
{
Debug.LogError("Failed to hide splash screen: " + e.Message);
}
}
}
注意事项
- 添加适当的异常处理,防止崩溃
- Unity 端需要判断当前运行平台
- Android 端的 UI 操作必须在 UI 线程中执行
- 开启代码混淆时,为了避免代码混淆导致的错误,需要添加以下 Proguard 规则:
-keep class com.unity3d.player.UnityPlayerActivity { public void hideSplashScreen(); }