Unity3D隐藏启动logo

Unity3D隐藏启动logo进入BuildSettings-左下角的PlayerSettings-Player-选择平台-Android-SettingsforAndroid下有个SplashScreen去掉勾勾就行。个人版这个勾勾是无法去掉的,只有正版或者激活成功教程版的可以去掉。这里说的是隐藏,也可以称为覆盖,并不是去掉。实际上的做法是在Android平台端的界面上添加一个来覆盖启动logo。Unity端通知Android端3D模型启动的状态,实际上就是Unity调用Android的方法来覆盖启动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);
        }

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

解决方案如下

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的方式以及与透明背景冲突的解决方案,创作不易,各位老铁点个赞。

今天的文章Unity3D隐藏启动logo分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/25195.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注