simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Unity 便利アセット Joystick Pack マルチタップに改造

https://assetstore.unity.com/packages/tools/input-management/joystick-pack-107631?locale=ja-JP

そう、すばらしいアセットと多くの方が賞賛してる
ただし、二つ配置すると、とたんにドラッグ操作が行えなくなり
使い物にならない

今回マルチタップ化できたので、改造方法を記録しておきます

編集するファイルは Base の
Assets\Joystick Pack\Scripts\Base\Joystick.cs
ファイルのみ

まず IDragHandler インタフェース継承をやめさせます
OnDrag イベントハンドラの引数の OnDrag(PointerEventData eventData) は OnDrag(Vector2 touchPosition) に書き換え
eventData.position を touchPosition に差し替えておきます

既存の利用箇所 OnPointerDown での呼び出しをつぎのようにし
OnDrag(eventData.position);

まずはビルドを通します。

次に OnPointerDown にて
this.pointerId = eventData.pointerId;
こんな感じで pointerId (Touch の fingerId) を記録しておき

	void Update()
	{
		foreach (var touch in Input.touches)
		{
			if (touch.fingerId == this.pointerId)
			{
				OnDrag(touch.position);
				break;
			}
		}
	}

Update にて fingerId が一致する touch の position を OnDrag に流します
OnPointerUp で this.pointerId を -1 などに初期化することで
既存の OnDrag の機能を残しつつ、複数の fingerId を識別し、マルチタップに対応した Joystick が完成します

実機で確認して動作を確認できたため
これにて完成と思います

エディタ実行では touches は得られないですが
何かエミュレートする案を適用して置くのも良いかもしれませんね