在Android中Unity3D透明背景的实现

在Unity中,可以通过Window->Rendering->lighting->在属性面板中选择Environment,修改Skybox MaterialNone来去掉天空盒。
在这里插入图片描述
但去掉天空盒的效果是这样的:
在这里插入图片描述
这样的效果明显不是预期的效果。

去掉天空盒并不代表背景被透明,还需要设置Camera的背景。
在这里插入图片描述

需要设置黑色透明度0,即ARGB为(0,0,0,0)。透明度不为0则无法实现透明效果。
在这里插入图片描述
修改透明度后再导入Android中,运行的效果是这样的:
在这里插入图片描述
奇怪,明明修改了透明度但没效果。其实设置透明度为0后即可在Android的Surface设置背景透明。
在2021版Unity导出的Android Lib源码中,在UnityPlayer中已经有代码可以进行设置,只不过需要配置isWindowTranslucent的属性。

private SurfaceView CreateGlView() {
        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);
        }

其实在生成的模块中有UnityThemeSelector.Translucent的主题:

<style name="UnityThemeSelector.Translucent" parent="@style/UnityThemeSelector">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

只需要在AndroidManifest.xml中改为透明的UnityThemeSelector.Translucent主题即可。

<activity
    ...
    android:theme="@style/UnityThemeSelector.Translucent">

注意:设置透明的windowBackground属性将Activity背景设为透明,这样是让应用可以透传看到上一个进程的界面,如果不设置的只能看到3D模型下的UI界面。

运行后看效果:
在这里插入图片描述
可以看到设置透明主题后能看见手机主界面了,达到预期的透明效果。


版权声明:本文为CJohn1994原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。