UI элементы. OnDrag и OnPointerDown при переключении скрипта
Добавлено: 12 май 2019, 21:36
Добрый день!
Есть ScrollRect, элементами которого являются кнопки.
Хотел, чтобы при разворачивания скролла можно было бы перемещать эти кнопки. Если на кнопку нажать и подержать, должен появиться спрайт, который бы уже следовал за пальцем (указателем мышкой) по событию OnDrag(). Дело в том, что когда переопределяется функция OnDrag(), то сам скролл пререстаёт работать. Поэтому я решил немного исхитриться и создал 2 скрипта.
Один наследует все 3 функции события Drag() и называется "ButtnDragMe", а второй наследует функции событий нажатия и называется "ButtnScrollMe". В изначальном состоянии компонента скрипта "ButtnDragMe" выключена и работает "ButtnScrollMe" (который не использует событийные ф-ии Drag(). Получается, я могу скроллить. А при удержании 0.5 секунд иконки (кнопки), скрипт "ButtnDragMe" включается и выключается "ButtnScrollMe".
Проблема в том, что при включении "ButtnDragMe" события Drag сразу не работают. Требуется отпустить левую клавишу мыши и снова нажав только уже с активным "ButtnDragMe", у меня получается перемещать курсором появившийся спрайт.
Не получается избавиться от этого лишнего снятия нажатия и продолжить сразу перемещать, вызывая события Drag() (хотя бы OnDrag) по новому, активировавшемуся компоненту скрипта "ButtnDragMe". Как ещё сделать такое переключение на перемещение Drag-ом при удержании скроллируемой кнопки, пока не могу представить.
Подскажите, пожалуйста, варианты решения.
Код "ButtnScrollMe"
Есть ScrollRect, элементами которого являются кнопки.
Хотел, чтобы при разворачивания скролла можно было бы перемещать эти кнопки. Если на кнопку нажать и подержать, должен появиться спрайт, который бы уже следовал за пальцем (указателем мышкой) по событию OnDrag(). Дело в том, что когда переопределяется функция OnDrag(), то сам скролл пререстаёт работать. Поэтому я решил немного исхитриться и создал 2 скрипта.
Один наследует все 3 функции события Drag() и называется "ButtnDragMe", а второй наследует функции событий нажатия и называется "ButtnScrollMe". В изначальном состоянии компонента скрипта "ButtnDragMe" выключена и работает "ButtnScrollMe" (который не использует событийные ф-ии Drag(). Получается, я могу скроллить. А при удержании 0.5 секунд иконки (кнопки), скрипт "ButtnDragMe" включается и выключается "ButtnScrollMe".
Проблема в том, что при включении "ButtnDragMe" события Drag сразу не работают. Требуется отпустить левую клавишу мыши и снова нажав только уже с активным "ButtnDragMe", у меня получается перемещать курсором появившийся спрайт.
Не получается избавиться от этого лишнего снятия нажатия и продолжить сразу перемещать, вызывая события Drag() (хотя бы OnDrag) по новому, активировавшемуся компоненту скрипта "ButtnDragMe". Как ещё сделать такое переключение на перемещение Drag-ом при удержании скроллируемой кнопки, пока не могу представить.
Подскажите, пожалуйста, варианты решения.
Код "ButtnScrollMe"
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[RequireComponent(typeof(Image))]
public class ButtnScrollMe : MonoBehaviour, IPointerDownHandler, IPointerUpHandler{
public bool dragOnSurfaces = true;
// private int Mode = 2;
private bool bStrtTime = false;
private float startTime = 0f;
private float waitTime = 0.5f;
private bool onbegin = false;
private bool ongoing = false;
private bool onend = false;
public PointerEventData eData;
public void OnPointerDown(PointerEventData eventData){
if (!bStrtTime) {
startTime = Time.time;
bStrtTime = true;
eData = eventData;
// this.gameObject.GetComponent<ButtnDragMe> ().eData = eventData;
}
}
public void Update(){
//If starts counting time
if (bStrtTime) {
if (!onbegin && !ongoing) {
if (Time.time > startTime + waitTime) {
//onBegin
onbegin = true;
}
}
if (onbegin) {
ongoing = true;
onbegin = false;
bStrtTime = false;
SetChangeEvent ();
}
}
if (onend) {
onend = false;
}
}
public void OnPointerUp(PointerEventData eventData){
bStrtTime = false;
ongoing = false;
onbegin = false;
onend = true;
}
private void SetChangeEvent(){
this.gameObject.GetComponent<ButtnDragMe>().enabled = true;
this.enabled = false;
}
}
using UnityEngine.EventSystems;
using UnityEngine.UI;
[RequireComponent(typeof(Image))]
public class ButtnScrollMe : MonoBehaviour, IPointerDownHandler, IPointerUpHandler{
public bool dragOnSurfaces = true;
// private int Mode = 2;
private bool bStrtTime = false;
private float startTime = 0f;
private float waitTime = 0.5f;
private bool onbegin = false;
private bool ongoing = false;
private bool onend = false;
public PointerEventData eData;
public void OnPointerDown(PointerEventData eventData){
if (!bStrtTime) {
startTime = Time.time;
bStrtTime = true;
eData = eventData;
// this.gameObject.GetComponent<ButtnDragMe> ().eData = eventData;
}
}
public void Update(){
//If starts counting time
if (bStrtTime) {
if (!onbegin && !ongoing) {
if (Time.time > startTime + waitTime) {
//onBegin
onbegin = true;
}
}
if (onbegin) {
ongoing = true;
onbegin = false;
bStrtTime = false;
SetChangeEvent ();
}
}
if (onend) {
onend = false;
}
}
public void OnPointerUp(PointerEventData eventData){
bStrtTime = false;
ongoing = false;
onbegin = false;
onend = true;
}
private void SetChangeEvent(){
this.gameObject.GetComponent<ButtnDragMe>().enabled = true;
this.enabled = false;
}
}