close
我的環境配置:Windows 10、Unity 5.3.4f1。
不曉得大家在使用 UGUI 的 Scroll View 時,是否曾發生捲動會亂跳的問題?
其實 Scroll View 是使用 IBeginDragHandler、IDragHandler、IEndDragHandler 這三個 interface 來處理觸碰事件的。而問題就是出在這三個 interface 所回傳的 PointerEventData。
如果使用者是使用單點觸碰或者滑鼠的話,那 PointerEventData 的 position 就是 Input.touchs[0].position,所以這邊不會有問題。
但使用者若是使用多點觸碰的話,則 PointerEventData 的 position 就有可能為 Input.touchs[0].position、Input.touchs[1].position、......、Input.touchs[N].position,N 為任意數。
這就是導致 Scroll View 捲動出現亂跳的原因!
所以這邊我們需要繼承 ScrollRect 並且覆寫觸碰事件,強制將回傳的 position 進行修正,就可以排除該問題的發生!
PS:Input.mousePosition 與 Input.touches[ 0 ].position 這兩個值是一樣的!
大家可以建立一個腳本,直接複製貼上並且修改 Class 名稱,或者文章最下方也有腳本可以直接下載使用
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; /// <summary> /// 該腳本繼承了 UGUI 的 ScrollRect, 並且覆寫了捲動相關事件, /// 排除多點觸碰時, 會造成捲動功能異常的問題. /// </summary> public class MyScrollView : ScrollRect { public override void OnBeginDrag( PointerEventData eventData ) { eventData.position = Input.mousePosition; // 或者以下方法也可以! // Input.mousePosition 與 Input.touches[ 0 ].position 是一樣意思的. // eventData.position = Input.touches[ 0 ].position; base.OnBeginDrag( eventData ); } public override void OnDrag( PointerEventData eventData ) { eventData.position = Input.mousePosition; // 或者以下方法也可以! // Input.mousePosition 與 Input.touches[ 0 ].position 是一樣意思的. // eventData.position = Input.touches[ 0 ].position; base.OnDrag( eventData ); } public override void OnEndDrag( PointerEventData eventData ) { eventData.position = Input.mousePosition; // 或者以下方法也可以! // Input.mousePosition 與 Input.touches[ 0 ].position 是一樣意思的. // eventData.position = Input.touches[ 0 ].position; base.OnEndDrag( eventData ); } }
腳本使用方式,把腳本取代掉原本的 Scroll View 即可

這邊也有提供範例,可以供大家測試與參考,下載範例後,將範例安裝到行動裝置上,並且試著用 "兩根以上手指" 去滑動 Scroll View 看看!測試兩個 Scroll View 有什麼不同?
文章標籤
全站熱搜