2023最新unity 发布exe程序背景透明穿透

这篇具有很好参考价值的文章主要介绍了2023最新unity 发布exe程序背景透明穿透。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

由于网上的一些帖子比较老了,好多人评论不能用黑屏之类的。这边重新整理个最新的,亲测可用。

先大体概括下,一共就几处设置,一个脚本。

一、设置

普通渲染的项目摄像机的Clear Flags选择Solid Color,颜色为黑色(0,0,0,0)。

使用HDRP的项目,关闭掉摄像机上的脚本:HDAdditionalCameraData,摄像机默认的backgroundType,Sky改为Color,颜色为黑色(0,0,0,0)见下图。

unity 透明窗口,unity,windows

↓↓↓特别注意下图,所使用的unity版本如果没有下面的选项则不用管。

unity 透明窗口,unity,windows

下面放上脚本:

using UnityEngine;
using System.Collections;
using System;
using System.Runtime.InteropServices;
using System.IO;

/// <summary>
/// 一共可选择三种样式
/// </summary>
public enum enumWinStyle
{
    /// <summary>
    /// 置顶
    /// </summary>
    WinTop,
    /// <summary>
    /// 置顶并且透明
    /// </summary>
    WinTopApha,
    /// <summary>
    /// 置顶透明并且可以穿透
    /// </summary>
    WinTopAphaPenetrate
}
public class WinSetting : MonoBehaviour
{

    #region Win函数常量
    private struct MARGINS
    {
        public int cxLeftWidth;
        public int cxRightWidth;
        public int cyTopHeight;
        public int cyBottomHeight;
    }

    [DllImport("user32.dll")]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll")]
    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

    [DllImport("user32.dll")]
    static extern int GetWindowLong(IntPtr hWnd, int nIndex);

    [DllImport("user32.dll")]
    static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);

    [DllImport("user32.dll")]
    static extern int SetLayeredWindowAttributes(IntPtr hwnd, int crKey, int bAlpha, int dwFlags);

    [DllImport("Dwmapi.dll")]
    static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);
    [DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);
    private const int WS_POPUP = 0x800000;
	//设定一个新的扩展风格
    private const int GWL_EXSTYLE = -20;
	// 定义窗体样式,-16表示设定一个新的窗口风格
    private const int GWL_STYLE = -16;
    private const int WS_EX_LAYERED = 0x00080000;
    private const int WS_BORDER = 0x00800000;
    private const int WS_CAPTION = 0x00C00000;
    private const int SWP_SHOWWINDOW = 0x0040;
    private const int LWA_COLORKEY = 0x00000001;
    private const int LWA_ALPHA = 0x00000002;
    private const int WS_EX_TRANSPARENT = 0x20;
    //
    private const int ULW_COLORKEY = 0x00000001;
    private const int ULW_ALPHA = 0x00000002;
    private const int ULW_OPAQUE = 0x00000004;
    private const int ULW_EX_NORESIZE = 0x00000008;
    #endregion
    //
    public string strProduct;//项目名称
    public enumWinStyle WinStyle = enumWinStyle.WinTop;//窗体样式
    //
    public int ResWidth;//窗口宽度
    public int ResHeight;//窗口高度
    //
    public int currentX;//窗口左上角坐标x
    public int currentY;//窗口左上角坐标y
    //
    private bool isApha;//是否透明
    private bool isAphaPenetrate;//是否要穿透窗体
    // Use this for initialization
    void Awake()
    {
        Screen.fullScreen = false;
#if UNITY_EDITOR
        print("编辑模式不更改窗体");
#else
        switch (WinStyle)
        {
            case enumWinStyle.WinTop:
                isApha = false;
                isAphaPenetrate = false;
                break;
            case enumWinStyle.WinTopApha:
                isApha = true;
                isAphaPenetrate = false;
                break;
            case enumWinStyle.WinTopAphaPenetrate:
                isApha = true;
                isAphaPenetrate = true;
                break;
        }
        //获得窗口句柄
        IntPtr hwnd = FindWindow(null, strProduct);
        //
        if (isApha)
        {
            //去边框并且透明
            SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_LAYERED);
			// 获得当前样式
            int intExTemp = GetWindowLong(hwnd, GWL_EXSTYLE);
            if (isAphaPenetrate)//是否透明穿透窗体
            {
                SetWindowLong(hwnd, GWL_EXSTYLE, intExTemp | WS_EX_TRANSPARENT | WS_EX_LAYERED);
            }
            //
            SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_BORDER & ~WS_CAPTION); //无边框、无标题栏
            SetWindowPos(hwnd, -1, currentX, currentY, ResWidth, ResHeight, SWP_SHOWWINDOW);
            var margins = new MARGINS() { cxLeftWidth = -1 };// 边距内嵌值确定在窗口四侧扩展框架的距离 -1为没有窗口边框
            //
            DwmExtendFrameIntoClientArea(hwnd, ref margins);
			
			SetLayeredWindowAttributes(hwnd, 0, 255, 1);
        }
        else
        {
            //单纯去边框
            SetWindowLong(hwnd, GWL_STYLE, WS_POPUP);
            SetWindowPos(hwnd, -1, currentX, currentY, ResWidth, ResHeight, SWP_SHOWWINDOW);
        }
