【定制化】在Android平台实现自定义的程序启动页

特别说明:以下仅适用于Android平台。

实现原理

  1. 创建安卓端自定义的Activity
  2. 禁用UnityPlayerActivity的启动Logo
  3. 改用自定义Activity

示例效果

参考简单步骤详细步骤都可实现。

自定义的启动动画,效果如下:

简单步骤

三步操作实现启动动画的自定义。

导入资源

这里,我预先做好了一个Unitypackage,下载后导入Unity即可。资源链接

这里默认的动画是示例效果中的启动动画。

替换动画

在Assets/Eqgis/Plugins/Android/目录下,找到unitydev...的安卓包。

使用解压工具打开unitydev-1.0.8.aar包,在res\raw\目录下,替换成你制作的"start.mp4"。

注意:你可以先解压aar,待覆盖"start.mp4"文件后,再打包(如,zip包修改aar后缀即可)

修改默认Activity

打开"Player Settings",启用自定义的AndroidManifest。

在Aseets/Plugins/Android目录下找到,AndroidManifest.xml,修改默认的Acitivity为"EqSplashActivity"。

示例如下:

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <activity android:name="com.eqgis.unity.EqSplashActivity"
                  android:screenOrientation="landscape"
                  android:theme="@style/UnityThemeSelector">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>

详细步骤

涉及在Android原生开发。

创建Android Library

使用AndroidStudio,实现自定义的启动页面。

  1. 在AndroidStudio中新建一个Android Library模块

  2. 在Android Library模块中导入"unity-classes.jar"

"unity-classes.jar"可以通过任意Unity项目导出安卓工程的方式得到,也可去unity的git仓库获取。

定制启动页

  1. 创建EqSplashActivity.java(这里以"EqSplashActivity"为例,名称可修改)

  2. 编写安卓layout布局

启动页实现自由度很高,按你心意自定义即可。这里示例代码如下:

EqSplashActivity.java

java 复制代码
public class EqSplashActivity extends Activity {

    private VideoView videoView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        videoView = findViewById(R.id.video_view);

        String videoPath = "android.resource://" + getPackageName() + "/" + R.raw.start;
        Uri uri = Uri.parse(videoPath);
        // 设置视频源
        videoView.setVideoURI(uri);
        videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                toUnityActivity();
            }
        });

        // 开始播放视频
        videoView.start();
    }

    /**
     * 转至UnityPlayerActivity
     */
    private void toUnityActivity() {
        try {
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayerActivity");

            startActivity(new Intent(this, classtype));
            finish();
        } catch (ClassNotFoundException e) {
            Log.e(EqSplashActivity.class.getSimpleName(), "toUnityActivity: ", e);
        }

    }
}

activity_main.xml

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#000"
    android:layout_height="match_parent">

    <VideoView
        android:layout_centerInParent="true"
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

导入AAR

  1. 在AndroidStudio中打包aar
  2. 将aar文件拷贝至Unity工程的Assets/...自定义路径.../Plugins/Android的目录下

在Unity端需要修改默认启动的Activity,和禁用启动logo。

  1. 禁用启动Logo

禁用启动Logo参考<<一个步骤跳过 Unity 启动Logo | 多平台适用 | 官方API支持>>

具体操作是在工程中创建一个脚本"SkipSplash.cs",无需挂载到游戏对象上,只要这个脚本放到除了Editor以外的文件夹就会生效。

c# 复制代码
#if !UNITY_EDITOR
using UnityEngine;
using UnityEngine.Rendering;

public class SkipSplash
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]
    private static void BeforeSplashScreen()
    {
#if UNITY_WEBGL
        Application.focusChanged += Application_focusChanged;
#else
        System.Threading.Tasks.Task.Run(AsyncSkip);
#endif
    }

#if UNITY_WEBGL
    private static void Application_focusChanged(bool obj)
    {
        Application.focusChanged -= Application_focusChanged;
        SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate);
    }
#else
    private static void AsyncSkip()
    {
        SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate);
    }
#endif
}
#endif

修改默认Activity

打开"Player Settings",启用自定义的AndroidManifest。

在Aseets/Plugins/Android目录下找到,AndroidManifest.xml,修改默认的Acitivity为"EqSplashActivity"。

示例如下:

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <activity android:name="com.eqgis.unity.EqSplashActivity"
                  android:screenOrientation="landscape"
                  android:theme="@style/UnityThemeSelector">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>
相关推荐
Jinkxs7 小时前
Python基础 - 初识内置函数 Python自带的便捷工具
android·java·python
私人珍藏库7 小时前
【Android】VLLO-韩国热门手机剪辑APP
android·app·工具·软件·多功能
Cloud_Shy6188 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
AFinalStone8 小时前
Android12 U盘插拔链路源码全解析(五):Framework层(下) StorageManagerService
android·frameworks
auccy9 小时前
Unity Sprite 添加法线贴图
unity·贴图·normal
林九生10 小时前
【实用技巧】MySQL 绿色版一键路径更新脚本详解 —— update_path.bat 深度解析
android·数据库·mysql
故渊at11 小时前
第十三板块:Android 综合架构与未来演进 | 第三十一篇:Android 架构演进与 Fuchsia OS 的挑战
android·架构·宏内核·微内核·fuchsia·ipc 性能博弈
aqi0011 小时前
一文速览 HarmonyOS 6.1.1 推出的十个新特性
android·华为·harmonyos·鸿蒙·harmony
matrixmind111 小时前
aiomysql:异步场景下的 MySQL 驱动
android·数据库·mysql·其他
随遇丿而安11 小时前
第8周:弹窗 / 提示组件全功能与弹窗优化
android