- 2020/11/19 【Unity】【C#】EventSystem を InputSystem 用に置き換えると、スクロールビュー等の移動が速過ぎる
- 2020/10/21 【Unity】InputSystem 対応 ダブル/トリプル(n回)クリック操作ライブラリ (FantomPlugin 追加機能)
- 2020/10/20 【Unity】InputSystem 対応 長押し操作ライブラリ (FantomPlugin 追加機能)
- 2020/10/19 【Unity】InputSystem 対応 スワイプ(フリック) 操作ライブラリ (FantomPlugin 追加機能)
- 2020/10/18 【Unity】InputSystem 対応 ピンチ操作ライブラリ (FantomPlugin 追加機能)
« prev next »
【Unity】【C#】EventSystem を InputSystem 用に置き換えると、スクロールビュー等の移動が速過ぎる 
2020/11/19 Thu [edit]
InputSystem を導入すると、EventSystem に「Replace with InputSystemModule」というボタンが出てくるが、これを押すと、UI などのイベントが InputSystem での検出に置き換わる。

しかし、実験していて気づいたのだが、ScrollView や Dropdown などに使われている ScrollRect でのスクロールが (旧)InputManager から引き継いで使っていると、過剰に反応することがあるようだ。
調べてみたら、たまたま私が (旧)InputManager の Axes>Mouse ScrollWheel の Sensitivity をデフォルトの 0.1 のまま、それを基準として各スクロールビュー関連の UI の速度を調整していたため、(新)InputSystem での基準値 1.0 では速くなり過ぎるということだった(つまり簡単には、Input.GetAxis("Mouse ScrollWheel") ではホイールを1目盛回すと 0.1 が返ってくるが、Mouse.current.scroll.ReadValue() では 1.0 が返ってくるため、反応が異なる)。

InputSystem.UI 辺りを使えば、基準値を変えられそうな気もするが、プロジェクトによって基準値が異なるのも互換性が損なわれるので、いっそのこと、ScrollRect の設定を一気に置き換えたら良いんじゃないか?とやってみたら、上手くいった。
その便利ツールのスクリプト。
(※) Unity 2019.4.14f1 / Windows10(x64) で確認
●ヒエラルキー(シーン)の全ての ScrollRect.scrollSensitivity を編集するツール(エディタ拡張)
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
#if UNITY_EDITOR
using UnityEditor;
#endif
/// <summary>
/// ヒエラルキー(シーン)の全ての ScrollRect.scrollSensitivity を編集するツール
/// 2020/11/19 Fantom (Unity 2019.4)
/// http://fantom1x.blog130.fc2.com/blog-entry-388.html
///
/// (使い方)
/// 1. ヒエラルキーに適当な GameObject にこのスクリプトをアタッチ
/// 2. インスペクタで「Multiply」(元の値を乗算する値:デフォルト 0.1 = 元の値を 1/10 にする)
/// 3. [Scan and Edit] ボタンを押す
/// </summary>
public class ScrollSensitivityScanAndEditTool : MonoBehaviour
{
[Header("Edit Parameter")]
public float multiply = 0.1f; //元の値を乗算
}
#if UNITY_EDITOR
/// <summary>
/// ヒエラルキー(シーン)の全ての ScrollRect.scrollSensitivity を編集するツール(エディタ拡張)
/// 2020/11/19 Fantom (Unity 2019.4)
/// http://fantom1x.blog130.fc2.com/blog-entry-388.html
/// </summary>
[CustomEditor(typeof(ScrollSensitivityScanAndEditTool))]
public class ScrollSensitivityScanAndEditToolEditor : Editor
{
bool _isBusy;
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (Application.isPlaying)
return;
EditorGUILayout.Space(15);
if (GUILayout.Button("Scan and Edit") && !_isBusy)
{
ScanAndEdit();
}
}
void ScanAndEdit()
{
Debug.Log("Start Scan");
_isBusy = true;
var obj = target as ScrollSensitivityScanAndEditTool;
var multiply = obj.multiply;
int cnt = 0;
var scrolls = GetComponentsAll<ScrollRect>(); //※以前の記事を参照
if (scrolls != null && scrolls.Length > 0)
{
foreach (var scroll in scrolls)
{
cnt++;
var tr = scroll.transform;
var path = GetFullPathName(tr); //※以前の記事を参照
var sens = scroll.scrollSensitivity;
var edited = sens * multiply;
Undo.RecordObject(scroll, "Scroll Sensitivity Edit");
scroll.scrollSensitivity = edited;
Debug.Log($"Edited : {sens} -> {edited} - {path}");
EditorUtility.SetDirty(scroll);
}
}
_isBusy = false;
Debug.Log($"Finish Scan : Count = {cnt}");
}
#region Static methods
//Transform 関連メソッド
//http://fantom1x.blog130.fc2.com/?tag=Transform
// 現在のシーンのルートにある Transform を全て取得 (非アクティブも含む)
// http://fantom1x.blog130.fc2.com/blog-entry-377.html
static Transform[] GetRootTransforms()
{
var scene = SceneManager.GetActiveScene();
var objects = scene.GetRootGameObjects();
return objects.Select(go => go.transform).ToArray(); //無い時は 0 個の配列(null にはならない)
}
// 現在のシーン(ヒエラルキー)の全てのオブジェクトからコンポーネントを取得する(非アクティブも含む)
// http://fantom1x.blog130.fc2.com/blog-entry-378.html
static T[] GetComponentsAll<T>()
{
var list = new List<T>();
var roots = GetRootTransforms(); //ルートにある Transform 全て取得(非アクティブも含む)
//全てのルート Transform 以下に GetComponentsInChildren() する
foreach (var tr in roots)
{
var objects = tr.GetComponentsInChildren<T>(true); //非アクティブも含む取得
if (objects != null && objects.Length > 0)
{
list.AddRange(objects);
}
}
return list.ToArray(); //無いときは、0 個の配列(null にはならない)
}
// Transform の(フル)パス名を作成する
// http://fantom1x.blog130.fc2.com/blog-entry-379.html
static string GetFullPathName(Transform transform)
{
if (transform.parent == null)
return transform.name;
return GetFullPathName(transform.parent) + "/" + transform.name;
}
#endregion Static methods
}
#endif
GetRootTransforms, GetComponentsAll, GetFullPathName の3つのメソッドは以前の記事を参照。
まぁ、実の事を言うと、以前に配布した AttachedImageFinder のコードを少し改造して、適当な GameObject にアタッチして、インスペクタで実行する形にしたものである。普通1度しか使わないだろうし、メニューにずっといるのも邪魔なので、使う時はヒエラルキーに置いて、使い終わったら削除する、みたいな方法で良いかな、と。
使い方は [Scan and Edit] ボタンを押すだけだが、インスペクタの設定は Multiply で「元の値×設定値」に更新するので、デフォルトは 1/10 倍(= 0.1) となっている。例えば、(旧)InputManager のとき ScrollRect の Sensitivity が 100 に設定されていたなら、実行後は 100 x 0.1 = 10 に更新されているハズだ。だいたいこれで (新)InputSystem でも同じ感覚になるようだ((旧)InputManager の "Mouse ScrollWheel" の Sensitivity が 0.1 のとき)。