#endif
    }
}

 随便扔到哪,我是扔到摄像机上了,说下参数填写,见下图1图2

unity 透明窗口,unity,windows

挂上脚本后,strproduct要和图2处的ProductName填写的一样,老版本的unity导出的exe名字也要一样,,新版的unity只要选择存放的文件夹,名字不用管。

unity 透明窗口,unity,windows

 下面是效果

普通的

unity 发布exe透明穿透(普通)

 HDRP的

unity 发布exe透明穿透(HDRP)文章来源地址https://www.toymoban.com/news/detail-719470.html

到了这里,关于2023最新unity 发布exe程序背景透明穿透的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在Android中Unity3D透明背景的实现

    在Unity中,可以通过Window-Rendering-lighting-在属性面板中选择Environment,修改 Skybox Material 为 None 来去掉天空盒。 但去掉天空盒的效果是这样的: 这样的效果明显不是预期的效果。 去掉天空盒并不代表背景被透明,还需要设置Camera的背景。 需要设置黑色透明度0,即ARGB为(0,

    2023年04月08日
    浏览(92)
  • 关于导入unity图像背景是黑色的,将其完美变为透明的方法

    当你看到我这篇文章,相信你已经使用过网上其他的办法了,对!我尝试了以下方法也没有达到我想要的效果,所以我自己胡乱尝试了一下,结果就OK了。事先声明此方法可能不适用所有人,如果能帮到你我很荣幸。 网上其他的解决办法——大家也可以试试看 我这里以一张图

    2024年01月17日
    浏览(50)
  • Android Studio.exe 下载 2023 最新更新,网盘下载

    方便大家下载, 放到了网盘上,自己也保留一份。(最前面是最新版本的,慎用, 会有bug什么的) 个人使用4.2版本的,感觉够用稳定 ,其他版本有莫名奇妙的bug,让人头大,可以尝鲜,有新功能可玩。 如果需要下载 ndk  看下面的文章 (android NDK 开发包,网盘下载,不限

    2024年02月09日
    浏览(39)
  • 【URP趟坑】Unity在URP中使用RenderTexture在UI中渲染带透明相机背景的PostProcessing场景

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最近有个需求,需要使用Unity的URP通用管线来开发项目,其中有个场景是需要在UI中显示动态的角色模型,而且背景是透明的。初闻这个需求感觉挺简单的,普通管线下使用Rendertexture输出相机视角的内容

    2024年02月04日
    浏览(44)
  • 修改Unity发布的pc包exe文件的属性信息

      大家好,我是阿赵。   最近一直在接入各种pc端的sdk,遇到一个问题。有些平台要求上架的pc的exe文件里面有对应的详细信息,比如文件说明、版本、版权等信息。 随便看一个我们平常用的软件,比如微信pc端exe,会发现的确是有这些信息的 但从Unity打包的exe文件,在

    2024年01月20日
    浏览(50)
  • 微信小程序自定义顶部导航栏的胶囊和微信自带的胶囊一样的透明背景色

    想要实现微信自带的右上角胶囊背景透明很简单,只需要在pages.js里面设置下面配置就可以了: 但是设置完这个后,胶囊的背景色是那种黑色半透明的效果:(微信开发者工具和真机上显示的效果不一致,要以真机为准) 手机端的效果:所以还是要以手机端为准   左侧的返

    2024年02月01日
    浏览(41)
  • unity发布exe报错BuildFailedException: Burst compiler (1.2.3) failed running(完美解决)

    根据网友提供的回答,使用过的方法:            1.多打包几次,无效 2.重启unity,重启电脑,无效           3.删除过Library文件夹,无效           4.发布位置没有中文路径,没有在Assets文件夹下,无效 5.删除多余的插件,无效 最终删除工程文件夹里面的Packages,重新打

    2024年02月16日
    浏览(46)
  • ffmpeg把PNG透明背景图片序列合成透明背景视频、透明背景GIF

    透明背景的照片序列: 照片序列:PNG可以有alpha(透明度)通道,可以是透明背景。 视频格式:在视频编辑中,大多数视频格式不支持透明度,但是有三种格式支持透明背景视频 Quicktime Animation (RLE) or FFVHUFF 、 HUFFYUV 视频格式 1、接下来可以使用ffmpeg命令把PNG照片序列合成为

    2023年04月23日
    浏览(50)
  • 2023最新绿色精美网址发布页HTML单页源码+UI简约大气

    一款单页的网址发布页单页HTML模板,可用于网址发布页使用,本模板简约商务,页面精美没有花里胡哨的效果,有兴趣的可以自行去安装体验吧。 wwxhwf.lanzoui.com/ibh6z0nuwc0d

    2024年02月13日
    浏览(44)
  • 小程序 解决自定义弹窗滚动穿透问题,解决弹窗背景内容滚动问题

    方法一、catchtouchmove=\\\"true\\\", 可以实现弹框背景不滚动,但是也会导致弹框自身无法滚动,如果你的弹窗本身是不需要滚动的,用这个方法是极佳的。 view class=\\\"pop\\\" catchtouchmove=\\\"true\\\"     view class=\\\"content\\\"/view /view 方法二、固定定位(可以解决背景不要滚动,弹框能滚动的问题)

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包