スクロールビューの中にボタンをおくことはままあるけど、クリック時の動作をコントロールしようとすると少し面倒になる。
長押し時の動作を設定したくて苦労した話。
まず普通にスクロールビューの Content 下にボタンを置いてみる。
クリック自体は問題ない。
ボタンを押した状態でもスクロールが出来るがクリックは解除される。
この状態で長押しできるようにスクリプトを追加する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class Xxx : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IBeginDragHandler, IEndDragHandler { float time = 0; void Update(){ time += Time.deltaTime; } public void OnPointerDown (PointerEventData eventData) { Debug.Log("DOWN"); time = 0; sv = Input.mousePosition; } public void OnPointerUp (PointerEventData eventData) { Debug.Log("UP"); ev = Input.mousePosition; if(Vector2.Distance(sv,ev)<50){//50pixel以下の動き if(time<=0.2f)Debug.Log("CLICK"); if(time>=1.0f)Debug.Log("LONG CLICK"); } } public void OnBeginDrag (PointerEventData eventData) { //呼ばれない Debug.Log ("OnBeginDrag"); } public void OnEndDrag (PointerEventData eventData) { //呼ばれない Debug.Log ("OnEndDrag"); } } |
このスクリプトで長押しは検知できる。
ただし OnPointerUp は押下状態からの移動でも検知されるので、押しながら移動した場合は意図した動作にならない。
OnBeginDrag などで検知しようにもそもそも呼ばれない。
そこで EventTrigger の上書きをしてみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using UnityEngine; using UnityEngine.EventSystems; public class Xxx : EventTrigger { public override void OnBeginDrag( PointerEventData data ) { base.OnBeginDrag(data); Debug.Log( "OnBeginDrag called." ); } public override void OnDrag( PointerEventData data ){ base.OnDrag(data); Debug.Log( "OnDrag called." ); } public override void OnEndDrag( PointerEventData data ) { base.OnEndDrag(data); Debug.Log( "OnEndDrag called." ); } public override void OnInitializePotentialDrag( PointerEventData data ) { base.OnInitializePotentialDrag(data); Debug.Log( "OnInitializePotentialDrag called." ); } public override void OnPointerClick( PointerEventData data ) { base.OnPointerClick(data); Debug.Log( "OnPointerClick called." ); } public override void OnPointerDown( PointerEventData data ) { base.OnPointerDown(data); Debug.Log( "OnPointerDown called." ); } } |
元の動作を邪魔しないように基底メソッドの呼び出しもしてみた。
それぞれのメソッドは期待通り呼ばれるが、ボタンを押しながらドラッグしたときの動作が変わった。
オーバーライドせずに EventTrigger を継承した空のスクリプトを追加するだけでも同じ現象が起きる。
わけわからんと思ってたらこんな記事を見つけた。
この通りにボタンとスクロールビューにスクリプトを追加すると期待通りに動いた!
まだちゃんと理解できてないけどスクロールビューのほうも弄らないといけなかったみたいだ。
どうも既定のものをイジるのは面倒なことが多いので、こだわりがなければ妥協したほうが良いかもしれない。