ただ、私が試した所(掲載時点:InputSystem 1.0.0)、PC では問題ないが、Android では微妙に UI の反応が悪い気がする。これは ScrollRect というより、新しく置き換えた EventSystem が不安定(?) な感じがするからだ。というのも、スクロール以外にも、例えばボタンなども、押しても反応しなくなったり、しばらくしたら、反応が良くなったりすることが多々ある。
どこに書いてあったか忘れたが、確か InputSystem は Unity から独立したポーリング(スレッド)で動いていて、Unity の描画遅延などの影響を受けない、みたいなことが説明されていた。しかし普通に考えれば、スレッド間でデータをやりとりするには、受信タイミングを合わせる必要がある。Android ではそれが上手く行ってないのかも知れない。少し前に Android のバックキーのバグレポを Unity公式に出したが、この問題は確認できたので対応すると返信が来た。この挙動もスレッド間通信による、同期失敗の可能性がある。
まぁ、私の所見ではあるが、まだ InputSystem 1.0.0 は変換キー関連や、モバイルでの挙動など、怪しい部分がいくつかあるので、一気に InputSystem に移行するのはやめた方が良いだろう。当面は InputManager と共存(Edit>Player Settings>Other Settings>Active Input Handling で Both にする)して、少しずつ動作確認してから、移行した方が良いかも知れない。ただ、InputSystem は機種依存がある気がするので(バグレポを複数出したが、確認とれないというのもあった → しかし、私の環境では再現できる)、できる限り色々な機種や条件を変えて試してみた方が良い気がする。
(関連記事)
【Unity】ヒエラルキー(シーン)の Image, RawImage に使われている画像(Texture)を検出するエディタ拡張(ツール)
【Unity】【C#】シーン(ヒエラルキー)のルートにある Transform を全て取得する(非アクティブも含む)
【Unity】【C#】非アクティブも含めて、全ての GameObject からコンポーネントを取得する
【Unity】【C#】Transfrom (GameObject) のパス名を取得する
【Unity】InputSystem 対応 ピンチ操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 スワイプ(フリック) 操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 長押し操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 ダブル/トリプル(n回)クリック操作ライブラリ (FantomPlugin 追加機能)
【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】InputSystem の Mouse クラスと(旧)Input.GetMouseButton の対応
【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応
【Unity】【C#】InputSystem.TouchPhase の IsActive(), IsEndedOrCanceled() [拡張メソッド] の具体値
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得(変換)する
【Unity】【C#】InputSystem で Android のバックキーの isPressed がなぜか一定時間で false になる?
- 関連記事
category: Unity
thread: ゲーム開発
janre: コンピュータ
tag: Unityトラブルシューティング Unityライブラリ InputSystem【Unity】InputSystem 対応 ダブル/トリプル(n回)クリック操作ライブラリ (FantomPlugin 追加機能) 
2020/10/21 Wed [edit]
InputSystem も Verified (正式版) となり、色々と調査して概要もわかってきたので、今まで作った操作系のライブラリも更新してみた。
ただ、調査記事にも書いてあるが、現在の InputSystem は微妙に不安定な箇所もあり、Unity 公式にいくつかバグレポとして出しておいたが、「確認できず」という返信も貰っている。ただ私の環境では確実に起こる不具合もあるので、もしかしたら、InputSystem はハードウェア依存もあるのかも知れない(私は「Windows 日本語106キーボード」だが、Unityの中の人は「Mac 英語104キーボード」を使っているとしたら、不具合が見つけづらいという可能性もある[※掲載時点:InputSystem 1.0.0])。
なので、一気に InputSystem に移行するのはやめた方が良いだろう。幸いにも現在は(掲載時点:Unity2019.4.12f1)(旧)InputManager との混在も可能なので、動作確認が取れたものだけ使う方が良いだろう(できる限り色々な機器で試した方が良いと思われる ← 一部の人だけ使えないという問題が起こる可能性がある)。
そのため、完全互換とまではいかないかも知れないが、新旧システムどちらも使えるように入力関連の機能を中心に更新してみた。InputSystem のバージョンが上がったら、修正するかも知れないが、とりあえず 旧 InputManager の仕様に似せた実装なので、使い勝手はほとんど変わらないだろう。
ちなみに、スクリプトは大きく分けて、「~Input」と「~EventTrigger」となっているが、~Input は画面の全体や一部での検出、~EventTrigger はアタッチした UI 上での検出と考えて良い。また、~Input はイベント検出した瞬間以外に、ポーリング的な使い方もできるが、~EventTrigger はイベント検出した瞬間のみという違いもある。
ここでは、簡単な使い方や注意点などをまとめておいた。とりあえずの参考にして欲しい。
●MultiClickInput / MultiClickEventTrigger (クリック/タッチ)
・Valid Area 図解
※他の操作は別ページにあります。
■ピンチ操作
■スワイプ(フリック) 操作
■長押し操作
(※) Unity 2019.4.12f1 / InputSystem 1.0.0 / Windows10(x64) / Android 8.0 で確認
■ダブル/トリプル(n回)クリック操作
●MultiClickInput / MultiClickEventTrigger
主にPCではマウスクリック、モバイルではタッチとなるが、一定時間内で指定回数クリックを検出する。指定回数が 1 以上なら、その回数が押されたタイミングで検出されるが、指定回数が無い(0)のときは、一定時間内のクリック数を押されるたびに検出する。それらは、OnMultiClick のコールバックでクリック回数を検知できる。
MultiClickInput は画面全体、または一部(画面の上半分、下半分など)での操作を取得するのに向いている。空の GemeObject にアタッチして使う。
MultiClickEventTrigger は UI 上での操作を取得するのに向いている。Button や Image など、Raycast Target をオンにして、同じ GameObject にアタッチする。Canvas に Graphic Raycaster がないとイベントが取得できないので注意しよう。インスペクタの設定は一部の有無だけで(Valid Area, Use InputSystem If Both Handling 等)、基本的には同じだ。

