メインコンテンツへスキップ
  1. ソフトウェア/

Desktop Mascot Maker

·14 分
目次

Desktop Mascot Maker - DirectComposition版
#

Unity でデスクトップマスコット(デスクトップアクセサリ)を作成できるアセットです。

English version


目次
#

  1. このアセットについて
  2. 動作環境・必須設定
  3. 新機能(v3.0.0)
  4. Getting Started
  5. MascotMakerDComp コンポーネント機能説明
  6. MascotMakerDComp API リファレンス
  7. Event Callbacks
  8. Example シーン
  9. トラブルシューティング
  10. パフォーマンスと最適化
  11. 既知の制限事項
  12. 連絡先

このアセットについて
#

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 ビルドバックエンド対応

動作環境・必須設定
#

必須環境
#

項目要件
OSWindows 10 (1803 以降) または Windows 11
Unity バージョンUnity 2020.3 LTS 以降推奨
Graphics APIDirect3D 11 のみ
ビルドバックエンドMono または IL2CPP
アーキテクチャx86 (32-bit) または x86_64 (64-bit)

重要な設定
#

1. Graphics API を Direct3D 11 に設定
#

手順:

  1. EditProject SettingsPlayer
  2. Other Settings セクション
  3. Graphics APIs for Windows から Direct3D 11 以外を削除
  4. 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 の設定
#

  1. EditProject SettingsPlayer
  2. Other SettingsGraphics APIs for Windows
  3. Direct3D 11 以外を削除

2. 基本的な使い方
#

Step 1: カメラの準備
#

  1. デスクトップマスコットとして表示したいキャラクターを撮影するカメラを作成
  2. カメラの Clear FlagsSolid Color に設定
  3. Background の色のアルファ値を 0(完全透明)に設定

Step 2: MascotMakerDComp コンポーネントのアタッチ
#

  1. カメラに MascotMakerDComp コンポーネントをアタッチ
  2. Inspector で設定を調整(詳細は次のセクション参照)

Step 3: Play モードで確認
#

  1. Unity Editor の Play モードを実行
  2. デスクトップにマスコットウィンドウが表示されます
  3. マスコットをドラッグして移動可能

3. 最小構成の例
#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
using UnityEngine;
using DesktopMascotMaker;

public class SimpleMascot : MonoBehaviour
{
    void Start()
    {
        var mascot = GetComponent<MascotMakerDComp>();

        // ウィンドウを表示
        mascot.Show();
    }
}

MascotMakerDComp コンポーネント機能説明
#

Basic Settings
#

項目説明デフォルト値
Mascot Window Sizeウィンドウのサイズ(ピクセル単位)
注意: 初期化後は変更できません
(480, 640)
Play On AwakeStart 時に自動的にウィンドウを初期化・表示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 ModeRectangleWindow: 矩形ウィンドウモード(高速)
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

カスタムメニュー項目の追加方法:

  1. Context Menu Items のサイズを増やす
  2. 各項目の Label にメニュー表示テキストを入力
  3. OnSelected イベントで選択時の処理を設定

MascotMakerDComp API リファレンス
#

ウィンドウ表示・非表示
#

void Show()
#

ウィンドウを表示します(未初期化の場合は初期化も実行)。

1
mascot.Show();

void Hide()
#

ウィンドウを非表示にします(ウィンドウは破棄されません)。

1
mascot.Hide();

bool IsVisible { get; }
#

ウィンドウが表示中かどうかを取得します。

1
2
3
4
if (mascot.IsVisible)
{
    Debug.Log("ウィンドウは表示中です");
}

ウィンドウ位置
#

int Left { get; set; }
#

int Top { get; set; }
#

ウィンドウの位置を取得・設定します(スクリーン座標、左上が原点)。

1
2
3
4
5
6
7
// 位置を取得
int x = mascot.Left;
int y = mascot.Top;

// 位置を設定
mascot.Left = 200;
mascot.Top = 200;

ウィンドウサイズ
#

Vector2 MascotWindowSize { get; set; }
#

ウィンドウのサイズを取得・設定します(ピクセル単位)。

1
2
// サイズを取得
Vector2 size = mascot.MascotWindowSize;

重要: ウィンドウサイズは 初期化後は変更できません。初期化前(Awake/Start前)にのみ設定してください。ランタイム中にサイズを変更しても、初期値が使用され続けます。

コンテキストメニュー
#

void AddContextMenuItem(string label, UnityAction onSelected = null)
#

実行時にコンテキストメニュー項目を追加します。

1
2
3
4
5
6
7
// シンプルな追加
mascot.AddContextMenuItem("カスタムアクション");

// アクション付きで追加
mascot.AddContextMenuItem("アクション実行", () => {
    Debug.Log("アクションが実行されました");
});

void ClearContextMenuItems()
#

すべてのカスタムコンテキストメニュー項目をクリアします。

1
mascot.ClearContextMenuItems();

ウィンドウモード
#

WindowMode Mode { get; set; }
#

