当前位置:   article > 正文

Unity3D隐藏启动logo_个人版去掉unity开头

个人版去掉unity开头


Unity默认开启logo显示,专业版的可以勾选去掉,但个人版的无法去掉勾选,当然也可以下载破解版的软件,省去了很多麻烦。本文以Android平台为例,其他平台也可参考此做法。

在这里插入图片描述

专业版带启动logo去除的方法

进入 BuildSettings -> 左下角的Player Settings -> Player -> 选择平台 -> Android-Settings for Android下有个Splash Screen去掉勾勾就行。个人版这个勾勾是无法去掉的,只有正版或者破解版的可以去掉。

个人版带启动logo隐藏的方法

这里说的是隐藏,也可以称为覆盖,并不是去掉。实际上的做法是在Android平台端的UnityPlayer界面上添加一个View来覆盖启动logo。Unity端通知Android端3D模型启动的状态,实际上就是Unity调用Android的方法来覆盖启动logo。
首先编写C#脚本,将脚本与模型绑定。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AndroidCaller : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        OnStart();
    }
	
	void OnStart()
	{
		if(Application.platform != RuntimePlatform.Android) return;
		AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
		AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
		jo.Call("onUnityObjectStart")
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

android工程中需要定义一个onUnityObjectStart方法与C#脚本中定义一致。

    public void onUnityObjectStart() {
        Log.d(TAG, "onUnityObjectStart");
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mUnityPlayer.removeView(mIvMask);
            }
        });
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行后的效果如下:
在这里插入图片描述

与透明背景冲突问题

如果Activity的主题设置为UnityThemeSelector.Translucent
UnityThemeSelector.Translucent主题设置了windowIsTranslucent属性为true。

    <item name="android:windowIsTranslucent">true</item>
  • 1

UnityPlayer源码中,如果设置了windowIsTranslucent为true则会SurfaceView.setZOrderOnTop(true)SurfaceView置于顶部最上层,从而导致其他的View无法覆盖SurfaceView。

        SurfaceView var1;
        (var1 = new SurfaceView(this.mContext)).setId(this.mContext.getResources().getIdentifier("unitySurfaceView", "id", this.mContext.getPackageName()));
        if (this.IsWindowTranslucent()) {
            var1.getHolder().setFormat(-3);
            var1.setZOrderOnTop(true);
        } else {
            var1.getHolder().setFormat(-1);
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

因此设置透明背景时需要注意此问题,有什么解决方案呢?

解决方案如下

onCreate方法中UnityPlayer创建后,通过findViewById找到对应的SurfaceView,将SurfaceView.setZOrderOnTop()方法改为不会遮挡UI控件的SurfaceView.setZOrderMediaOverlay()方法。

        int resId = getResources().getIdentifier("unitySurfaceView", "id", getPackageName());
        SurfaceView surfaceView = findViewById(resId);
        if (surfaceView != null) {
            surfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
            surfaceView.setZOrderMediaOverlay(true);
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

当然也可以反编译修改unity-classes.jar的代码。
在这里插入图片描述

以上为Unity3D在Android中隐藏启动logo的方式以及与透明背景冲突的解决方案,创作不易,各位老铁点个赞。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号