반응형
이를 이용하면 모니터 위에 서식하는 미소녀를 띄우거나 할 수 있다.
이를 적용하기 전에 해야될 것이 두가지 있다.
1) 메인카메라 - Clear Flags를 Solid Color로 설정, 그 후 Background 컬러의 RGBA값을 0,0,0,0으로 설정
2) PlayerSettings - Resolution and Presentation의 Standalone Player Options에서 Use DXGI Flip Model Swapchain for D3D를 체크해제
아래는 실질적으로 앱을 투명화시켜주는 코드다.
스타트 함수에서
SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_LAYERED);
로 설정해놨기 때문에 앱의 투명한 부분을 클릭해도 아무런 일이 일어나지 않지만
스페이스바를 누르면
SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSTPARENT);
로 변경되어 투명한 부분이 진짜 투명하게 되어 아래에 있는 것을 클릭할 수 있게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
public class TransparentApp : MonoBehaviour
{
public struct MARGINS
{
public int leftWidth;
public int rightWidth;
public int topHeight;
public int bottomHeight;
}
[DllImport("user32.dll")]
public static extern IntPtr GetActiveWindow();
[DllImport("user32.dll")]
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);
[DllImport("user32.dll")]
public static extern int BringWindowToTop(IntPtr hwnd);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
[DllImport("Dwmapi.dll")]
public static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
IntPtr hWnd;
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const int GWL_EXSTYLE = -20;
const uint WS_EX_LAYERED = 0x00080000;
const uint WS_EX_TRANSTPARENT = 0x00000020;
void Start()
{
Application.runInBackground = true;
hWnd = GetActiveWindow();
MARGINS margins = new MARGINS { leftWidth = -1 };
DwmExtendFrameIntoClientArea(hWnd, ref margins);
SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_LAYERED);
BringWindowToTop(hWnd);
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);
}
bool toggle = true;
public void Update()
{
if (Input.GetKeyUp(KeyCode.Space))
{
toggle = !toggle;
BringWindowToTop(hWnd);
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);
if (toggle)
{
SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_LAYERED);
}
else
{
SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSTPARENT);
}
}
}
}
|
cs |
반응형
'Unity' 카테고리의 다른 글
HoloLens2 CS0246: The type or namespace name 'CloudSpatialAnchor' could not be found (are you missing a using directive or an assembly reference?) 에러 해결법 (0) | 2022.02.28 |
---|---|
TextMesh Pro UGUI 에서 Raycast Target 끄는 방법 (1) | 2022.02.15 |
HoloLens2에서 한 쪽 눈에 띄워지는 개발자 콘솔창 지우는법 (0) | 2021.10.29 |
HoloLens2에서 오브젝트가 한 쪽 눈에만 나올때 해결법 (0) | 2021.10.28 |
Unity IDragHandler 로 오브젝트 회전시키기 (1) | 2021.05.13 |
댓글