Перетаскивание скопированного, UI объекта
Я создаю свою игру на Unity в 2д пространстве.
Скрипт Delete (объект который удаляет другие объекты когда те на нем оказываются) не удаляет объекты созданные Script (с первого раза)
public class Create : MonoBehaviour, IPointerDownHandler {
public void OnPointerDown(PointerEventData eventData) {
CreateClone(eventData);
}
private IEnumerator WaitForMouseDown(DragDrop newDragDrop, PointerEventData eventData) {
newDragDrop.OnBeginDrag(eventData); //Calling OnBeginDrag
while (Input.GetMouseButton(0)) { //Looping if LMB is Down
newDragDrop.OnDrag(eventData);
yield return null; //Waiting the next Frame
}
newDragDrop.OnEndDrag(eventData);
}
public void InitiateDragDrop(DragDrop newDragDrop, PointerEventData eventData) {
StartCoroutine(WaitForMouseDown(newDragDrop, eventData));
}
private void CreateClone(PointerEventData eventData) {
//Create Clone like Prefab
RectTransform rectTransform = _clone.GetComponent<RectTransform>();
rectTransform.SetParent(_canvas.transform, false); //Clone correct position
//Add Component DragDrop for Clone
DragDrop newDragDrop = _clone.AddComponent<DragDrop>(); //Add Component DragDrop for Clone
//Get canvas for DragDrop for correct work
InitiateDragDrop(newDragDrop, eventData);
Destroy(_clone.GetComponent<Create>()); //Delete Script Create on the Clone
}
}
Данный код чуть-чуть подчищен, его задача при клике создавать объект который будет следовать за мышкой пока не отпустишь ЛКМ (реализовано при помощи Эвентов DragDrop) данная часть кода работает прекрасно за небольшим но
public class Delete : MonoBehaviour, IDropHandler {
public void OnDrop(PointerEventData eventData) {
Debug.Log("Destroyed the Object");
if (eventData.pointerDrag != null) {
Destroy(eventData.pointerDrag); //Destroy OnDrop Object
}
}
}
Скрипт Delete (вызывается тоже при помощи Эвента и работает тоже отлично, он тут для понятности)
Если при создании объекта, не отпуская мыши перетащить его на Удалитель то ничего не произойдет, если честно я думаю что все дело в IEnumerator (Корутина) ведь всё остальное работает на ура, даже подключив Debug.Log он показывает что все работает но чтобы удалить объект его сначала прийдется отпустить а после снова взять и отпустить на Удалителе
Кратко: Код создает копию объекта и дает его двигать пока мы держим ЛКМ. Но объект почему то не может удалиться если его перетащить на Удалитель (нужно будет повторить попытку удаления)
Если создать объект вручную в Unity и дать ему нужное свойство перетаскивания то он без проблем удаляется, даже если убрать функцию удаления скрипта Create то проблема останется
public class DragDrop : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
public void OnBeginDrag(PointerEventData eventData) {
Debug.Log("DragDrop | On Being Drag");
canvasGroup.alpha = .2f;
canvasGroup.blocksRaycasts = false;
}
public void OnDrag(PointerEventData eventData) {
rectTransform.anchoredPosition += eventData.delta / canvas.scaleFactor;
}
public void OnEndDrag(PointerEventData eventData) {
Debug.Log("DragDrop | On End Drag");
canvasGroup.alpha = 1f;
canvasGroup.blocksRaycasts = true;
}
}
Ответы (1 шт):
Прямо сейчас проблема решена, примерно так выглядит сейчас мой код:
public class Create : MonoBehaviour, IPointerEnterHandler {
public void OnPointerEnter(PointerEventData eventData) {
CreateClone();
}
private void CreateClone() {
//Здесь ничего не изменилось
}
}
В остальных скриптах тоже ничего не изменилось, поэтому правду говорят "все гениальное - просто"
Поскольку эта реализация может иметь некоторые проблемы с оптимизацией всегда буду рад если меня подправят.
Изъян 1: Объект который мы копируем появляется строго в той точке где наш родитель. Изъян 2: Он немного зависит от второго, данный скрипт создает клон буквально поверх оригинала и из-за этого пока клон не будет передвинут новый не создастся (многим такое решение не подойдет). Изъян 3: Оптимизация. Такая реализации может возыметь много проблем с оптимизацией и удобством при такой реализации (в долгосрочной перспективе) Изъян 4: Если подобный клон создается на объекте который должен быть строго в одной зоне примерно одного размера (относительно экрана) то переместить объект в слоте получится пока не сделаешь его дочерним относительно слота.