Прокрутка пальцем, ложное нажатие
Добавлено: 18 апр 2021, 22:41
Есть проблема со старым интерфейсом. Конкретно возьмем GUI.BeginScrollView. Он естественно не прокручиваются пальцем по экрану, только если двигать сам ползунок. Но проблема даже не в этом, прокрутку пальцем я реализовал, но вот элементы которые находятся внутри него(кнопки GUI.Button), срабатывают на нажатие во время прокрутки. Логика понятна, нажал на кнопку, прокрутил ScrollView и при убирании пальца, кнопка фиксирует нажатие. Кто знает как от этого избавиться? Я знаю что лучше использовать UI, но проект довольно большой и переводить его на UI очень долго. Так же я в принципе знаю как решить эту проблему если отслеживать нажатие по тачу в пределах Rect, не используя if(GUI.Button, но мне интересно неужели нет нормальных вариантов это сделать, без костылей, да и как до появления UI можно было прокручивать пальцем элементы не нажимая на них.
Для примера, использую банальный GUI.BeginScrollView и GUI.Button, нужно как то сбросить событие нажатия кнопки, если началась прокрутка.
Для примера, использую банальный GUI.BeginScrollView и GUI.Button, нужно как то сбросить событие нажатия кнопки, если началась прокрутка.
Синтаксис:
Используется csharp
private Vector2 scrollPosition;
private Vector2 touchDelta;
public Rect rect;
private void Update(){
touchDelta = IsMoved(rect);
if(touchDelta.y != 0)scrollPosition.y += touchDelta.y;
}
public Vector2 IsMoved(Rect _rect){
foreach(Touch touch in Input.touches) {
Vector2 touchPosition = touch.position;
touchPosition.y = Screen.height - touchPosition.y;
if(_rect.Contains(touchPosition))
if(touch.phase == TouchPhase.Moved)return touch.deltaPosition * GetTouchDeltaTime(touch);
}
return Vector2.zero;
}
private float GetTouchDeltaTime(Touch _touch){
if(_touch.deltaTime > 0)return Time.deltaTime/_touch.deltaTime;
else return 1;
}//GetTouchDeltaTime
void OnGUI() {
scrollPosition = GUI.BeginScrollView(new Rect (0, 0, 100, 100), scrollPosition, new Rect (0, 0, 100, 100));
if(GUI.Button (new Rect (0, 0, 20, 10), "")){
}
GUI.EndScrollView ();
}
private Vector2 touchDelta;
public Rect rect;
private void Update(){
touchDelta = IsMoved(rect);
if(touchDelta.y != 0)scrollPosition.y += touchDelta.y;
}
public Vector2 IsMoved(Rect _rect){
foreach(Touch touch in Input.touches) {
Vector2 touchPosition = touch.position;
touchPosition.y = Screen.height - touchPosition.y;
if(_rect.Contains(touchPosition))
if(touch.phase == TouchPhase.Moved)return touch.deltaPosition * GetTouchDeltaTime(touch);
}
return Vector2.zero;
}
private float GetTouchDeltaTime(Touch _touch){
if(_touch.deltaTime > 0)return Time.deltaTime/_touch.deltaTime;
else return 1;
}//GetTouchDeltaTime
void OnGUI() {
scrollPosition = GUI.BeginScrollView(new Rect (0, 0, 100, 100), scrollPosition, new Rect (0, 0, 100, 100));
if(GUI.Button (new Rect (0, 0, 20, 10), "")){
}
GUI.EndScrollView ();
}