(インスペクタ)
Use InputSystem If Both Handling | ActiveInputHandling(Edit>Player Settings>Other Settings>Active Input Handling)が Both のとき、InputSystem を使う(※Both 以外のときは表示されません) オン:InputSystem / オフ: (旧)InputManager |
---|---|
Click Count | 検出するクリック回数 (1 以上のとき、指定回数で検出 / 0 のとき、有効時間内の全てのクリックを検出) |
Valid Time | 最初の1回から有効な時間 [秒] (この時間以内でクリックをカウントする。超えたときは、最初から(1から)) |
Valid Area | 認識する画面上の領域(0.0~1.0)[(0,0):画面左下, (1,1):画面右上] ※図解参照 |
▼Callbacks | |
OnMultiClick | n回クリックイベント発生コールバック int は検出したクリック回数を表す。 Click Count > 0 のとき、指定数に達した瞬間 / 0 のとき、有効時間内でクリックのたび (1, 2, 3,… ) |
※Debug Tools は主に Valid Area を可視化します。
※Game ビューの解像度に依存します。上手く反映されない場合は、Game ビューをいじってみて下さい。
(Valid Area 図解)
Valid Area は、画面左下を (0, 0) とし、画面の最大幅と高さを (1, 1) としたときの全体比で指定する。つまり、0.5 だと画面の長さの半分で、0.25 だと 1/4 である。つまり、解像度が変わっても位置は変わらないことになる(ただし、縦置き・横置きで回転する場合は注意)。基本的に他の ~Input 系の Valid Area も同じようになっている。画面全体での位置となるので(画面の上半分で操作、下半分は使わないなどに向いている)、UI 上に限定したいなら、~EventTrigger 系を使った方が良いだろう。
(例)
X: 0 | Y: 0.25 |
W: 1 | H: 0.6 |

