[Unity] TouchScriptの覚え書き
TouchScriptって
Unityで個人的な物を作るとき、入力周りにはTouchScriptというアセットをよく使います。TouchScriptというのは、マルチプラットフォームに対応したタッチ入力やジェスチャ入力を簡単に扱えるようになるアセットです。現在絶讃Asset Storeにて配布中です。無料です。
なんでもPokemonをGOするアプリにも使われていたとかなんとか。
簡単に使えるようになる、はずなのですが、よくセットアップ時に何か1つ抜けてたりするので備忘録ついでにブログに残してみます。
セットアップ
この記事はUnity5.4f3+Touchscript 8.2基準で書いています。アセットをインポートしたら空のGameObjectを作り適当に「TouchManager」とか名前をつけます。
それにTouchScript/TouchManagerとTouchScript/InputSouces/Standard Inputのコンポーネントを追加します。Standard Inputは無くても自動で追加されるんですが、あった方が後々便利かなと思います。
ついでにプロジェクトから「TouchScript/Prefabs/Touch Visualizer」をhierarchyに放り込むとタッチの状態が視覚化できて便利です。
ジェスチャの計画
ゲームの種類や用途に応じてコンポーネントを追加していきます。2DゲームならカメラにTouchScript/Layers/CameraLayer2Dを割りあてます。
3DならCameraLayerをカメラに割り当てます。
fullscreen Layerは全画面で反応するようにするもので、UI LayerはUI要素に反応するもの。こちらは後ほど説明します。
オブジェクトにジェスチャを割り当て
入力に反応して欲しいオブジェクトに対してジェスチャのコンポーネントを追加していきます。TouchScriptにあるジェスチャコンポーネントで主要なものは以下の通り。
- タップに反応する「TapGesture」
- フリックに反応する「FlickGesture」
- 長押しに反応する「LongPressGesture」
- ドラッグ、ピンチ(拡大縮小)や回転に反応する「TransformGesture」
- TransformGestureと基本同じだけどスクリーン座標を返す「ScreenTransformGesture」
Transform系のGestureはpositionのみとかscaleのみとか振る舞いを絞り込むことが出来ます。
他にも指を離したときに特化したRelease Gestureとかありますが割愛です。
ちなみにScreen Transform Gestureは使ったことがないのでよく分かりません。FullscreenLayerと組み合わせてカメラ移動とかに使うのでしょうか?
これらから欲しい挙動のコンポーネントを反応させたいGameObjectに割り当ててます。
Colliderを追加するのも忘れずに。
特定のオブジェクトのタップを得る場合
反応させたいGameObjectにTap Gestureを割り当てます。そして次のようなコードを書きます。
usingは必要に応じてTouchScript.Gesturesなどを追加して下さい。
void OnEnable()
{
// TapGestureのdelegateに登録
GetComponent<TapGesture>().Tapped += tappedHandle;
}
void OnDisable()
{
UnsubscribeEvent();
}
void OnDestroy()
{
UnsubscribeEvent();
}
void UnsubscribeEvent()
{
// 登録を解除
GetComponent<TapGesture>().Tapped -= tappedHandle;
}
void tappedHandle(object sender, System.EventArgs e)
{
//処理したい内容
}
特定のオブジェクトのフリックを得る場合
反応させたいGameObjectにFlick Gestureを割り当てます。
そして次のようなコードを書きます。
usingは必要に応じてTouchScript.Gesturesなどを追加して下さい。
void OnEnable()
{
// FlickGestureのdelegateに登録
GetComponent<FlickGesture>().Tapped += FlickedHandle;
}
void OnDisable()
{
UnsubscribeEvent();
}
void OnDestroy()
{
UnsubscribeEvent();
}
void UnsubscribeEvent()
{
// 登録を解除
GetComponent<FlickGesture>().Tapped -= FlickedHandle;
}
void FlickedHandle(object sender, System.EventArgs e)
{
var gesture = sender as FlickGesture;
// ジェスチャが適切かチェック
if (gesture.State != FlickGesture.GestureState.Recognized)
return;
// 処理したい内容
// gesture.ScreenFlickVectorにフリック方向が入るので
// if (gesture.ScreenFlickVector.y < 0)としたら下方向へのフリックを検知できる
}
ScreenFlickVectorを使ってフリック方向を得る事が出来ます。
その他に、反応する方向、距離や時間なども設定出来ます。インスペクタからも設定出来ますが、コードで設定する場合は こちらを確認すると良いです。
ドラッグ、拡大や回転を得る場合
反応させたいGameObjectにTransform Gestureを割り当てます。TransformGestureについてはTransformerというコンポーネントを加えると、コードを書かずに移動や拡大を実現出来ます。もちろんイベントハンドラを使って自分でtransformを設定すればtransformerは使わないでもいいですが、回転や拡大縮小を使う場合は、ぐっと楽になります。
今回はTransformerを使う方法で書きます。
コンポーネント追加後はTransform GestureでPositionやScaleなど有効にしたいtransformを指定したら、これでとりあえずドラッグに合わせてオブジェクトが動きます。
あとはイベントハンドラを使って必要な処理を追加していきます。
usingは必要に応じてTouchScript.Gesturesなどを追加して下さい。
void OnEnable()
{
// Transform Gestureのdelegateに登録
GetComponent<TransformGesture>().TransformStarted+= TransformStartedHandle; // 変形開始
GetComponent<TransformGesture>().StateChanged+= StateChangedHandle; // 状態変化
GetComponent<TransformGesture>().TransformCompleted+= TransformCompletedHandle; // 変形終了
GetComponent<TransformGesture>().Cancelled+= CancelledHandle; // キャンセル
}
void OnDisable()
{
UnsubscribeEvent();
}
void OnDestroy()
{
UnsubscribeEvent();
}
void UnsubscribeEvent()
{
// 登録を解除
GetComponent<TransformGesture>().TransformStarted -= TransformStartedHandle;
GetComponent<TransformGesture>().StateChanged -= StateChangedHandle;
GetComponent<TransformGesture>().TransformCompleted -= TransformCompletedHandle;
GetComponent<TransformGesture>().Cancelled -= CancelledHandle;
}
void TransformStartedHandle(object sender, System.EventArgs e)
{
// 変形開始のタッチ時の処理
}
void StateChangedHandle(object sender, System.EventArgs e)
{
// 変形中のタッチ時の処理
}
void TransformCompletedHandle(object sender, System.EventArgs e)
{
// 変形終了のタッチ時の処理
}
void CancelledHandle(object sender, System.EventArgs e)
{
// 変形終了のタッチ時の処理
}
transfromerコンポーネントを使うとこれだけで2本指での拡大、移動、回転が可能になります。 PC上でマウスを使う場合は二本指ジェスチャは出来ないので、そのときはaltキーを押してクリックすると、そのクリックは「押しっぱなし」と見なされマルチタッチジェスチャを入力することが出来ます。
transformGestureのインスペクタ上にある「transform Type」の項目は以下のようにするとスクリプトで設定することが出来ます。
// using TouchScript.Gestures.Base;がある前提で
// 値には以下の値を入れる
// 回転ならTransformGestureBase.TransformType.Rotation
// 移動ならTransformGestureBase.TransformType.Translation
// 拡大ならTransformGestureBase.TransformType.Scaling
// 例
GetComponent<TransformGesture>().Type = TransformGestureBase.TransformType.Rotation | TransformGestureBase.TransformType.Scaling;
画面全体のタッチを取得する場合
画面全体つまりオブジェクトが無いところで起きたタッチイベントを取得することが出来ます。カメラの移動などに使ったり、画面を切り替えるとき、とにかく画面をタップしてほしい時などに使うのだと思います。
使い方はまずHierarchyに空のgameObjectを作り、touchManagerとfullScreenLayerコンポーネントをセットします。すると、TouchManagerコンポーネントに「FullScreen」レイヤーが認識された旨追加されます。
後は作成したgameObjectにタップなどのジェスチャを割り当てていきます。内容は上のタップやフリックなどと同じです。
uGUIにジェスチャを割り当てる
やり方はFullScreenLayerとほぼ同じです。FullScreenLayerの代わりにUILayerをGameObjectに割り当てます。
割り当てるのはべつにCanvasなどで無くともTouchManagerをセットしたGameObjectでも良いみたいです。
標準のuGUIとTouchScriptを混在させる
標準のuGUIとTouchscriptを混在して使う場合、例えばキャラクターの移動にはTouchScriptを使ってアイテムの選択にはuGUIを使う場合は、EventSystemにあるStandaloneInputModuleをTouchScriptInputModuleに置き換えます。
これをしないとuGUI側が無効になります。
タッチされた位置を知る
タッチの情報は、イベントハンドラ内のobjectから得ることができます。例の場合、senderからタッチされた情報を得るには以下のようにします。
// transformGestureの場合
var gesture = sender as TransformGesture;
TouchHit hit;
gesture.GetTargetHitResult(out hit);
これでhitにはタッチされた場所などの情報が渡されます。あとはhit.Pointで位置が取得で見ます。
hit.NomalにはタッチされたColliderとの法線が得られます。
例えば床に当たったときは(0f,1f,0f)が、壁等の場合は(1f,0f,0f)などが得られますので、必要に応じて組み合わせます。
シーン上のタップの状況を知る
TouchScriptにはタッチジェスチャごとにSendMassageを送ることが出来ますが、シーン全体のタッチを管理するTouchManagerのイベントハンドラからタッチ情報を得ることも出来ます。
// using TouchScript; として
// touchはTouchPointが入る
// touch.Idはタッチした順の値
TouchManager.Instance.TouchesBegan +=
(sender, args) => {
foreach (var touch in args.Touches)
Debug.Log("Began: " + touch.Id);
};
TouchManager.Instance.TouchesEnded +=
(sender, args) => {
foreach (var touch in args.Touches)
Debug.Log("Ended: " + touch.Id);
};
例ではtouchから TouchPointの情報を得ることが出来ます。具体的にはタップした順や位置、transform、入力方法などです。
ただこのイベントだと「どのオブジェクトがタッチされたか」しか分からないのです。(もしジェスチャまで分かる方法があるなら教えて下さい)
なので、ジェスチャごとの挙動は各ジェスチャのイベントハンドラに書いた方が良いでしょう。
複数のジェスチャを認識する
TouchScriptは一つのGameObjectに複数のジェスチャコンポーネントが割り当てられていると、排他的に登録順に処理していきます。そのため、一つのジェスチャが認識中は他のジェスチャを認識しません。
例えば、とあるボタンは長押しをすると技の詳細表示、そのままフリックすると技を発動したい、とします。普通に割り当てたままだと、LongPressGestureがタッチ情報を掴んでしまいflickGestureへ流れなくなります。
そんな時はfriendlyGesturesというのを割り当てます。
やり方は、インスペクタから同時に認識させたいジェスチャのコンポーネントへジェスチャを含んだGameObjectをD&Dするか、スクリプトで割り当てます。
GetComponent<LongPressGesture>().AddFriendlyGesture(GetComponent<FlickGesture>());
これで長押しとフリックが同時に認識するようになります。
まとめ
TouchScriptはやりたいことをイベントハンドラに登録すれば出来てしまうと言うお手軽さと、マウスでもマルチタッチジェスチャがテストできるのが素敵なフレームワークです。なのですけど、多機能なだけに「これ、どこにセットするんだっけ」と毎回ググる羽目になるので自分宛の備忘録のつもりに書いてみました。
この記事からstackEditで書いて投稿しています。今更感満載ですが、markdownでかけるのは楽です。
Blogger標準のエディタも悪くは無いんですけど、WYSIWYGなエディタの宿命なのかよく分からない見出しタグが入るのが残念でした。
しばらくこれを試してみようと思います。
G633の怪その2 使用感編
Logicool G633の使用感編です。
子供が風邪を貰っては伝染り、治った頃また子供が貰って来ては伝染り、というコンボを繰り返し、仕事も立て込んで、落ち着いてゲームもしていなかったので使用感が書くに書けず伸び伸びのなってい続編です。
見た目と装着感
見た目はゴツいですが、つけてみると見た目の迫力よりは重くはありません。ただし見た目に反して、という但し書き付きです。リスニング用ほどの軽さはないです。
頭頂部あたりにメッシュスポンジがあり、頭頂部が痛いということはありません。
耳あて部分もメッシュなので微かに通気性があり、リスニング用に比べてムレにくいです。ただ反面、少し滑りやすいので急に振り向いたりすると滑ってズレる事がありました。
これは使い込むと少しはメッシュが馴染むかもしれないですが、新品に近いとそんな感じです。
ピカピカ光るLEDは、自分からは見えないのでまあ気にしない方向です。
これは大会とかでチームごとに色を合わせたり、ゲームが対応していればプレイヤー死亡時に赤く切り替わる、とかそういう観客向けの演出装置なのだと思います。
ちなみに使い続けていると左側が仄かに熱を持ちますが、熱いということはありません。
素の音質はざっくり最初に印象を言えば、悪くはない、という玉虫色な表現になります。
というのも、このヘッドホンはリスニング用ではなくゲーム用というのが悩ましいところです。
比べがちなリスニング用とは最適化された用途が異なるので、同じ尺度で測っていいか難しいと思うのです。
強いて言えばモニター用途が近いのなかなぁと。
聞いた印象では、同社が昔出していた2chスピーカーのZ-10に似てると思いました。
個人的に手持ちで価格帯が似ているだろうSENNHEISERのHD558を引き合い*1に出すと、HDD558より音が近く、ドンシャリというわけではないけど低域の応答性は良いみたいでわりとドコンと鳴る、という印象。
ただ、手元の音源を色々聞いていて、これで音楽を長時間聞いてもあまり楽しくないだろうな、というのも同時に感じました。
飛び抜けて解像度が良いわけでもなく、伸び悩む感じもあります。
まあ、これは1.5万~3万オーバーのヘッドホンと較べてなので、数千円のヘッドホンからのステップアップからならば下手なヘッドホンより十分いい音だと思います。
また内蔵DACを使わない外部入力だとまた違った印象かもです。
心地よく音楽を聞かせたいわけじゃなく、ゲーム中の音にフォーカスした製品ですので、次の項目へさっさと行きたいと思います。
*1 日本での値段でいえばHD598が近いけど、HD558の上はHD650しか持ってないのとG633はマイクやギミックやDACなども勘定しないといけないと思うので、ヘッドホンとしての価格比較はHD558でも分が悪いかなとは思う。
揉めに揉めたサラウンド感について。
ネット上で手に入る効果がわかりやすいテストトーン的な音源は、Logicool自体が公開している(元はFraunhofer IISが作った何かのテスト用っぽい)ものと、Microsoftが配布している多チャンネルテスト用のファイルがあります。
Logitechのもの。
www.logitech.com/pub/techsupport/gaming/7.1auditionOutLeaderv2.zip.
Microsoftのもの。(自己展開ファイル)
http://download.microsoft.com/download/6/b/1/6b17045c-6ce8-4dc4-a3b5-2717b8711fc8/8Channel.exe
これらを聞く感じではサラウンド感はちゃんとあります。
耳あて部分もメッシュなので微かに通気性があり、リスニング用に比べてムレにくいです。ただ反面、少し滑りやすいので急に振り向いたりすると滑ってズレる事がありました。
これは使い込むと少しはメッシュが馴染むかもしれないですが、新品に近いとそんな感じです。
ピカピカ光るLEDは、自分からは見えないのでまあ気にしない方向です。
これは大会とかでチームごとに色を合わせたり、ゲームが対応していればプレイヤー死亡時に赤く切り替わる、とかそういう観客向けの演出装置なのだと思います。
ちなみに使い続けていると左側が仄かに熱を持ちますが、熱いということはありません。
素の音質
素の音質はざっくり最初に印象を言えば、悪くはない、という玉虫色な表現になります。
というのも、このヘッドホンはリスニング用ではなくゲーム用というのが悩ましいところです。
比べがちなリスニング用とは最適化された用途が異なるので、同じ尺度で測っていいか難しいと思うのです。
強いて言えばモニター用途が近いのなかなぁと。
聞いた印象では、同社が昔出していた2chスピーカーのZ-10に似てると思いました。
個人的に手持ちで価格帯が似ているだろうSENNHEISERのHD558を引き合い*1に出すと、HDD558より音が近く、ドンシャリというわけではないけど低域の応答性は良いみたいでわりとドコンと鳴る、という印象。
ただ、手元の音源を色々聞いていて、これで音楽を長時間聞いてもあまり楽しくないだろうな、というのも同時に感じました。
飛び抜けて解像度が良いわけでもなく、伸び悩む感じもあります。
まあ、これは1.5万~3万オーバーのヘッドホンと較べてなので、数千円のヘッドホンからのステップアップからならば下手なヘッドホンより十分いい音だと思います。
また内蔵DACを使わない外部入力だとまた違った印象かもです。
心地よく音楽を聞かせたいわけじゃなく、ゲーム中の音にフォーカスした製品ですので、次の項目へさっさと行きたいと思います。
*1 日本での値段でいえばHD598が近いけど、HD558の上はHD650しか持ってないのとG633はマイクやギミックやDACなども勘定しないといけないと思うので、ヘッドホンとしての価格比較はHD558でも分が悪いかなとは思う。
サラウンド感
ネット上で手に入る効果がわかりやすいテストトーン的な音源は、Logicool自体が公開している(元はFraunhofer IISが作った何かのテスト用っぽい)ものと、Microsoftが配布している多チャンネルテスト用のファイルがあります。
Logitechのもの。
www.logitech.com/pub/techsupport/gaming/7.1auditionOutLeaderv2.zip.
Microsoftのもの。(自己展開ファイル)
http://download.microsoft.com/download/6/b/1/6b17045c-6ce8-4dc4-a3b5-2717b8711fc8/8Channel.exe
これらを聞く感じではサラウンド感はちゃんとあります。
ただセンターはヘッドホン特有の頭の中で鳴るような感じです。
セリフは常にセンターから鳴る映画を見るときは少し気になるかもしれません。ただ映画を違ってゲームは発声している位置や自分の視線の方向によってセリフの発声位置が変わることが多いので、ゲーム仕様ではそこまで気にならないかなぁ。
映画といえば、G633のAPOの設定画面…つまり、コンパネの再生デバイスのG633のプロパティの中で、Dolby Audioにすると「映画」と「音楽」というモード切替が出来ます。
映画だと派手目に音楽だとおとなしめになるような印象です。
LGSにはない項目なので、興味があったら触ってみるといいかもです。
さてゲームでの使用感へ。
ゲームで幾つか試して使ってみました。
映画といえば、G633のAPOの設定画面…つまり、コンパネの再生デバイスのG633のプロパティの中で、Dolby Audioにすると「映画」と「音楽」というモード切替が出来ます。
映画だと派手目に音楽だとおとなしめになるような印象です。
LGSにはない項目なので、興味があったら触ってみるといいかもです。
さてゲームでの使用感へ。
ゲーム中での使用感
ゲームで幾つか試して使ってみました。
ジャンルはもっぱらFPSです。BF4とかInsurgencyとか。
LFEの反応がいいのでBF系はドコドコなります。一方、ゲーム中は静かでカサコソとそれこそ虫の足音を探して歩くようなInsurgencyだと、後ろに回り込んで来る敵の足音を聞くことが出来ます。
マップ構造を覚えているならば、あそこの通路を通って回ってきてるのかな、とわかります。
音質的にはヘッドホンの物によては迫力の低音を出そうとして妙にモゴモゴしてしまい、カソコソというか細い系の足音が聞き取りにくいのもありますが、これはそういうこともなく、いいバランスだと思います。
ただ少し残響感があるので、そのあたり気になるかもしれません。
自分は雰囲気を楽しむヌルゲーマーですし、insurgencyに至っては、長年の気心が知れたメンバーでCOOPをしている遊び方なので、ガチに勝ちに行く人はまた違う評価かなと思います。
マップ構造を覚えているならば、あそこの通路を通って回ってきてるのかな、とわかります。
音質的にはヘッドホンの物によては迫力の低音を出そうとして妙にモゴモゴしてしまい、カソコソというか細い系の足音が聞き取りにくいのもありますが、これはそういうこともなく、いいバランスだと思います。
ただ少し残響感があるので、そのあたり気になるかもしれません。
自分は雰囲気を楽しむヌルゲーマーですし、insurgencyに至っては、長年の気心が知れたメンバーでCOOPをしている遊び方なので、ガチに勝ちに行く人はまた違う評価かなと思います。
続・分かりにくい仕様とG35
たまにG633の話で「youtubeの5.1ch動画を見てもサラウンドに聞こえない。G35なら聞こえるのに」というのを見かけます。
これ、youtubeは5.1chのファイルを受け付けるんですがyoutube側でダウンミックスしてしまうので、再生時は2chになってしまいます。
5.1chのファイルを受け付けるのが罪深い感じです。
ではでは、なぜG35ではサラウンドが聞こえるかというと、G35はDolby Pro Logic IIというのに対応しています。
これはざっくり言うと、ステレオ音声をサラウンドに拡張したり、拡張されることを見越してステレオにダウンミックス(エンコード)した音声を再び5.1chに分解する、というものです。
なので、youtubeの2chにダウンミックスされたサラウンド音源でもサラウンド感が出る、というわけだろうと思います。製作者が意図したサラウンド感とは違うものでしょうけれども。
たしかRazerのサラウンドドライバにもPro版なら似たような物があったと思います。
ところがG633はステレオ拡張的な機能はありません。
G633の目玉機能のDTS HeadphoneXというのは「どこかの部屋で鳴っているサラウンドスピーカーセットの聞こえ方をなんやかんやで再現する」というものなので、2ch音声を入れても少し離れたところで鳴っている音になるだけです。
5.1chや7.1chを再生できるブラウザといったら今のところWindows10のEdgeくらいかな。
ただ説明を見るとAVアンプとかにビットストリームを流せます、という感じぽい?
ちなみにEdgeのサラウンドデモサイトはこちら。映画の1シーンがサラウンドで見れます。
Edgeで開かないと音が出ませんし、G633にドルビーのデコーダ機能はないのでサラウンドで鳴ってないっぽい(Dobly Audioでフロントをオフにすると消える)
もう一つはいわゆるバイノーラル系の音源に対して「サラウンド感が出ない」というもの。
バイノーラル系はざっくり言うと、録音時に人体もしくは人体に似せた頭部の耳の位置で録音し、再生時も同じ位置(つまりイヤホンかヘッドホン)で再生することで、録音時の聞こえ方を再現しようというものなので、これも上記の「離れたスピーカーを再現する」というの趣旨が合わず、とても相性が悪いものになります。
ということですが、これらの特性を説明書などの解説もなくコンシューマー製品の仕様とするのはかなりユーザーに多くを求め過ぎる気がします。
グローバルなモデルなので、個別のマニュアル制作を惜しんだのかもですが、謳っていた製品のイメージと実物の仕様に差を感じます。
ゲームと関係ない不具合
ロジクールのゲーミングマウスを使っているのですが、マウスの拡張ボタンでツールの切替をするためにLGSにphotoshopのプロファイル入れています。
LGSにプロファイルが入っているとG633も反応するわけですが、photoshopを起動するとき、何故かLEDが激しく明滅します。
どうもphotoshop起動中(おそらくプラグインを読み込んでいる時)は細かくアプリケーションの切替が起こっているぽい。
一度つけた状態でPhotoshopを起動した時、耳元が激しく明滅していたのを妻に見られて大爆笑されました。
無理矢理締める
文中に「ゲーム用途であれば」とあるように、ゲーム用としてはわかって使うならいい機械だと思います。
怖いものはより怖く、派手なものはより派手に。ゲームが楽しくなります。
これでスターウォーズ・バトルフロントをやると楽しいかもなぁと思います。買ってませんけども。
目下はR6:siegeのオープンβを楽しみにしております。
ただ、これがゲーミングサラウンドヘッドホン入門機かといえばちょっと高い。
じゃプロ用?かというと、それもちょっと違う気がします。
個人的には楽しい機械でしたが、とらえどころが難しいですね。
登録:
投稿 (Atom)
プロフィール
ブログ内の商品画像について
このサイトは製品画像について、amazonアフィリエイトプログラムに基づいたリンクおよび画像を使用しています。