ウィンドウモードを取得・設定します。

1
2
3
4
5
// Rectangle Window モードに設定
mascot.Mode = MascotMakerDComp.WindowMode.RectangleWindow;

// Alpha Mask Window モードに設定
mascot.Mode = MascotMakerDComp.WindowMode.AlphaMaskWindow;

Alpha Mask 設定
#

float AlphaThreshold { get; set; }
#

アルファマスクの閾値を取得・設定します(0.0~1.0)。

1
2
// アルファ値が 0.3 より大きいピクセルを不透明と判定
mascot.AlphaThreshold = 0.3f;

HitTestPrecision Precision { get; set; }
#

アルファマスクの精度を取得・設定します。基本的にLowで十分だと思います。

1
2
3
4
5
6
7
8
// 高速・軽量(推奨)
mascot.Precision = MascotMakerDComp.HitTestPrecision.Low;

// バランス型
mascot.Precision = MascotMakerDComp.HitTestPrecision.Medium;

// 高精度モード
mascot.Precision = MascotMakerDComp.HitTestPrecision.High;

HitTestUpdateMode UpdateMode { get; set; }
#

アルファマスクの更新モードを取得・設定します。

1
2
3
4
5
6
7
8
// 毎フレーム更新(アニメーション向け)
mascot.UpdateMode = MascotMakerDComp.HitTestUpdateMode.EveryFrame;

// 定期更新(推奨)
mascot.UpdateMode = MascotMakerDComp.HitTestUpdateMode.Periodic;

// 手動更新のみ(最高パフォーマンス)
mascot.UpdateMode = MascotMakerDComp.HitTestUpdateMode.Manual;

void UpdateAlphaMask()
#

アルファマスクを手動で更新します(Update Mode が Manual の場合に使用)。

1
2
3
4
5
// アニメーションの特定フレームで更新
if (animationFrameChanged)
{
    mascot.UpdateAlphaMask();
}

マウス状態取得
#

Vector2 GetMousePosition()
#

マスコットウィンドウ内のマウス位置を取得します。

1
2
Vector2 mousePos = mascot.GetMousePosition();
Debug.Log($"マウス位置: {mousePos}");

bool IsMouseOver()
#

マウスがマスコットウィンドウ上にあるかを取得します。

1
2
3
4
if (mascot.IsMouseOver())
{
    Debug.Log("マウスがマスコット上にあります");
}

bool IsLeftButtonPressed()
#

bool IsRightButtonPressed()
#

bool IsMiddleButtonPressed()
#

各マウスボタンが押されているかを取得します。

1
2
3
4
if (mascot.IsLeftButtonPressed())
{
    Debug.Log("左ボタンが押されています");
}

その他
#

void Shutdown()
#

ウィンドウを終了し、リソースを解放します(通常は自動的に呼ばれます)。

1
mascot.Shutdown();

Event Callbacks
#

MascotMakerDComp は、マウス・ウィンドウイベントを UnityEvent で処理できます。

マウスイベント
#

Left Mouse Button
#

  • OnLeftMouseDown: 左マウスボタン押下時(Vector2 mousePos を受け取る)
  • OnLeftMouseUp: 左マウスボタンリリース時(Vector2 mousePos を受け取る)
  • OnLeftDoubleClick: 左マウスボタンダブルクリック時(Vector2 mousePos を受け取る)
1
2
3
mascot.OnLeftMouseDown.AddListener((mousePos) => {
    Debug.Log($"左クリックされました: {mousePos}");
});

Right Mouse Button
#

  • OnRightMouseDown: 右マウスボタン押下時(Vector2 mousePos を受け取る)
  • OnRightMouseUp: 右マウスボタンリリース時(Vector2 mousePos を受け取る)
  • OnRightDoubleClick: 右マウスボタンダブルクリック時(Vector2 mousePos を受け取る)
1
2
3
mascot.OnRightMouseDown.AddListener((mousePos) => {
    Debug.Log($"右クリックされました: {mousePos}");
});

Middle Mouse Button
#

  • OnMiddleMouseDown: 中マウスボタン押下時(Vector2 mousePos を受け取る)
  • OnMiddleMouseUp: 中マウスボタンリリース時(Vector2 mousePos を受け取る)
  • OnMiddleDoubleClick: 中マウスボタンダブルクリック時(Vector2 mousePos を受け取る)
1
2
3
mascot.OnMiddleMouseDown.AddListener((mousePos) => {
    Debug.Log($"中クリックされました: {mousePos}");
});

Mouse Wheel
#

  • OnMouseWheel: マウスホイール回転時(int delta を受け取る)
1
2
3
mascot.OnMouseWheel.AddListener((delta) => {
    Debug.Log($"ホイール回転: {delta}");
});

ウィンドウイベント
#

  • OnMove: ウィンドウ移動時(Vector2 windowPos を受け取る)
1
2
3
mascot.OnMove.AddListener((windowPos) => {
    Debug.Log($"ウィンドウ移動: {windowPos}");
});
  • OnDestroyed: MascotMakerDComp コンポーネントが破棄される直前