(関連記事)
【Unity】InputSystem 対応 ピンチ操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 スワイプ(フリック) 操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 長押し操作ライブラリ (FantomPlugin 追加機能)
【Unity】【C#】ピンチ操作を取得してコールバックする
【Unity】【C#】スワイプ(フリック)を判定、方向を取得してコールバックする
【Unity】【C#】長押し(ロングタップ)を取得してコールバックする
【Unity】【C#】SmoothFollow3(SmoothFollow に回転・遠近・高さ操作とピンチ・スワイプとの連携機能を付けた拡張版)
【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】InputSystem の Mouse クラスと(旧)Input.GetMouseButton の対応
【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応
【Unity】【C#】InputSystem.TouchPhase の IsActive(), IsEndedOrCanceled() [拡張メソッド] の具体値
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得(変換)する
【Unity】【C#】InputSystem で Android のバックキーの isPressed がなぜか一定時間で false になる?
【Unity】【C#】EventSystem を InputSystem 用に置き換えると、スクロールビュー等の移動が速過ぎる
- 関連記事
category: Unity
thread: ゲーム開発
janre: コンピュータ
tag: Unityプラグイン Unityライブラリ InputSystem FantomPlugin【Unity】InputSystem 対応 長押し操作ライブラリ (FantomPlugin 追加機能) 
2020/10/20 Tue [edit]
InputSystem も Verified (正式版) となり、色々と調査して概要もわかってきたので、今まで作った操作系のライブラリも更新してみた。
ただ、調査記事にも書いてあるが、現在の InputSystem は微妙に不安定な箇所もあり、Unity 公式にいくつかバグレポとして出しておいたが、「確認できず」という返信も貰っている。ただ私の環境では確実に起こる不具合もあるので、もしかしたら、InputSystem はハードウェア依存もあるのかも知れない(私は「Windows 日本語106キーボード」だが、Unityの中の人は「Mac 英語104キーボード」を使っているとしたら、不具合が見つけづらいという可能性もある[※掲載時点:InputSystem 1.0.0])。
なので、一気に InputSystem に移行するのはやめた方が良いだろう。幸いにも現在は(掲載時点:Unity2019.4.12f1)(旧)InputManager との混在も可能なので、動作確認が取れたものだけ使う方が良いだろう(できる限り色々な機器で試した方が良いと思われる ← 一部の人だけ使えないという問題が起こる可能性がある)。
そのため、完全互換とまではいかないかも知れないが、新旧システムどちらも使えるように入力関連の機能を中心に更新してみた。InputSystem のバージョンが上がったら、修正するかも知れないが、とりあえず 旧 InputManager の仕様に似せた実装なので、使い勝手はほとんど変わらないだろう。
ちなみに、スクリプトは大きく分けて、「~Input」と「~EventTrigger」となっているが、~Input は画面の全体や一部での検出、~EventTrigger はアタッチした UI 上での検出と考えて良い。また、~Input はイベント検出した瞬間以外に、ポーリング的な使い方もできるが、~EventTrigger はイベント検出した瞬間のみという違いもある。
ここでは、簡単な使い方や注意点などをまとめておいた。過去記事と合わせて参考にして欲しい。
●LongClickInput / LongClickEventTrigger (クリック/タッチ)
・Valid Area 図解
●LongKeyInput (キーボード)
※他の操作は別ページにあります。
■ピンチ操作
■スワイプ(フリック) 操作
■ダブル/トリプル(n回)クリック操作
(※) Unity 2019.4.12f1 / InputSystem 1.0.0 / Windows10(x64) / Android 8.0 で確認
■長押し(クリック/タッチ)操作
●LongClickInput / LongClickEventTrigger
主にPCではマウスクリック、モバイルではタッチとなるが、一定時間押しっぱなしにされている状態(開始と継続)を検出する。これらはプロパティ(IsLongClick)をポーリング的に取得するか、OnLongClick, OnStart, OnProgress, OnCancel のコールバックでタイミングを検知できる。
LongClickInput は画面全体、または一部(画面の上半分、下半分など)での操作を取得するのに向いている。空の GemeObject にアタッチして使う。
LongClickEventTrigger は UI 上での操作を取得するのに向いている。Button や Image など、Raycast Target をオンにして、同じ GameObject にアタッチする。Canvas に Graphic Raycaster がないとイベントが取得できないので注意しよう。インスペクタの設定は一部の有無だけで(Valid Area, Use InputSystem If Both Handling 等)、基本的には同じだ。
その他、コードなどの解説は以前の記事を参照して欲しい。

(インスペクタ)
Use InputSystem If Both Handling | ActiveInputHandling(Edit>Player Settings>Other Settings>Active Input Handling)が Both のとき、InputSystem を使う(※Both 以外のときは表示されません) オン:InputSystem / オフ: (旧)InputManager |
---|---|
Valid Time | 長押しとして認識する時間 [秒] (これより長い時間で長押しとして認識する。短いときは無視する:OnCancel が発火する) |
Valid Area | 認識する画面上の領域(0.0~1.0)[(0,0):画面左下, (1,1):画面右上] ※図解参照 |
▼Callbacks | |
OnLongClick | 長押しイベントコールバック Valid Time を超えて押した瞬間 |
OnStart | 長押し・進捗開始のイベントコールバック クリック(タッチ)した瞬間。ただし、複数のときは無効 |
OnProgress | 進捗のイベントコールバック 押下継続中。値は Valid Time を1とし、0~1f(x100 で%を表す) |
OnCancel | 進捗中断のイベントコールバック 指を離したり、範囲外に出たときなど、長押しとして認識できなかったとき |
プロパティ)
IsLongClick | 長押し検出 (フレーム毎判定) 長押しとして認識された瞬間のみ true。それ以外のときは常に false |
---|
※Debug Tools は主に Valid Area を可視化します。
※Game ビューの解像度に依存します。上手く反映されない場合は、Game ビューをいじってみて下さい。
(Valid Area 図解)
Valid Area は、画面左下を (0, 0) とし、画面の最大幅と高さを (1, 1) としたときの全体比で指定する。つまり、0.5 だと画面の長さの半分で、0.25 だと 1/4 である。つまり、解像度が変わっても位置は変わらないことになる(ただし、縦置き・横置きで回転する場合は注意)。基本的に他の ~Input 系の Valid Area も同じようになっている。画面全体での位置となるので(画面の上半分で操作、下半分は使わないなどに向いている)、UI 上に限定したいなら、~EventTrigger 系を使った方が良いだろう。
(例)
X: 0 | Y: 0.25 |
W: 1 | H: 0.6 |

■長押し(キーボード)操作
●LongKeyInput
主にPCではキーボード、モバイルではバックキー(Android)となるが、一定時間押しっぱなしにされている状態(開始と継続)を検出する。これらはプロパティ(IsLongPress)をポーリング的に取得するか、OnLongPress, OnStart, OnProgress, OnCancel のコールバックでタイミングを検知できる。
基本的には、クリック/タッチ操作をキー操作に代えたものと考えて良い。

