本文介绍将游戏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();
    }
    

results matching ""

    No results matching ""