Unity3D隐藏启动logo


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")
	}
}

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

    public void onUnityObjectStart() {
    
    
        Log.d(TAG, "onUnityObjectStart");
        runOnUiThread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                mUnityPlayer.removeView(mIvMask);
            }
        });
    }

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

与透明背景冲突问题

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

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

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);
        }

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

解决方案如下

扫描二维码关注公众号,回复: 15067822 查看本文章

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);
        }

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

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

猜你喜欢

转载自blog.csdn.net/CJohn1994/article/details/125189522
今日推荐