(インスペクタ)
Use InputSystem If Both Handling | ActiveInputHandling(Edit>Player Settings>Other Settings>Active Input Handling)が Both のとき、InputSystem を使う(※Both 以外のときは表示されません) オン:InputSystem / オフ: (旧)InputManager |
---|---|
Target Key | 長押しを検出するキー。InputSystem では Key, (旧)InputManager では KeyCode で指定する。 ※Key と KeyCode は互換性が無い場合があるので注意(特に記号、機能キー)。 また、設定値(enum)は別々のフィールドで定義されているため、Use InputSystem If Both Handling やシステム自体を切り替えたとき、初期化されることがあります(ヒエラルキーの EventSystem もシステムに合わせて更新した方が良い)。 |
Valid Time | 長押しとして認識する時間 [秒] (これより長い時間で長押しとして認識する。短いときは無視する:OnCancel が発火する) |
▼Callbacks | |
OnLongPress | 長押しイベントコールバック Valid Time を超えて、長押しとして認識した瞬間 |
OnStart | 長押し・進捗開始のイベントコールバック クリック(タッチ)した瞬間。ただし、複数のときは無効 |
OnProgress | 進捗のイベントコールバック 押下継続中。値は Valid Time を1とし、0~1f(x100 で%を表す) |
OnCancel | 進捗中断のイベントコールバック 指を離したり、範囲外に出たときなど、長押しとして認識できなかったとき |
(プロパティ)
IsLongPress | 長押し検出 (フレーム毎判定) 長押しとして認識された瞬間のみ true。それ以外のときは常に false |
---|
(関連記事)
【Unity】InputSystem 対応 ピンチ操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 スワイプ(フリック) 操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 ダブル/トリプル(n回)クリック操作ライブラリ (FantomPlugin 追加機能)
【Unity】【C#】ピンチ操作を取得してコールバックする
【Unity】【C#】スワイプ(フリック)を判定、方向を取得してコールバックする
【Unity】【C#】長押し(ロングタップ)を取得してコールバックする
【Unity】【C#】SmoothFollow3(SmoothFollow に回転・遠近・高さ操作とピンチ・スワイプとの連携機能を付けた拡張版)
【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】InputSystem の Mouse クラスと(旧)Input.GetMouseButton の対応
【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応
【Unity】【C#】InputSystem.TouchPhase の IsActive(), IsEndedOrCanceled() [拡張メソッド] の具体値
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得(変換)する
【Unity】【C#】InputSystem で Android のバックキーの isPressed がなぜか一定時間で false になる?
【Unity】【C#】EventSystem を InputSystem 用に置き換えると、スクロールビュー等の移動が速過ぎる
- 関連記事
category: Unity
thread: ゲーム開発
janre: コンピュータ
tag: Unityプラグイン Unityライブラリ InputSystem FantomPlugin【Unity】InputSystem 対応 スワイプ(フリック) 操作ライブラリ (FantomPlugin 追加機能) 
2020/10/19 Mon [edit]
InputSystem も Verified (正式版) となり、色々と調査して概要もわかってきたので、今まで作った操作系のライブラリも更新してみた。
ただ、調査記事にも書いてあるが、現在の InputSystem は微妙に不安定な箇所もあり、Unity 公式にいくつかバグレポとして出しておいたが、「確認できず」という返信も貰っている。ただ私の環境では確実に起こる不具合もあるので、もしかしたら、InputSystem はハードウェア依存もあるのかも知れない(私は「Windows 日本語106キーボード」だが、Unityの中の人は「Mac 英語104キーボード」を使っているとしたら、不具合が見つけづらいという可能性もある[※掲載時点:InputSystem 1.0.0])。
なので、一気に InputSystem に移行するのはやめた方が良いだろう。幸いにも現在は(掲載時点:Unity2019.4.12f1)(旧)InputManager との混在も可能なので、動作確認が取れたものだけ使う方が良いだろう(できる限り色々な機器で試した方が良いと思われる ← 一部の人だけ使えないという問題が起こる可能性がある)。
そのため、完全互換とまではいかないかも知れないが、新旧システムどちらも使えるように入力関連の機能を中心に更新してみた。InputSystem のバージョンが上がったら、修正するかも知れないが、とりあえず 旧 InputManager の仕様に似せた実装なので、使い勝手はほとんど変わらないだろう。
ちなみに、スクリプトは大きく分けて、「~Input」と「~EventTrigger」となっているが、~Input は画面の全体や一部での検出、~EventTrigger はアタッチした UI 上での検出と考えて良い。また、~Input はイベント検出した瞬間以外に、ポーリング的な使い方もできるが、~EventTrigger はイベント検出した瞬間のみという違いもある。
ここでは、簡単な使い方や注意点などをまとめておいた。過去記事と合わせて参考にして欲しい。
●SwipeInput / SwipeEventTrigger
・Valid Area 図解
※他の操作は別ページにあります。
■ピンチ操作
■長押し操作
■ダブル/トリプル(n回)クリック操作
(※) Unity 2019.4.12f1 / InputSystem 1.0.0 / Windows10(x64) / Android 8.0 で確認
■スワイプ(フリック)操作
●SwipeInput / SwipeEventTrigger
主にモバイル操作用となるが、タッチされた1本の指の4方向と移動量[px]を返す。これらはそれぞれのプロパティ(Direction, DirectionRaw)をポーリング的に取得するか、OnSwipe, OnSwipeRawのコールバックで取得できる。
SwipeInput は画面全体、または一部(画面の上半分、下半分など)での操作を取得するのに向いている。空の GemeObject にアタッチして使う。
SwipeEventTrigger は UI 上での操作を取得するのに向いている。Button や Image など、Raycast Target をオンにして、同じ GameObject にアタッチする。Canvas に Graphic Raycaster がないとイベントが取得できないので注意しよう。インスペクタの設定は Valid Area の有無だけで、基本的には同じだ。
その他、コードなどの解説は以前の記事を参照して欲しい。

(インスペクタ)
Use InputSystem If Both Handling | ActiveInputHandling(Edit>Player Settings>Other Settings>Active Input Handling)が Both のとき、InputSystem を使う(※Both 以外のときは表示されません) オン:InputSystem / オフ: (旧)InputManager |
---|---|
Width Reference | 画面幅(Screen.width)を Valid Width の比率の基準にする [画面幅を1とした比率] (オフ: 高さ(Screen.height)を基準にする:画面の高さを1とした比率) |
Valid Width | スワイプとして認識する移動量の画面比 [画面幅に対する比率] (0.0~1.0:1.0で端から端まで。この値より長い移動量でスワイプとして認識する) |
Timeout | スワイプとして認識する時間 [秒] (これより短い時間でスワイプとして認識する。長いときは無視する) |
Valid Area | 認識する画面上の領域(0.0~1.0)[(0,0):画面左下, (1,1):画面右上] ※図解参照 |
▼Callbacks | |
OnSwipe | スワイプ方向コールバック Vector.left / .right / .up / .down のいずれか |
OnSwipeRaw | スワイプ方向の補正なし値コールバック タッチ開始から終了の方向ベクトル [px] |
(プロパティ)
Direction | スワイプ方向コールバック Vector.left / .right / .up / .down のいずれか |
---|---|
DirectionRaw | スワイプ方向の補正なし値コールバック タッチ開始から終了の方向ベクトル [px] |
※Debug Tools は主に Valid Area を可視化します。
※Game ビューの解像度に依存します。上手く反映されない場合は、Game ビューをいじってみて下さい。
(Valid Area 図解)
Valid Area は、画面左下を (0, 0) とし、画面の最大幅と高さを (1, 1) としたときの全体比で指定する。つまり、0.5 だと画面の長さの半分で、0.25 だと 1/4 である。つまり、解像度が変わっても位置は変わらないことになる(ただし、縦置き・横置きで回転する場合は注意)。基本的に他の ~Input 系の Valid Area も同じようになっている。画面全体での位置となるので(画面の上半分で操作、下半分は使わないなどに向いている)、UI 上に限定したいなら、~EventTrigger 系を使った方が良いだろう。
(例)
X: 0 | Y: 0.25 |
W: 1 | H: 0.6 |

(関連記事)
【Unity】InputSystem 対応 ピンチ操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 長押し操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 ダブル/トリプル(n回)クリック操作ライブラリ (FantomPlugin 追加機能)
【Unity】【C#】ピンチ操作を取得してコールバックする
【Unity】【C#】スワイプ(フリック)を判定、方向を取得してコールバックする
【Unity】【C#】長押し(ロングタップ)を取得してコールバックする
【Unity】【C#】SmoothFollow3(SmoothFollow に回転・遠近・高さ操作とピンチ・スワイプとの連携機能を付けた拡張版)
【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】InputSystem の Mouse クラスと(旧)Input.GetMouseButton の対応
【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応
【Unity】【C#】InputSystem.TouchPhase の IsActive(), IsEndedOrCanceled() [拡張メソッド] の具体値
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得(変換)する
【Unity】【C#】InputSystem で Android のバックキーの isPressed がなぜか一定時間で false になる?
【Unity】【C#】EventSystem を InputSystem 用に置き換えると、スクロールビュー等の移動が速過ぎる
- 関連記事
category: Unity
thread: ゲーム開発
janre: コンピュータ
tag: Unityプラグイン Unityライブラリ InputSystem FantomPlugin【Unity】InputSystem 対応 ピンチ操作ライブラリ (FantomPlugin 追加機能) 
2020/10/18 Sun [edit]
InputSystem も Verified (正式版) となり、色々と調査して概要もわかってきたので、今まで作った操作系のライブラリも更新してみた。
ただ、調査記事にも書いてあるが、現在の InputSystem は微妙に不安定な箇所もあり、Unity 公式にいくつかバグレポとして出しておいたが、「確認できず」という返信も貰っている。ただ私の環境では確実に起こる不具合もあるので、もしかしたら、InputSystem はハードウェア依存もあるのかも知れない(私は「Windows 日本語106キーボード」だが、Unityの中の人は「Mac 英語104キーボード」を使っているとしたら、不具合が見つけづらいという可能性もある[※掲載時点:InputSystem 1.0.0])。
なので、一気に InputSystem に移行するのはやめた方が良いだろう。幸いにも現在は(掲載時点:Unity2019.4.12f1)(旧)InputManager との混在も可能なので、動作確認が取れたものだけ使う方が良いだろう(できる限り色々な機器で試した方が良いと思われる ← 一部の人だけ使えないという問題が起こる可能性がある)。
そのため、完全互換とまではいかないかも知れないが、新旧システムどちらも使えるように入力関連の機能を中心に更新してみた。InputSystem のバージョンが上がったら、修正するかも知れないが、とりあえず 旧 InputManager の仕様に似せた実装なので、使い勝手はほとんど変わらないだろう。
ちなみに、スクリプトは大きく分けて、「~Input」と「~EventTrigger」となっているが、~Input は画面の全体や一部での検出、~EventTrigger はアタッチした UI 上での検出と考えて良い。また、~Input はイベント検出した瞬間以外に、ポーリング的な使い方もできるが、~EventTrigger はイベント検出した瞬間のみという違いもある。
ここでは、簡単な使い方や注意点などをまとめておいた。過去記事と合わせて参考にして欲しい。
●PinchInput / PinchEventTrigger
・Valid Area 図解
※他の操作は別ページにあります。
■スワイプ(フリック) 操作
■長押し操作
■ダブル/トリプル(n回)クリック操作
(※) Unity 2019.4.12f1 / InputSystem 1.0.0 / Windows10(x64) / Android 8.0 で確認
■ピンチ操作
●PinchInput / PinchEventTrigger
主にモバイル操作用となるが、タッチされた2本の指の間隔を画面サイズで正規化された値orピクセル(Width)、ピンチ幅(距離)の直前との差分(Delta)、ピンチ開始時の幅(距離)を1とし、現在の幅の比(Ratio)を取得できる。これらはそれぞれのプロパティ(Widt, Deltah, Ratio)をポーリング的に取得するか、OnPinchStart, OnPinch のコールバックでも取得可能だ。
その他、コードなどの解説は以前の記事を参照して欲しい。

