Unity

【GodController】スマホのマルチタッチに対応したバーチャルコントローラーを作ろう!(Unityエディタでも確認可能)

めっちゃ久しぶりのブログですw

去年は本業が忙しかったり、別のお仕事を頂いたり、プライベートで事件があったりと、気づいたら年が明けてました・・・

今回は、以前GodTouchというタッチアセットを紹介しましたが、それを発展させた

マルチタッチアセット「GodController」

の紹介です☆

【UnityAsset】GodTouch - Unityエディタ上でタッチの動作を確認できる https://github.com/okamura0510/GodTouch UnityでiOS/Android/Edito...

GodControllerとは

スマホのマルチタッチに対応したバーチャルコントローラーです。

  • Down:押した
  • Up:離した
  • Tap:タップ
  • Swipe:スワイプ
  • SwipeEnd:スワイプ終了
  • Flick:フリック
  • Hold:ホールド(長押し)
  • HoldEnd:ホールド終了
  • Pinch:ピンチ
  • DoubleSwipe:ダブルスワイプ(2本指スワイプ)
  • DoubleSwipeEnd:ダブルスワイプ終了

これらのイベントを登録できて、それぞれのタッチ感度も調整可能です。
全てエディタ上で確認できます(ダブルタッチはエディタではマウス右ボタンを使用)。

動作環境

Unity2021.2.5+
iPhone SE (第2世代) で動作確認済み
Xperia Z3 Compact SO-02G で動作確認済み

ライセンス


本アセットではユニティちゃんライセンス条項の元に提供されています。

使用方法

アセットをインポート

直接ファイルをインポートしてもいいし、GodController.unitypackageを使ってもOK。
ルートディレクトリは以下のようになってます。

  • GodController:アセット本体
  • GodControllerDemo:デモ
  • UCL2.0:ユニティちゃんライセンス関連ファイル(デモ用)
  • UnityChan:ユニティちゃんアセット(デモ用)

GodControllerディレクトリ以外はデモ用なので削除しても大丈夫です(容量削減可能)。

GodControllerを追加

設定値内容
TapTimeタップ時間。この時間内ならタップ可能。
TapDistanceタップ距離。この距離内ならタップ可能。
SwipeDistanceXスワイプ距離X。この距離を超えたらスワイプ開始。
SwipeDistanceYスワイプ距離Y。この距離を超えたらスワイプ開始。
StopSwipingスワイプ中停止可能フラグ。通常はスワイプに移行したら動き続けるが、このフラグがtrueの場合はスワイプ中の停止が可能になる(自作ゲームの都合)。
FlickTimeフリック時間。この時間内ならフリック可能。
FlickDistanceXフリック距離X。この距離を超えたらフリック可能。
FlickDistanceYフリック距離Y。この距離を超えたらフリック可能。
HoldTimeホールド時間。この時間より押し続けたらホールド開始。
PinchDistanceピンチ距離。2本指がこの距離より離れたらピンチ開始。
PinchMinピンチの最小値。1 = 100%
PinchMaxピンチの最大値。1 = 100%
DoubleSwipeDistanceXダブルスワイプ距離X。2本指が両方ともこの距離を超えたらダブルスワイプ開始。
DoubleSwipeDistanceYダブルスワイプ距離Y。2本指が両方ともこの距離を超えたらダブルスワイプ開始。

イベントを登録

Inspectorかスクリプトからイベントを登録。

[SerializeField] GodController controller;
        
void Start()
{
    controller.OnDown.AddListener(OnDown);
    controller.OnUp.AddListener(OnUp);
    controller.OnTap.AddListener(OnTap);
    controller.OnSwipe.AddListener(OnSwipe);
    controller.OnSwipeEnd.AddListener(OnSwipeEnd);
    controller.OnFlick.AddListener(OnFlick);
    controller.OnHold.AddListener(OnHold);
    controller.OnHoldEnd.AddListener(OnHoldEnd);
    controller.OnPinch.AddListener(OnPinch);
    controller.OnDoubleSwipe.AddListener(OnDoubleSwipe);
    controller.OnDoubleSwipeEnd.AddListener(OnDoubleSwipeEnd);
}

操作方法はデモ参考。

【注意点】なんで作ったのか?

元々2Dと3Dのプロジェクトを作ってて、それぞれで同じ様なタッチ操作が必要になったのでアセット化しました。なので、今後も自プロジェクトの都合で修正していくかもです。
大きくは変えない予定ですが、破壊的変更も行われるかもしれないんで、導入する際はご注意ください(コードを参考にするくらいがちょうどいいかと思います)。

あとデモでユニティちゃんを使用してるだけなので、GodControllerのプログラム自体は自由に改変しちゃってOKです!
ただし修正依頼は受け付けてないので、その場合はフォークしてね☆

デモ

スワイプ / スワイプ終了

スワイプするとユニティちゃんが歩きます。
スワイプ終了で止まります。
StopSwipingtrueの場合はスワイプ中の停止が可能になります(自作ゲームの都合)。

ホールド / ホールド終了

ホールド後にスワイプするとユニティちゃんが走ります(歩行からランに変化)。
スワイプ終了で止まります。
注意点として、ホールド終了はタッチ終了時に呼ばれます(スワイプ移行時には呼ばれない)。自作ゲームの都合で、ホールド → スワイプでのモーション変化を考慮したためです。必要な方はスワイプ移行で呼ばれるようにしてもいいかもしれません。

フリック

フリックするとユニティちゃんがジャンプします。

タップ

タップするとユニティちゃんが頭突き攻撃します。
攻撃モーションがなかったのでジャンプの途中モーションで代用しました笑

ピンチ

ピンチするとカメラをズームします。
エディタの場合、マウス右ボタンを押しながらマウスホイールすることで、ピンチを行います。
注意点として、ピンチやダブルスワイプなどダブルタッチの場合は、一度どちらかに移行した場合はずっとそのままです(操作を安定させるため)。

ダブルスワイプ / ダブルスワイプ終了

ダブルスワイプするとカメラを横方向か縦方向に平行移動します。
エディタの場合、マウス右ボタンを押しながらスワイプすることで、ダブルスワイプを行います。
自由移動にしてもよかったんですが、今回はあえてこうしました(操作を安定させるため)。

Animatorは諸刃の剣

【Unity】Animatorのアニメーション終了待ちをする方法

まさにこれなんですが、今回、タッチ部分よりAnimatorの制御の方に苦戦しました。。
Animatorの終了を検知するのが大変なんですよね。
今回はステートの切り替わりを検知する方法で対処しましたが、やっかいだったのがステートが切り替わるのが1フレーム後っていう…。

個人開発レベルだったら素直にAnimationを直接使った方が楽ですね。

ただ本業では大規模開発を行ってるのですが、こっちではAnimator大活躍☆
仕組みさえ作ってしまえば、あとはデザイナーさんのみで作業できるので、とてもリッチなアニメーションを量産できます。

Animatorは諸刃の剣だなぁ。

最後に

ユニティちゃんも可愛いいけど、ミトちゃんも可愛い(´,,•ω•,,`)

【エビでもわかる】オセロプログラミング
〜オセロを作りながらゲームのプログラムを学ぼう〜
「Unityで初めてゲームを作ってみたい!」

そんな人のためにこの本を作りました。
オセロを一から作りながら実践形式でプログラムを学べる本です。
すでに完成したプロジェクトを説明するのではなく、実際に作りながら説明していきます。
一緒に手を動かしながら、プログラムを覚えていきましょう🌟