Unityからマウスカーソルを操作する

  • 12
    Like
  • 0
    Comment

Unityからマウスカーソルを操作してみる

(あるいは Win32 APIの利用について / デスクトップマスコット風プロ生ちゃん添え)


プロ生ちゃん Advent Calendar 2016 に空きがありましたので "マウスカーソルを引き寄せる能力をもったデスクトップマスコット風プロ生ちゃん" を作って載せてみました。

Windows専用です。下記からダウンロードできます。
https://github.com/kirurobo/UnityWindowController/releases/download/Ver.0.1.0/Demo_PronamaChanDesktop_Win32.zip

(ただ、環境によっては起動直後に真っ白になってしまうかも。そのときは[End]か[Home]を2回押すとたぶん表示されます。)
(また、ウィンドウ枠がないデスクトップマスコット風ですが、実際には矩形のウィンドウがありますので後ろは操作できなかったりします。)

中身はUnityパッケージでも置いておこうと思いますが、一部ユニティちゃんのモーションを使っていたのでライセンス的に公開できるかどうかわからず本日時点ではまだ用意できていません m(__)m
後日公開したいと思います。

プロ生ちゃん要素は以上です。

発端は光輝さんの下記ツイートを拝見して、単にカーソル移動くらいなら前に作ったなーということで今でも Unity で動くか確認してみようということで試したものです。

デスクトップマスコット風プロ生ちゃんを起動してフォーカスがある状態で [Shift] キーを押すと、マウスカーソルを引き寄せます。

Win32 API でマウスカーソルを移動させるだけなら割合簡単で、Plugins フォルダに何か置いたりする必要もなく、下記のようなC#スクリプトを作成して、適当なものにアタッチさせれば動きました。
こんな感じで他の Win32 API 関数も呼べます。

CursorController.cs
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class CursorController : MonoBehaviour {

    [DllImport("user32.dll")]
    public static extern bool SetCursorPos(int x, int y);

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (Input.GetButton("Fire1"))
        {
            SetCursorPos(400, 400);
        }
    }
}

ポイントは
・ using System.Runtime.InteropServices を入れる
・ [DllImpot("user32.dll")] で使う関数を書く
というところです。

マウスカーソル移動だけだとあまり実用性はありませんが、マウスボタン押下も組み合わせるとペイント上に落書きとかできるかもしれません。
(今回のプロ生ちゃんはカーソル移動しか入れられていませんが。)

ただ、ボタン押下になるともうちょっと色々と書かないといけません。

というわけでボタン押下や、ウィンドウを操作する関数、Aeroによるウィンドウ透過を含めてGitHubにて公開してあります。よろしければご覧ください。
https://github.com/kirurobo/UnityWindowController
私が作成した部分は Unlicense (パブリックドメイン相当)になっています。また、Wrapper/WinApi.cs もパブリックドメイン相当です。


2017/01/03 追記
起動時に真っ白になっていたことの対策や、モーションの修正をしたうえでソースを UnityPackage の形でも公開しました。
https://github.com/kirurobo/UnityWindowController/releases/
に Demo_PronamaChanDesktop.unitypackage としてアップしてあります。