我的環境配置: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 有什麼不同?
文章標籤
全站熱搜
