Desktop Mascot Maker - DirectComposition版#
Unity でデスクトップマスコット(デスクトップアクセサリ)を作成できるアセットです。
目次#
- このアセットについて
- 動作環境・必須設定
- 新機能(v3.0.0)
- Getting Started
- MascotMakerDComp コンポーネント機能説明
- MascotMakerDComp API リファレンス
- Event Callbacks
- Example シーン
- トラブルシューティング
- パフォーマンスと最適化
- 既知の制限事項
- 連絡先
このアセットについて#
Desktop Mascot Maker - DirectComposition版 は、Unity で作成したキャラクターやアニメーションを、Windows のデスクトップマスコット(デスクトップアクセサリ)として表示するためのアセットです。
主な特徴#
- 高性能レンダリング: DirectComposition + Direct3D 11 による GPU ハードウェアアクセラレーションを利用
- ゼロコピーテクスチャ共有: GPU 上で Unity の RenderTexture を直接共有し、CPU への転送を排除
- 大幅な CPU 負荷削減: 従来版(v2.2.0 GDI/WinForms 版)と比較して 70~90% の CPU 使用率削減
- 2つのウィンドウモード:
- Rectangle Window: 高速・軽量な矩形ウィンドウモード
- Alpha Mask Window: セル単位のウィンドウ形状形成が可能なモード
- コンテキストメニュー対応: 右クリックでカスタムメニューを表示可能
- IL2CPP 対応: Mono と IL2CPP の両方のビルドバックエンドをサポート
- 豊富なイベントシステム: マウス・ウィンドウイベントを UnityEvent で処理
従来版との違い#
従来版(v2.2.0)は WinForms + GDI/UpdateLayeredWindow を使用していましたが、このバージョン(v3.0.0)では DirectComposition を採用することで、以下の問題を解決しました:
❌ 従来版の問題点:
- CPU 負荷が高い(毎フレーム GPU→CPU へのテクスチャコピーが発生)
- GDI/GDI+ は GPU アクセラレーションされない
- 高DPI・マルチモニタ環境での DPI スケーリングに問題
- Mono ビルドバックエンドのみ対応(IL2CPP 非対応)
✅ DirectComposition版の改善点:
- 70~90% の CPU 使用率削減(GPU 上でのゼロコピー処理)
- DirectComposition によるハードウェアアクセラレーション
- 高DPI・マルチモニタ環境への完全対応
- IL2CPP ビルドバックエンド対応
動作環境・必須設定#
必須環境#
| 項目 | 要件 |
|---|---|
| OS | Windows 10 (1803 以降) または Windows 11 |
| Unity バージョン | Unity 2020.3 LTS 以降推奨 |
| Graphics API | Direct3D 11 のみ |
| ビルドバックエンド | Mono または IL2CPP |
| アーキテクチャ | x86 (32-bit) または x86_64 (64-bit) |
重要な設定#
1. Graphics API を Direct3D 11 に設定#
手順:
Edit→Project Settings→PlayerOther SettingsセクションGraphics APIs for Windowsから Direct3D 11 以外を削除- Direct3D 11 が最上位(優先)になるように設定
注意: Direct3D 12、Vulkan、OpenGL は サポートされません。
2. IL2CPP を使用する場合#
IL2CPP ビルドバックエンドは完全にサポートされています。追加の設定は不要です。
新機能(v3.0.0)#
DirectComposition 採用による大幅な性能改善#
- CPU 使用率 70~90% 削減: GPU 上でのゼロコピーテクスチャ共有により、CPU への負荷を大幅に削減
- ハードウェアアクセラレーション: DirectComposition による GPU レンダリング
- 高DPI対応: マルチモニタ・高DPI環境でのスケーリング問題を解消
2つのウィンドウモード#
Alpha Mask Window モード#
- 描画領域をセル分割し、不透明ピクセルを含むセルだけでウィンドウを形成
- ✓ 透明セルはクリックが透過
- ✓ ドラッグ可能(不透明セルのみ)
- △ パフォーマンス(ウィンドウ形状の更新コストあり)
- 推奨用途: 複雑な形状のマスコット、クリック透過が必要な場合
Rectangle Window モード(デフォルト)#
- シンプルな矩形ウィンドウ
- ✗ クリック透過不可(ウィンドウ全体でクリック受付)
- ✓ ドラッグ可能(Draggable Area で「全域」or「不透明領域のみ」を選択)
- ✓ パフォーマンス良好(ウィンドウ形状更新なし、DragOpaqueOnlyの場合のみアルファマスク使用)
- 推奨用途: シンプルなマスコット、パフォーマンス重視
コンテキストメニュー#
- 右クリックでカスタムメニューを表示
- カスタムアイテムを動的に追加・削除可能
- 組み込みの「Close」「Exit Application」メニュー項目
- セパレーター自動挿入
IL2CPP 対応#
- 従来版(v2.2.0)は Mono のみ対応
- v3.0.0 では IL2CPP ビルドバックエンドを完全サポート
Allow 'unsafe' Codeオプションは 不要(従来版では必要でした)
その他の改善点#
- .NET Framework 不要: DirectComposition ネイティブプラグインは Windows API のみを使用
- クリーンなコード: デバッグログを最小化、ユーザー向けにコメント整備
- ソースコード配布対応: C++ DLL のソースコードと詳細なビルドドキュメント付属
Getting Started#
1. プロジェクトのセットアップ#
Graphics API の設定#
Edit→Project Settings→PlayerOther Settings→Graphics APIs for Windows- Direct3D 11 以外を削除
2. 基本的な使い方#
Step 1: カメラの準備#
- デスクトップマスコットとして表示したいキャラクターを撮影するカメラを作成
- カメラの
Clear FlagsをSolid Colorに設定 Backgroundの色のアルファ値を 0(完全透明)に設定
Step 2: MascotMakerDComp コンポーネントのアタッチ#
- カメラに
MascotMakerDCompコンポーネントをアタッチ - Inspector で設定を調整(詳細は次のセクション参照)
Step 3: Play モードで確認#
- Unity Editor の Play モードを実行
- デスクトップにマスコットウィンドウが表示されます
- マスコットをドラッグして移動可能
3. 最小構成の例#
| |
MascotMakerDComp コンポーネント機能説明#
Basic Settings#
| 項目 | 説明 | デフォルト値 |
|---|---|---|
| Mascot Window Size | ウィンドウのサイズ(ピクセル単位) 注意: 初期化後は変更できません | (480, 640) |
| Play On Awake | Start 時に自動的にウィンドウを初期化・表示 | true |
| Draggable | マウスドラッグでウィンドウを移動可能 | true |
Window Position#
| 項目 | 説明 | デフォルト値 |
|---|---|---|
| Left | ウィンドウの水平位置(スクリーン座標、左上が原点) | 100 |
| Top | ウィンドウの垂直位置(スクリーン座標、左上が原点) | 100 |
Appearance#
| 項目 | 説明 | デフォルト値 |
|---|---|---|
| Background Color | 背景色(Premultiplied Alpha形式に自動変換) | (0, 0, 0, 0) |
| Opacity | ウィンドウの不透明度(0.0~1.0) | 1.0 |
| Top Most | 常に最前面に表示 | true |
| Anti Aliasing | アンチエイリアシング品質None / TwoSamples / FourSamples / EightSamples | FourSamples |
Window Mode#
| 項目 | 説明 | デフォルト値 |
|---|---|---|
| Window Mode | RectangleWindow: 矩形ウィンドウモード(高速)AlphaMaskWindow: セル単位でウィンドウ形状を形成 | RectangleWindow |
Rectangle Window Settings (Rectangle Window モードで使用)#
| 項目 | 説明 | デフォルト値 |
|---|---|---|
| Draggable Area | ドラッグ可能領域DragAnywhere - ウィンドウ全体からドラッグ可能DragOpaqueOnly - 不透明領域のみドラッグ可能(アルファマスク使用) | DragOpaqueOnly |
Alpha Mask Settings (Alpha Mask Window モードで使用)#
| 項目 | 説明 | デフォルト値 |
|---|---|---|
| Precision | アルファマスク精度Low (12x16グリッド) - 最速Medium (24x32グリッド) - 推奨High (48x64グリッド) - 高精度 | Low |
| Update Mode | アルファマスク更新タイミングEveryFrame - 毎フレーム更新(アニメーション向け、高負荷)Periodic - 定期更新(推奨)Manual - 手動更新のみ(最高パフォーマンス) | Periodic |
| Alpha Threshold | 透明判定の閾値(0.0~1.0) ピクセルのアルファ値がこの値より大きい場合、不透明と判定 | 0.5 |
| Periodic Update Interval | 定期更新の間隔(秒単位、0.016~1.0) Periodic モード時のみ表示 | 0.1 |
Context Menu Settings#
| 項目 | 説明 | デフォルト値 |
|---|---|---|
| Context Menu Items | カスタムメニュー項目のリスト 各項目は Label(表示テキスト)と OnSelected(選択時アクション)を持つ | 空 |
| Context Menu Show Close | 組み込みの「Close」メニュー項目を表示 | false |
| Context Menu Show Exit | 組み込みの「Exit Application」メニュー項目を表示 | false |
カスタムメニュー項目の追加方法:
Context Menu Itemsのサイズを増やす- 各項目の
Labelにメニュー表示テキストを入力 OnSelectedイベントで選択時の処理を設定
MascotMakerDComp API リファレンス#
ウィンドウ表示・非表示#
void Show()#
ウィンドウを表示します(未初期化の場合は初期化も実行)。
| |
void Hide()#
ウィンドウを非表示にします(ウィンドウは破棄されません)。
| |
bool IsVisible { get; }#
ウィンドウが表示中かどうかを取得します。
| |
ウィンドウ位置#
int Left { get; set; }#
int Top { get; set; }#
ウィンドウの位置を取得・設定します(スクリーン座標、左上が原点)。
| |
ウィンドウサイズ#
Vector2 MascotWindowSize { get; set; }#
ウィンドウのサイズを取得・設定します(ピクセル単位)。
| |
重要: ウィンドウサイズは 初期化後は変更できません。初期化前(Awake/Start前)にのみ設定してください。ランタイム中にサイズを変更しても、初期値が使用され続けます。
コンテキストメニュー#
void AddContextMenuItem(string label, UnityAction onSelected = null)#
実行時にコンテキストメニュー項目を追加します。
| |
void ClearContextMenuItems()#
すべてのカスタムコンテキストメニュー項目をクリアします。
| |
ウィンドウモード#
WindowMode Mode { get; set; }#
ウィンドウモードを取得・設定します。
| |
Alpha Mask 設定#
float AlphaThreshold { get; set; }#
アルファマスクの閾値を取得・設定します(0.0~1.0)。
| |
HitTestPrecision Precision { get; set; }#
アルファマスクの精度を取得・設定します。基本的にLowで十分だと思います。
| |
HitTestUpdateMode UpdateMode { get; set; }#
アルファマスクの更新モードを取得・設定します。
| |
void UpdateAlphaMask()#
アルファマスクを手動で更新します(Update Mode が Manual の場合に使用)。
| |
マウス状態取得#
Vector2 GetMousePosition()#
マスコットウィンドウ内のマウス位置を取得します。
| |
bool IsMouseOver()#
マウスがマスコットウィンドウ上にあるかを取得します。
| |
bool IsLeftButtonPressed()#
bool IsRightButtonPressed()#
bool IsMiddleButtonPressed()#
各マウスボタンが押されているかを取得します。
| |
その他#
void Shutdown()#
ウィンドウを終了し、リソースを解放します(通常は自動的に呼ばれます)。
| |
Event Callbacks#
MascotMakerDComp は、マウス・ウィンドウイベントを UnityEvent で処理できます。
マウスイベント#
Left Mouse Button#
- OnLeftMouseDown: 左マウスボタン押下時(
Vector2 mousePosを受け取る) - OnLeftMouseUp: 左マウスボタンリリース時(
Vector2 mousePosを受け取る) - OnLeftDoubleClick: 左マウスボタンダブルクリック時(
Vector2 mousePosを受け取る)
| |
Right Mouse Button#
- OnRightMouseDown: 右マウスボタン押下時(
Vector2 mousePosを受け取る) - OnRightMouseUp: 右マウスボタンリリース時(
Vector2 mousePosを受け取る) - OnRightDoubleClick: 右マウスボタンダブルクリック時(
Vector2 mousePosを受け取る)
| |
Middle Mouse Button#
- OnMiddleMouseDown: 中マウスボタン押下時(
Vector2 mousePosを受け取る) - OnMiddleMouseUp: 中マウスボタンリリース時(
Vector2 mousePosを受け取る) - OnMiddleDoubleClick: 中マウスボタンダブルクリック時(
Vector2 mousePosを受け取る)
| |
Mouse Wheel#
- OnMouseWheel: マウスホイール回転時(
int deltaを受け取る)
| |
ウィンドウイベント#
- OnMove: ウィンドウ移動時(
Vector2 windowPosを受け取る)
| |
- OnDestroyed: MascotMakerDComp コンポーネントが破棄される直前
| |
コンテキストメニューイベント#
- OnContextMenuOpening: コンテキストメニューが開かれる直前(動的なメニュー項目の追加・削除が可能)
| |
注意: カスタムメニュー項目の選択イベントは、各 ContextMenuItem の OnSelected イベントで処理します。
Example シーン#
Demo01_Event
- マウスイベント、ウィンドウイベント、コンテキストメニューイベントが確認できるデモです
- コンテキストメニューのデモ
Demo02_MultipleMascot
- 複数のマスコットキャラクターを表示するデモです
- 自動でWindowを動かすAIスクリプト
- Rectangle Window Mode
Demo03_AlphaMaskWindow
- Alpha Mask Windowの形状が確認できるデモです(Alpha Mask Window Mode)
- キャラクターのOrbital View
- Context Menu Close
トラブルシューティング#
ウィンドウが表示されない#
原因と対処法:
Graphics API が Direct3D 11 ではない
Project Settings→Player→Graphics APIs for Windowsを確認- Direct3D 11 のみを有効にしてください
DLL が見つからない
- Unity Console で
DllNotFoundExceptionエラーを確認 Assets/DesktopMascotMaker/Plugins/x86_64/DCompMascot.dll(64-bit)またはAssets/DesktopMascotMaker/Plugins/x86/DCompMascot.dll(32-bit)が存在することを確認
- Unity Console で
Play On Awake が無効
- Inspector で
Play On Awakeがチェックされているか確認 - または、スクリプトから
mascot.Show()を呼び出してください
- Inspector で
ウィンドウのクリック判定がおかしい#
Rectangle Window モードの場合:
- Rectangle Window モードでは、ウィンドウ全体がヒット判定領域です
- 透明部分もクリック可能(背後のウィンドウに影響)
- セル単位の透明度判定が必要な場合は、Alpha Mask Window モードに切り替えてください
Alpha Mask Window モードの場合:
Alpha Threshold を調整
- アルファ値がこの閾値より大きいピクセルは不透明と判定されます
- デフォルト: 0.5(0.0~1.0)
Precision を調整
Low: 12x16グリッド(最速、精度低)Medium: 24x32グリッド(推奨、バランス型)High: 48x64グリッド(高精度、やや重い)
パフォーマンスが悪い(FPS が低い)#
対処法:
Rectangle Window モードを使用
- Alpha Mask Window モードは Rectangle Window より負荷が高くなります
Precision を下げる
- Alpha Mask Window モード使用時、Precision を
Medium→Lowに変更
- Alpha Mask Window モード使用時、Precision を
Update Mode を Periodic または Manual に設定
EveryFrameは毎フレーム更新するため負荷が高くなります- 静止マスコットの場合は
Manualを推奨
Periodic Update Interval を長くする
- 更新間隔を 0.1秒 → 0.2秒以上に増やすと負荷が軽減されます
ウィンドウサイズを小さくする
- 大きなウィンドウほど負荷が増加します
Camera の設定を確認
- 不要な Post-Processing エフェクトを無効化
パフォーマンスと最適化#
DirectComposition によるパフォーマンス改善#
従来版(v2.2.0 GDI/WinForms)と比較して、DirectComposition 版(v3.0.0)では以下の改善が実現されています:
- CPU 使用率 70~90% 削減: GPU 上でのゼロコピーテクスチャ共有
- フレームレート安定化: GPU ハードウェアアクセラレーションによる安定した描画
- メモリ帯域幅削減: CPU↔GPU 間のテクスチャコピーを排除
ウィンドウモード別のパフォーマンス#
| モード | CPU 負荷 | GPU 負荷 | 用途 |
|---|---|---|---|
| Rectangle Window | 最小 | 最小 | シンプルな形状、パフォーマンス最優先 |
| Alpha Mask Window | やや高い | やや高い | 複雑な形状、セル単位の透明度判定が必要 |
最適化のヒント#
ウィンドウモードの選択
- 特別な理由がない限り、Rectangle Window モードを使用してください
- クリック透過が必要な場合のみ Alpha Mask Window を使用
Precision の調整
Lowで十分な精度が得られます(12x16グリッド、192セル)- より複雑な形状の場合、
Mediumを試してください(24x32グリッド、768セル)
Update Mode の選択
- 静止マスコット:
Manualを使用し、必要な時のみUpdateAlphaMask()を呼ぶ - アニメーション:
Periodicを使用し、Interval を 0.2秒以上に設定 - リアルタイム変化:
EveryFrameを使用(最も負荷が高い)
- 静止マスコット:
複数マスコット表示時の最適化
- 各マスコットの
Periodic Update Intervalをランダム化(自動的にオフセットされます) - Precision を
Lowに統一 - 不要なマスコットは
Hide()で非表示に
- 各マスコットの
既知の制限事項#
対応プラットフォーム#
- Windows 10/11 のみ対応: DirectComposition は Windows 専用 API です
- macOS、Linux、モバイルプラットフォームには非対応
Graphics API#
- Direct3D 11 のみサポート: Direct3D 12、Vulkan、OpenGL は非対応
- Unity Editor および Standalone Build で Direct3D 11 を使用する必要があります
ウィンドウ機能#
- ウィンドウサイズは初期化後に変更不可: ランタイム中のリサイズはサポートされていません
- ウィンドウの最小化・最大化ボタンなし: デスクトップマスコット用のボーダーレスウィンドウのため
- タスクバーに表示されない: デスクトップアクセサリとしての仕様
マルチモニタ#
- 基本的にサポート: ウィンドウは複数のモニタ間で移動可能
- 初期位置はプライマリモニタ:
Left/Topはプライマリモニタのスクリーン座標を基準とします
連絡先#
技術サポート#
問題が発生した場合や質問がある場合は、以下までご連絡ください:
- Email: [email protected]
バグレポート#
バグを発見した場合は、以下の情報を含めてご報告ください:
- Unity のバージョン
- OS のバージョン(Windows 10/11)
- 再現手順
- Unity Console のエラーメッセージ
- (可能であれば)プロジェクトの最小再現サンプル
Desktop Mascot Maker - DirectComposition版 をお選びいただき、ありがとうございます!