Help us understand the problem. What is going on with this article?

Unityが非フォーカス/バックグラウンドでも入力を受け取るテクニック集

More than 1 year has passed since last update.

はじめに

何かとUnityで非フォーカス/バッググラウンド(他のウインドウを選択している状態)で入力を受け取りたいというこということがあると思います(Vtuberのシステムとか)。しかし、Unityはバックグランドの状態ではInputを扱うことができません。

この記事ではUnityが非フォーカス状態でも入力を受け取るテクニックを書いていきます。
まず、前提としてUnityバックグラウンドでの処理 & 動作の検出を参考にUnityがUnityバックグラウンドでも処理が行われるようにしておきましょう。
Inkedキャプチャ_LI.jpg

1. 動作環境

  • Windows10
  • Unity2017.4.12f1
    ※OSに依存したライブラリが多く、Windows限定なものが多いです。

2. キーボードの入力を受け取る

UnityrawInputパッケージを導入すると、バックグランド時でもキーボードの入力を受け取れるライブラリが使えるようになります。なお、Windows Raw Input APIというWindowsのAPIを利用しているため、Windowsでしか使えません。

詳しい使い方はパッケージ配布ページにて説明されています。
また、【Unity】バックグラウンド動作時のキー入力取得でもサンプルプログラムとともに紹介されています。

3. マウスの入力を受け取る

Inputだとバックグラウンドで入力を受け取れませんが、Eventだとバックグラウンド状態でもマウスの入力を受け取ることができます。

以下にサンプルプログラムを置いておきます。

MouseBackgroundInput.cs
using UnityEngine;

public class MouseBackgroundInput : MonoBehaviour
{
    void OnGUI()
    {
        Event e = Event.current;
        //マウスのクリック
        if (e.button == 0 && e.isMouse)
        {
            Debug.Log("Left Click");
        }
        else if (e.button == 1)
        {
            Debug.Log("Right Click");
        }
        else if (e.button == 2)
        {
            Debug.Log("Middle Click");
        }
        else if (e.button > 2)
        {
            Debug.Log("Another button");
        }
        //マウスのポジション:Vector2
        Debug.Log("MousePos: " + e.mousePosition);
    }
}

4. ゲームコントローラの入力を受け取る

XboxコントローラかつWindows限定ですが、Unityでウィンドウが非フォーカスでもジョイパッドの入力を取得する方法にて非フォーカス状態でもゲームコントローラの入力が受け取れるサンプルプロジェクトが配布されております。

また、上記のサンプルプロジェクトを拡張し、unitypackageとしてまとめたものも作成しました。prefabを配置するだけで、コントローラの入力を監視でき、VRMモデルを用いたサンプルもあるため使いやすいかと思います。
XinputGamaPad

できるだけ詳しく使い方をREADME書いたつもりですが、もし分からない点や不具合などあればisuueを立てたり、直接私(@kaikofkaiki)にご報告してくださると幸いです。

5. マイクの入力を受け取る

こちらに関しては実はデフォルトからバックグラウンドでマイクの入力を受け取れます。(動作確認Windows)
自分はOVRLipSyncを使っていて、バックグラウンド状態だと反応せず、「マイクの入力がバックグラウンドで取れていないのでは」と深読みして苦しんだのでここに記しておきます。

この項はOVRLipSyncのバックグラウンド入力で苦しんだ人に向けて書きます。
OVRLipsyncはUnityがバックグラウンド状態かどうかを監視し、バックグラウンド状態であればマイクを止める処理がなされております。その処理をコメントアウトしてしまうか、消してしまえば非フォーカス状態でも動いてくれるようになります。
OVRLipSyncMicInput.csにあるStopMicrophone();を全部消すかコメントアウトしてしまいましょう。
以下は全てではなく一部ですが、以下のようなコードがあるはずです。

OVRLipSyncMicInput.cs
~~~中略~~~
if (!Application.isPlaying)
{
    //コメントアウト
    //StopMicrophone();
    return;
}
~~~中略~~~
if (!focused){
    //コメントアウト
    //StopMicrophone();
}
~~~中略~~~

6. 参考

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした