Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
 Аватар для NotGoodEnough
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404

Доработка Drag&Drop скрипта

20.02.2018, 21:19. Показов 5436. Ответов 3

Студворк — интернет-сервис помощи студентам
Нужно что бы предметы менялись местами если один предмет кинуть на другой. Не могу решить проблемку.
И да, всё реализовано одним скриптом.
Вот скрипт DragAndDrop:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
 
public class DragAndDrop : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
 
    private Transform oldParent;
    private Transform canvas;
    private Image image;
    private InventorySlot inventorySlot;
 
    private void Start()
    {
        canvas = GameObject.FindWithTag("Canvas").transform;
        image = GetComponent<Image>();
    }
 
    public void OnBeginDrag(PointerEventData eventData)
    {
        image.raycastTarget = false;
        inventorySlot = transform.parent.GetComponent<InventorySlot>();
        oldParent = transform.parent;
        transform.SetParent(canvas);
    }
 
    public void OnDrag(PointerEventData eventData)
    {
        transform.localPosition = Input.mousePosition - new Vector3(Screen.width / 2, Screen.height / 2, 0);
    }
 
    public void OnEndDrag(PointerEventData eventData)
    {
        image.raycastTarget = true;
 
        if (eventData.pointerCurrentRaycast.gameObject != null)
        {
            if (eventData.pointerCurrentRaycast.gameObject.transform.parent == canvas)
                transform.SetParent(oldParent);
            else
            {
                if (eventData.pointerCurrentRaycast.gameObject.transform != oldParent)
                {
                    InventorySlot newInventorySlot = eventData.pointerCurrentRaycast.gameObject.GetComponent<InventorySlot>();
                    newInventorySlot.item = inventorySlot.item;
                    inventorySlot.item = null;
                    newInventorySlot.isEmpty = false;
                    inventorySlot.isEmpty = true;
                }
                transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform);
            }
        }
        else transform.SetParent(oldParent);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.02.2018, 21:19
Ответы с готовыми решениями:

Drag&Drop элементов в 3D инре на Unity
Подскадите как создать меню с элементами которые можно будет перетаскивать на 3D сцену? Нужно подобие того, что на картинке чтобы я мог...

Drag-and-drop из проводника виндус в проводник юнити
Здрасте не пойму почему но перестала работать функция когда я мог перенести мышкой файл (например текстуру) из проводника винды в юнити...

DrawGrid & Drag&Drop
Здравствуйте. Суть вопроса - поставлена задача по заполнению TDrawGrid формата 5х5 изображениями одинакового размера (одна ячейка должна...

3
 Аватар для NotGoodEnough
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
21.02.2018, 21:49  [ТС]
Как всегда куча ответов! В общем, разобрался, вот, InventorySlot и DragAndDrop, может кому понадобиться.
InventorySlot:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using UnityEngine;
 
public class InventorySlot : MonoBehaviour {
 
    public Item item;
    public GameObject iconPrefab;
    public bool isEmpty = true;
 
    private void Update()
    {
        if (item) isEmpty = false;
        else isEmpty = true;
    }
}
DragAndDrop:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
 
public class DragAndDrop : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
 
    private Transform oldParent;
    private Transform canvas;
    private Image image;
    private InventorySlot inventorySlot;
    private Item inventorySlotItem;
 
    private void Start()
    {
        canvas = GameObject.FindWithTag("Canvas").transform;
        image = GetComponent<Image>();
    }
 
    public void OnBeginDrag(PointerEventData eventData)
    {
        image.raycastTarget = false;
        inventorySlot = transform.parent.GetComponent<InventorySlot>();
        inventorySlotItem = inventorySlot.item;
        oldParent = transform.parent;
        transform.SetParent(canvas);
    }
 
    public void OnDrag(PointerEventData eventData)
    {
        transform.localPosition = Input.mousePosition - new Vector3(Screen.width / 2, Screen.height / 2, 0);
    }
 
    public void OnEndDrag(PointerEventData eventData)
    {
        image.raycastTarget = true;
 
        if (eventData.pointerCurrentRaycast.gameObject != null)
        {
            if (eventData.pointerCurrentRaycast.gameObject.transform.parent == canvas)
                transform.SetParent(oldParent);
            else if (eventData.pointerCurrentRaycast.gameObject.transform.GetComponent<DragAndDrop>())
            {
                InventorySlot newInventorySlot = eventData.pointerCurrentRaycast.gameObject.transform.parent.GetComponent<InventorySlot>();
                inventorySlot.item = newInventorySlot.item;
                eventData.pointerCurrentRaycast.gameObject.transform.SetParent(oldParent);
 
                transform.SetParent(newInventorySlot.transform);
                inventorySlot = transform.parent.GetComponent<InventorySlot>();
                inventorySlot.item = inventorySlotItem;
            }
            else
            {
                if (eventData.pointerCurrentRaycast.gameObject.transform != oldParent)
                {
                    InventorySlot newInventorySlot = eventData.pointerCurrentRaycast.gameObject.GetComponent<InventorySlot>();
                    newInventorySlot.item = inventorySlot.item;
                    inventorySlot.item = null;
                }
                transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform);
            }
        }
        else transform.SetParent(oldParent);
    }
}
P.S. InventorySlot кидаем на объект в котором будет лежать объект со скриптом DragAndDrop.
И да, если есть желающие, могу скинуть скрипт Inventory, но он не дописан!
0
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
22.02.2018, 17:11
Цитата Сообщение от NotGoodEnough Посмотреть сообщение
private void Update()
* * {
* * * * if (item) isEmpty = false;
* * * * else isEmpty = true;
* * }
каждый кадр вызывается присваивание.
Не проще присваивать в DragAndDrop, когда поднимаем или кладем вещь в ячейку?
0
 Аватар для NotGoodEnough
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
22.02.2018, 19:00  [ТС]
Так было раньше, я подумал, зачем везде писать что бы он выключал isEmpty, если можно засунуть в скрипт слота 2 строчки.
И пришёл к такому решению.
И на счёт того что каждый кадр вызывается присваивание, так как это скрипт слота, а слот находиться в объекте инвентаря, а он вкл/выкл через другой скрипт, соответственно когда инвентарь выкл, то Update в InventorySlot не вызывается.

Можно конечно сделать публичный метод в InventorySlot и вызывает его при добавлении объекта, но пока я в этом не нуждаюсь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.02.2018, 19:00
Помогаю со студенческими работами здесь

Drag & Drop
Здравствуйте! Есть JPanel, в котором есть еще несколько JPanel созданных &quot;на лету&quot;. Все созданные &quot;на лету&quot;...

Drag&Drop
Я хочу сделать интерфейс Drag and Drop. И вроде всё делаю правильно, но почему-то скрипт работает не совсем адекватно. Вот, собственно, сам...

Drag&Drop
Задача заключается в следующем: Есть два елемента Panel, на которых расположены какие то контролы (допустим кнопки). Как сделать...

Drag & drop
Я ничего не смыслю в qt. Кто может, помогите пожалуйста склеить программу из этого - https://www.cyberforum.ru/qt/thread1215670.html и...

Drag & Drop
Доброго! Подскажите пожалуйста, перекрыл dropEvent (QDropEvent * event) в QTableWidget-e, тяну с QListWidget-а элемент, бросаю в таблицу....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru