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任意版本均可。

效果:

时间: 2024-10-04 06:08:25

Unity 透明窗体的创建的相关文章

纯win32实现PNG图片透明窗体

#include <windows.h> #include <gdiplus.h> /*  GDI+ startup token */ ULONG_PTR gdiplusStartupToken; /*  Declare Windows procedure  */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); // UpdateLayeredWindow Defination typedef BOOL(

Qt Widget 利用 Qt4.5 实现酷炫透明窗体

本文讲述的是Qt Widget 利用 Qt4.5 实现酷炫透明窗体,QWidget类中的每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分. 先来看内容吧. Qt4.2引入了QWidget::setWindowOpacity函数, 可以为窗体设置透明度, 从0.0到1.0之间, 值越小越透明. 经过设置的窗体可以整体呈现透明的效果. 但这种设置比较粗糙, 只能设一个整体的效果,大概只有比如像拖动的时候能用一下,大多数时候都不太实用.在

C# 制作透明窗体

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using ControlExs; namespace

在窗体上创建自己的光标并输入文字

我们知道在文本框等可以接收输入的组件中,我们可以看到闪烁的光标,并可以输入文字,如果我们在,比如窗体上时,因为不支持输入,也无法显示闪烁的光标,那我们 有办法做自己的输入吗?当然可以,下面我们演示在Form上来输入文字. 用到的API函数如下 GetTextMetrics:获取程序当前的字体信息,存放到TEXTMETRIC结构中 CreateCaret:为系统插入标记创建一个新的形状,并且将插入标记的属主关系指定给特定的窗口.插入标记的形状.可以是线.块或位图 ShowCaret:显示光标 Se

透明窗体透明窗体 控件正常显示

//TransparentFrm透明窗体透明窗体 控件正常显示 {以图片的形状作为窗体形态}{使窗体透明 透明的只剩下个控件} // 调用 setFormTransParent(Form1); procedure setFormTransParent(Form:TForm); begin Form.BorderStyle:=bsNone; Form.TransparentColor:=True; Form.TransparentColorValue:=20; Form.Color:=Form.T

Unity基础 NGUI插件 创建简单的按钮

Unity版本:4.5.1 NGUI版本:3.6.5 注意NGUI版本,网上的大部分教程都是2.x版本的,在步骤上面略有不同,此文适合初学者. 示例: 通过NGUI创建一个背景和按钮. 1.首先创建一个新场景,并保存,在此场景取名为Test: 在Unity主界面上:File — New Scene,然后保存场景,File — Save Scene As.. 在此,场景命名为Test,可以在Unity中看到如下效果:      2.网上的绝大部分教程都说要删除场景中的自带摄像机,即上文左侧图中的

gdi+ 高速绘制透明窗体

gdi+ 高速绘制透明窗体: 方法一: 1.用Iamge对象载入png资源, 2.调用drawimage函数讲图片绘制出了 3.UpdateLayeredWindow对窗体进行布局 方法二: 1.用Bitmap对象载入资源 2.通过CDC选中,再用bitblt拷贝或者AlphaBlend融合到目标CDC上. 3.UpdateLayeredWindow对目标CDC上的hdc进行布局,达到融合背景的效果. 方法一是比較常规的方法,可是drawimage函数的效率太低,假设要实现实时更新的话就会有问题

delphi 窗体的创建和释放

Delphi中的窗体分为模式窗体和无模式窗体.二者的区别在于,用户可以在无模式窗体和其他窗体之间切换.这样,用户就可以同时工作于一个应用程序的几个部分.Delphi中窗体的初始化有两种情况,动态创建,和自动创建.通过show显示一个无模式窗体,ShowModal显示一个模式窗体.窗体有创建对应的也要考虑释放问题.当关闭一个窗体时,窗体并没有真正从内存中释放掉,它仍然存在于内存中,除非关闭了主窗体.因为模式窗体于无模式窗体的不同,所以二者的释放处理也有不同. 模式窗体的创建与释放 因为模式窗体可以

DSAPI 透明窗体+WIN7磨砂+窗体投影组合

你可以使用DSAPI和DS控件库组合多种特效,以下是透明窗体+WIN7磨砂+窗体投影组合效果 设计界面 编写代码 Private 透明 As New DSAPI.控件.Form窗体.透明窗体助手 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load DSAPI.Win7特性.设置窗体为磨砂透明效果_指定形状(Me, New Region(New Rectangle(0, 0, Me.Width,