(インスペクタ)
Use InputSystem If Both Handling | ActiveInputHandling(Edit>Player Settings>Other Settings>Active Input Handling)が Both のとき、InputSystem を使う(※Both 以外のときは表示されません) オン:InputSystem / オフ: (旧)InputManager |
---|---|
Is Normalized | 画面幅(or 高さ)で正規化した値でコールバックする(オフ: ピクセル単位で返す) |
Width Reference | Is Normalized がオンのとき、画面幅(Screen.width)を基準にする [単位が px / Screen.width になる:画面幅を1とした比率=画面解像度に依存しない値] (オフ: 高さ(Screen.height)を基準にする:画面の高さを1とした比率) |
Valid Area | 認識する画面上の領域(0.0~1.0)[(0,0):画面左下, (1,1):画面右上] ※図解参照 |
▼Callbacks | |
OnPinchStart | ピンチ開始コールバック Width(ピンチ幅(距離)), center(2指間の中心座標) ※Is Normalized がオンのときは画面幅で正規化した値で、オフのときは px 単位になる |
OnPinch | ピンチ中コールバック(伸縮率とその差分) Width(ピンチ幅(距離)), Delta(直前のピンチ幅(距離)との差分), Ratio(ピンチ開始時の幅を1とし、現在の幅の比率) ※Is Normalized がオンのときは画面幅で正規化した値で、オフのときは px 単位になる |
(プロパティ)
IsPinching | ピンチ操作中フラグ(指2本のみ。3本~は無効) |
---|---|
Width | ピンチ幅(指2本間の距離) ※Is Normalized がオンのときは画面幅で正規化した値で、オフのときは px 単位になる |
Delta | 直前のピンチ幅(距離)との差分 ※Is Normalized がオンのときは画面幅で正規化した値で、オフのときは px 単位になる |
Ratio | ピンチ開始時の幅(距離)を1とし、現在の幅の比率 (指を開く→ 1.0以上(1,2,3,...倍[小数含む]/指を閉じる→ 1.0より下(1/2, 1/3, 1/4,...倍[負にはならない])) ※1以上が開く動作で、1以下が閉じる動作と判断できる |
※Debug Tools は主に Valid Area を可視化します。
※Game ビューの解像度に依存します。上手く反映されない場合は、Game ビューをいじってみて下さい。
(Valid Area 図解)
Valid Area は、画面左下を (0, 0) とし、画面の最大幅と高さを (1, 1) としたときの全体比で指定する。つまり、0.5 だと画面の長さの半分で、0.25 だと 1/4 である。つまり、解像度が変わっても位置は変わらないことになる(ただし、縦置き・横置きで回転する場合は注意)。基本的に他の ~Input 系の Valid Area も同じようになっている。画面全体での位置となるので(画面の上半分で操作、下半分は使わないなどに向いている)、UI 上に限定したいなら、~EventTrigger 系を使った方が良いだろう。
(例)
X: 0 | Y: 0.25 |
W: 1 | H: 0.6 |

(関連記事)
【Unity】InputSystem 対応 スワイプ(フリック) 操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 長押し操作ライブラリ (FantomPlugin 追加機能)
【Unity】InputSystem 対応 ダブル/トリプル(n回)クリック操作ライブラリ (FantomPlugin 追加機能)
【Unity】【C#】ピンチ操作を取得してコールバックする
【Unity】【C#】スワイプ(フリック)を判定、方向を取得してコールバックする
【Unity】【C#】長押し(ロングタップ)を取得してコールバックする
【Unity】【C#】SmoothFollow3(SmoothFollow に回転・遠近・高さ操作とピンチ・スワイプとの連携機能を付けた拡張版)
【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】InputSystem の Mouse クラスと(旧)Input.GetMouseButton の対応
【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応
【Unity】【C#】InputSystem.TouchPhase の IsActive(), IsEndedOrCanceled() [拡張メソッド] の具体値
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得(変換)する
【Unity】【C#】InputSystem で Android のバックキーの isPressed がなぜか一定時間で false になる?
【Unity】【C#】EventSystem を InputSystem 用に置き換えると、スクロールビュー等の移動が速過ぎる
- 関連記事
category: Unity
thread: ゲーム開発
janre: コンピュータ
tag: Unityプラグイン Unityライブラリ InputSystem FantomPlugin