1
2
3
4
mascot.OnDestroyed.AddListener(() => {
    Debug.Log("マスコットが破棄されます");
    // 関連するGameObjectのクリーンアップなどを実行
});

コンテキストメニューイベント
#

  • OnContextMenuOpening: コンテキストメニューが開かれる直前(動的なメニュー項目の追加・削除が可能)
1
2
3
4
5
mascot.OnContextMenuOpening.AddListener(() => {
    // 動的にメニュー項目を追加
    mascot.ClearContextMenuItems();
    mascot.AddContextMenuItem("現在時刻: " + System.DateTime.Now.ToString("HH:mm"));
});

注意: カスタムメニュー項目の選択イベントは、各 ContextMenuItemOnSelected イベントで処理します。


Example シーン
#

Demo01_Event

  • マウスイベント、ウィンドウイベント、コンテキストメニューイベントが確認できるデモです
  • コンテキストメニューのデモ

Demo02_MultipleMascot

  • 複数のマスコットキャラクターを表示するデモです
  • 自動でWindowを動かすAIスクリプト
  • Rectangle Window Mode

Demo03_AlphaMaskWindow

  • Alpha Mask Windowの形状が確認できるデモです(Alpha Mask Window Mode)
  • キャラクターのOrbital View
  • Context Menu Close

トラブルシューティング
#

ウィンドウが表示されない
#

原因と対処法:

  1. Graphics API が Direct3D 11 ではない

    • Project SettingsPlayerGraphics APIs for Windows を確認
    • Direct3D 11 のみを有効にしてください
  2. DLL が見つからない

    • Unity Console で DllNotFoundException エラーを確認
    • Assets/DesktopMascotMaker/Plugins/x86_64/DCompMascot.dll(64-bit)または Assets/DesktopMascotMaker/Plugins/x86/DCompMascot.dll(32-bit)が存在することを確認
  3. Play On Awake が無効

    • Inspector で Play On Awake がチェックされているか確認
    • または、スクリプトから mascot.Show() を呼び出してください

ウィンドウのクリック判定がおかしい
#

Rectangle Window モードの場合:

  • Rectangle Window モードでは、ウィンドウ全体がヒット判定領域です
  • 透明部分もクリック可能(背後のウィンドウに影響)
  • セル単位の透明度判定が必要な場合は、Alpha Mask Window モードに切り替えてください

Alpha Mask Window モードの場合:

  1. Alpha Threshold を調整

    • アルファ値がこの閾値より大きいピクセルは不透明と判定されます
    • デフォルト: 0.5(0.0~1.0)
  2. Precision を調整

    • Low: 12x16グリッド(最速、精度低)
    • Medium: 24x32グリッド(推奨、バランス型)
    • High: 48x64グリッド(高精度、やや重い)

パフォーマンスが悪い(FPS が低い)
#

対処法:

  1. Rectangle Window モードを使用

    • Alpha Mask Window モードは Rectangle Window より負荷が高くなります
  2. Precision を下げる

    • Alpha Mask Window モード使用時、Precision を MediumLow に変更
  3. Update Mode を Periodic または Manual に設定

    • EveryFrame は毎フレーム更新するため負荷が高くなります
    • 静止マスコットの場合は Manual を推奨
  4. Periodic Update Interval を長くする

    • 更新間隔を 0.1秒 → 0.2秒以上に増やすと負荷が軽減されます
  5. ウィンドウサイズを小さくする

    • 大きなウィンドウほど負荷が増加します
  6. 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やや高いやや高い複雑な形状、セル単位の透明度判定が必要

最適化のヒント
#

  1. ウィンドウモードの選択

    • 特別な理由がない限り、Rectangle Window モードを使用してください
    • クリック透過が必要な場合のみ Alpha Mask Window を使用
  2. Precision の調整

    • Low で十分な精度が得られます(12x16グリッド、192セル)
    • より複雑な形状の場合、Medium を試してください(24x32グリッド、768セル)
  3. Update Mode の選択

    • 静止マスコット: Manual を使用し、必要な時のみ UpdateAlphaMask() を呼ぶ
    • アニメーション: Periodic を使用し、Interval を 0.2秒以上に設定
    • リアルタイム変化: EveryFrame を使用(最も負荷が高い)
  4. 複数マスコット表示時の最適化

    • 各マスコットの 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 はプライマリモニタのスクリーン座標を基準とします

連絡先
#

技術サポート
#

問題が発生した場合や質問がある場合は、以下までご連絡ください:

バグレポート
#

バグを発見した場合は、以下の情報を含めてご報告ください:

  1. Unity のバージョン
  2. OS のバージョン(Windows 10/11)
  3. 再現手順
  4. Unity Console のエラーメッセージ
  5. (可能であれば)プロジェクトの最小再現サンプル

Desktop Mascot Maker - DirectComposition版 をお選びいただき、ありがとうございます!