Unreal觸屏和鼠標控制旋轉沖突問題
- 鼠標控制攝像機旋轉
- 添加Input軸
- 計算旋轉角度
- 通過軸事件控制旋轉
- 問題和原因
- 問題
- 原因
- 解決辦法
- 增加觸摸控制旋轉代碼
- 觸屏操作下屏蔽鼠標軸響應事件
鼠標控制攝像機旋轉
通過Mouse X和Mouse Y控制攝像機旋轉。
添加Input軸
計算旋轉角度
通過移動像素和攝像機FOV角計算像素移動范圍和角度之間關系
通過軸事件控制旋轉
問題和原因
問題
調試完鼠標控制沒有問題的情況下,通過觸摸屏旋轉則會出現不受控制的亂轉問題。
原因
Windows系統會將觸摸事件模擬為鼠標事件,這樣軟件不需進行特殊的觸摸屏適配,也可以在觸摸屏下進行簡單的單指交互操作。
造成觸摸屏下出現旋轉控制亂轉的原因就是Mouse X和Mouse Y軸事件的計算機制。
鼠標在Mouse Pressed狀態下,Unreal會鎖定鼠標,每次移動鼠標后會把鼠標拉回到按下位置。Unreal在計算Mouse X和Mouse Y軸的Axis Value值時只需要計算當前鼠標位置和按下狀態的鼠標位置差值,即可算出Axis Value。
AxisValueX = MouseLocation.X - PressedLocation.X
AxisValueY = MouseLocation.Y - PressedLocation.Y
# 以下操作不需要,Unreal會將鼠標位置自動拉回按下位置
# PressedLocation = MouseLocation
但在觸摸屏狀態下,這個機制就有問題了。Unreal可以把系統鼠標拉回到按下位置,但觸摸屏模擬的鼠標位置是沒有辦法拉回的,觸摸屏模擬的鼠標位置始終位于手指頭的下方。這樣,計算出來的AxisValueX 和AxisValueY 值就會變得異常的大,導致控制旋轉不受控制,旋轉異常快或反轉(可能旋轉超過360°導致看起來倒轉了)
解決辦法
解決辦法就是將觸摸事件和鼠標事件分開出來
增加觸摸控制旋轉代碼
通過一個Bool數組記錄十指的狀態,在通過一個Vector3數組記錄十指的位置,計算在指頭按下狀態下對應指頭的移動距離計算旋轉角度。
觸屏操作下屏蔽鼠標軸響應事件
增加觸摸操作藍圖并不會導致Windows系統自動停止模擬觸屏為鼠標事件。需要我們修改Mouse X和Mouse Y鼠標軸事件,增加判斷是否為觸摸屏模擬的鼠標事件,如果是,則不處理
根據記錄的十指狀態判斷是不是觸屏操作
如果是,則屏蔽鼠標軸事件處理代碼。