はじめに
- Unity で人気の台パン猫放置ゲーム Bongo Cat のクローンを作ります。
- この記事では主に必要となる、「キーボード入力イベントを常に受け取る」という技術と「デスクトップでウィンドウを透過させる」という技術の二点についてお話します。
キーボード入力イベントを常に受け取る
- Bongo Cat ではゲームのウィンドウがアクティブになっていなくても、常にキーボード入力イベントを受け取りカウントしています。
- これは SharpHook というライブラリを使って実現できます。
インストール
- まずは SharpHook のインストールのために、依存関係を管理する NuGetForUnity をインストールします。
- NuGetForUnity は Releases にある
.unitypackage
ファイルをダウンロードし、実行してインストールします。 - NuGetForUnity がインストール出来たら、Unity のメニューに「NuGet」が追加されるので、
NuGet > Manage NuGet Packages
を選択します。 - NuGetForUnity のウィンドウが開くので、検索窓に
SharpHook
と入力して検索し、表示されるSharpHook
とSharpHook.Reactive
をインストールします。
実装
- 以下のスクリプトを作成し、シーン中の任意のオブジェクトにアタッチします。
using UnityEngine;
using SharpHook;
using SharpHook.Native;
public class GlobalKeyListener : MonoBehaviour
{
private IGlobalHook hook;
void Start()
{
// グローバルキーフックの作成
hook = new SimpleGlobalHook();
// キー押下イベントに関数を登録
hook.KeyPressed += OnKeyPressed;
// フックの開始
hook.RunAsync();
}
private void OnKeyPressed(object sender, KeyboardHookEventArgs e)
{
Debug.Log($"キーが押されました: {e.Data.KeyCode}");
// 特定のキー(ここではiキー)の検出
if (e.Data.KeyCode == KeyCode.VcI)
{
Debug.Log("iキーが押されました!");
OnIPressed();
}
}
private void OnIPressed()
{
// iキーが押されたときに実行する処理
Debug.Log("iキーの処理を実行します。");
}
private void OnDestroy()
{
// アプリ終了時にフックを解除
if (hook != null)
{
hook.Dispose();
hook = null;
}
}
}
動作確認
- シーンを再生すると UnityEditor が非アクティブな状態でもキーボード入力イベントを受け取って、ログが表示されることが確認できます。
注意
-
OnKeyPressed
はメインスレッドではなくサブのスレッドで動作します。 - Unity ではメインスレッド以外で Unity のオブジェクトを操作すると処理が停止するなど正常に動作しません。
- 今回はログを出すだけなので問題ないですが、もっと複雑な処理をしたい場合は、
OnKeyPressed
の中では Action の Queuing だけして、メインスレッドの Update でそれを消化する、などの実装が必要になります。
デスクトップでウィンドウを透過させる
- Bongo Cat ではウィンドウのフレームや背景を透過させることで、猫がタスクバー上に乗っているような表現をしています。
- これは UniWindowController というライブラリを使って実現できます。
インストール
-
Releases にある
.unitypackage
ファイルをダウンロードし、実行してインストールします。
実装
- Assets/Kirurobo/UniWindowController/Runtime/Prefabs にある UniWindowController.prefab をシーンに追加します
- UniWindowController をインスペクターで確認します
- Is Transparent にチェックをして背景を透過にしてフレームもなくします
- Player Settings を適切に直します(緑のボタンでまとめて設定が変更されます)
- 左クリックからのドラッグでウィンドウを移動させられるようにするためにプレハブを追加します
- Assets/Kirurobo/UniWindowController/Runtime/Prefabs にある DragMoveCanvas.prefab をシーンに追加します
- これを動かすためにヒエラルキービューで
+ > UI > EventSystem
で EventSystem を追加します
- ウィンドウが透過すると何も見えなくなるので、ヒエラルキービューで
+ > 3D Object > Cube
としてキューブをシーンにおいておきます
動作確認
- メニューの
File > Build and Run
で実行して動作を確認します。 - デスクトップ上にウィンドウのフレームも背景もないキューブが浮いていたら成功です。