Unity 透明窗体的创建

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 透明窗体的创建相关的知识,希望对你有一定的参考价值。

原文地址:https://alastaira.wordpress.com/2015/06/15/creating-windowless-unity-applications/

蛮牛地址:http://www.manew.com/thread-43230-1-1.html

 

该效果只针对Windows平台。结合摄像机的OnRenderImage事件和一些Windows底层API调用来实现该效果。

首先需要一个透明的Shader,我这直接使用系统的。

然后创建一个C#的脚本 TransparentWindow

 1 using UnityEngine;
 2 using System.Collections;
 3 using System.Runtime.InteropServices;
 4 using System;
 5 
 6 public class TransparentWindow : MonoBehaviour
 7 {
 8     [SerializeField]
 9     private Material m_Material;
10     private struct MARGINS
11     {
12         public int cxLeftWidth;
13         public int cxRightWidth;
14         public int cyTopHeight;
15         public int cyBottomHeight;
16     }
17     // Define function signatures to import from Windows APIs
18     [DllImport("user32.dll")]
19     private static extern IntPtr GetActiveWindow();
20     [DllImport("user32.dll")]
21     private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);
22     [DllImport("Dwmapi.dll")]
23     private static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);
24     // Definitions of window styles
25     const int GWL_STYLE = -16;
26     const uint WS_POPUP = 0x80000000;
27     const uint WS_VISIBLE = 0x10000000;
28     void Start()
29     {
30 #if !UNITY_EDITOR
31         var margins =new MARGINS() { cxLeftWidth = -1 };
32 // Get a handle to the window
33 var hwnd = GetActiveWindow();
34 // Set properties of the window
35 // See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms633591%28v=vs.85%29.aspx
36 SetWindowLong(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
37 // Extend the window into the client area
38 //See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa969512%28v=vs.85%29.aspx
39 DwmExtendFrameIntoClientArea(hwnd,ref margins);
40 #endif
41     }
42     // Pass the output of the camera to the custom material
43     // for chroma replacement
44     void OnRenderImage(RenderTexture from, RenderTexture to)
45     {
46         Graphics.Blit(from, to, m_Material);
47     }
48 
49 }

上面的代码用到了InterOpServices命名空间,以便调用一些Windows底层API从而改变Unity应用在运行时的窗口属性。然后使用OnRenderImage事件将摄像机的输出应用到RenderTexture。将使用Shader的材质赋给脚本中的m_Material字段,这样我们就可以开始抠图了。

然后,重点来了:将摄像机的背景颜色改为与透明材质中_TransparentColourKey属性一样。

技术分享

你可以随便设置该颜色,但两边必须一致。

最后就是生成和运行啦。因为用到了RenderTexture,所以如果使用Unity4.x必须为Pro版,而5.x任意版本均可。

 

效果:

技术分享





以上是关于Unity 透明窗体的创建的主要内容,如果未能解决你的问题,请参考以下文章

VB窗体透明问题!

创建一个半透明或透明的窗口 从透明到鼠标事件,除了添加到窗体的控件

delphi 怎样绘制半透明窗体,只让窗体背景半透明,而窗体里面的控件 不透明

Qt 窗体不变透明却变黑

Unity ShadersTransparency —— 使用alpha通道创建透明效果

qt 窗体透明,控件不透明