Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
39
Help us understand the problem. What is going on with this article?
@sator_imaging

デスクトップが透過するアプリ・ライブ壁紙アプリを Unity で作る

背景が透過するアプリを作るライブラリを見つけたので、参考にちょっと弄ってみました。

概ね参考にしたライブラリ通りですが、透過ウインドウにはタイトルバーがないから動かせない、という状態を解消する為の機能(↑ WindowGrabber ↑)を追加したモノを GitHub にアップ。

丁度いいサイズ感なので、後日 GitHub Packages のテストに使う予定。

--

ライブ壁紙アプリを作れるところまで弄ったものの、一度ライブ壁紙にすると二度と触れない、タスクマネージャーからプロセス終了するしかない状態に。

Unity でタスクトレイ(System Tray)にアイコン表示するための機能も付けなきゃなー、とさらに大袈裟になりそうだったのでライブ壁紙モードは諦め。

もくじ

参考記事&リポジトリ

いつもありがとうございます。

機能

Tested with Unity 2020.3 LTS and HDRP 10.3.2 on Windows 10 64-bit.

透過ウインドウ

bool AppWindowUtility.Transparent { get; set; }

アプリを透過ウインドウに設定します。ウインドウの後ろにある別のウインドウが透けて見えるようになります。

透明度は Unity のレンダリング結果に依存しているので、カメラの BackgroundSolid Color に設定してアルファをゼロにする必要があります。

注: High-Definition Render Pipeline (HDRP) やその他の Scriptable Render Pipeline (SRP) ベースのレンダラーを使っている場合、Color Frame Buffer をデフォルトの RGB 10bit から RGB 16bit(8bit があればそちらでも可)に設定する必要があります。

ウインドウの不透明度

AppWindowUtility.SetWindowOpacity(byte opacity)

ウインドウ全体の不透明度を設定します。透過ウインドウと組み合わせて使うこともできます。

WindowGrabber コンポーネント

透過ウインドウが有効になっているとタイトルバーが消えてしまうので、ウインドウを移動することが出来なくなってしまいます。

WindowGrabber を空の GameObject に追加することで、アプリのウインドウのどこかをドラッグすれば移動できるようになります。

WindowGrabber が有効な間も uGUI を使うことが出来ます。

フルスクリーンモード

bool AppWindowUtility.FullScreen { get; set; }

ウインドウをフルスクリーンに設定します。

注: Unity 標準の UnityEngine.Screen.SetResolution(width, height, isFullScreen) ではなくコチラを使った方が App Window Utility との相性が良いです。

常に手前に表示(Always on Top)

bool AppWindowUtility.AlwaysOnTop { get; set; }

ウインドウがフォーカスを失っても、常に最前面に表示されるようになります。

クリックスルーモード

bool AppWindowUtility.ClickThrough { get; set; }

アプリケーションがマウスのクリックを受け付けなくなります。

注: マウスを使わずにこの機能をオフにする方法を実装する必要があります。実装しなかった場合、二度とアプリに触れなくなります。

ウインドウフレームの表示

bool AppWindowUtility.FrameVisibility { get; set; }

ウインドウのフレームを表示・非表示に設定します。

※ 透過ウインドウに設定すると、同時にフレームの表示もオフに設定されます。

カラーキーイングウインドウ

AppWindowUtility.SetKeyingColor(byte red, byte green, byte blue)

アプリのウインドウ全体に対して、特定の色を透過させる機能を有効にします。
かなり特殊なので、AppWindowUtility.Transparent を使った方が良いです。

加算合成モード

Windows の場合、AppWindowUtility.SetKeyingColor(0, 0, 0) を設定した後に AppWindowUtility.Transparent = true を設定すると、透過ウインドウが加算合成モードになります。

※注※ これは Windows のバグの可能性があります。

注意点

プレイヤー設定(Player Settings)

正しく動作させるためには、Use DXGI Flip Model Swapchain for D3D11 をオフに設定する必要があります。

※ App Window Utility が期待通りに動作しない場合、以下のプレイヤー設定を参考にしてください。

High-Definition Render Pipeline (HDRP) と同時に使用する場合

Color Buffer Format は必ず RGB 16bit(またはホスト OS が対応しているフォーマット)に設定する必要があります。
Scriptable Render Pipeline (SRP) ベースのレンダラーは同様の設定が必要になります。

透過ウインドウとウィンドウフレームの表示

Transparent = true を設定した後に FrameVisibility = true を設定すると、アプリの背景が非表示になった状態でウインドウフレームが表示されます。結果としてウインドウ全体がフレームの色で塗りつぶされることになります。

--

以上です。お疲れ様でした。

39
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
39
Help us understand the problem. What is going on with this article?