Есть 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;
}
}