Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85

Перетягивание UI объектов (2D Inventory)

10.01.2020, 23:33. Показов 3761. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. В проекте появилась потребность сделать инвентарь. Сделано базу данных с предметами в игре, сам инвентарь, ячейки но не знаю как сделать перетягивание предметов в инвентаре (с слота в слот). Нашёл много уроков по этой теме, но они все о ПК, а мне надо это всё для андроид. То есть весь код связаный с мышью не подходит. Свой код перетаскивания (не робочий) скину через время, ибо сейчас нет возможности. Если кто-то может чем-то помочь, прошу отреагировать
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.01.2020, 23:33
Ответы с готовыми решениями:

Перетягивание каната
12. Перетягивание каната Перетягивание каната – это состязание в грубой силе, когда две группы людей тянут канат в противоположные...

DataGridView перетягивание
Добрый вечер!) Есть несколько вопросов. А именно: 1) Возможен ли драг-н-дроп в указанную позицию? Например если в датагриде есть...

Перетягивание формы за label
как перетягивать форму за label, и за другие контролы?

33
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
11.01.2020, 00:04
Цитата Сообщение от Cliffster Посмотреть сообщение
код связаный с мышью не подходит
Ну да, очень тяжело переделать под touch...
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
11.01.2020, 00:23  [ТС]
Я пытался, но код не работает
0
 Аватар для Steroid
296 / 217 / 86
Регистрация: 17.02.2016
Сообщений: 1,276
Записей в блоге: 1
11.01.2020, 00:36
код покажи
0
vk.com/pppoe252110
62 / 43 / 21
Регистрация: 31.05.2019
Сообщений: 251
11.01.2020, 05:43
Все что работает с пк, то и с андроидом
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
11.01.2020, 13:18  [ТС]
Ttemik, не согласен!
Если надо премещать объект за тачем то с Input.mousePosition = GameObject.transform.position этого не получиться.

Steroid, вот
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
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
 
 
public class DragItem : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
    public GameObject DragetObject;
    public PlayerInventory Inventory;
    public Touch Finger;
 
    
    public void Start()
    {
        Inventory = GameObject.FindGameObjectWithTag("Inventory Manager").GetComponent<PlayerInventory>();
    }
 
    public void OnBeginDrag(PointerEventData eventData)
    {
        DragetObject = gameObject;
        Inventory.DragIcon.SetActive(true);
        if (DragetObject.GetComponent<CurrentItem>())
        {
            int index = DragetObject.GetComponent<CurrentItem>().IDCurrentItem;
            Inventory.DragIcon.GetComponent<Image>().sprite = Inventory.Item[index].Icon;
        }
    }
 
 
    public void OnDrag(PointerEventData eventData)
    {
        if (TouchPhase.Began == Finger.phase)
        {
            Inventory.DragIcon.transform.position = Finger.position;
            if (TouchPhase.Moved == Finger.phase)
            {
                Inventory.DragIcon.transform.position = Finger.position;
            }
        }
    }
 
 
    public void OnEndDrag(PointerEventData eventData)
    {
        DragetObject = null;
        Inventory.DragIcon.SetActive(false);
    }
}
Добавлено через 10 минут
Steroid, с мышкой всй работает, но объект куда-то перемещается(не на координаты мыши). С тачем объект появляется в одной точке и всё (даже не возле места прикасания)
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
11.01.2020, 14:12
Ты в курсе что код Moved никогда не сработает? Попробуй угадай почему.
C#
1
2
3
4
5
if (TouchPhase.Began == Finger.phase)
{
    Inventory.DragIcon.transform.position = Finger.position;
 
    if (TouchPhase.Moved == Finger.phase)...
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
11.01.2020, 14:45  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Ты в курсе что код Moved никогда не сработает? Попробуй угадай почему.
Даже не знаю.... ведь движение пальца осуществляться при Drag'е и по идее должен сработать.
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
11.01.2020, 15:19
Еще раз...
C#
1
2
3
4
5
6
7
if (TouchPhase.Began == Finger.phase)
{
    if (TouchPhase.Moved == Finger.phase)
    {
        // не сработает никогда
    }
}
Теперь увидел?
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
11.01.2020, 15:38  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Теперь увидел?
Нет... ну когда жмёшь на слот срабатывает фаза Began, а потом когда перетаскиваешь move
0
250 / 186 / 68
Регистрация: 04.03.2019
Сообщений: 1,010
11.01.2020, 15:43
Cliffster, условие Moved внутри условия Began
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
11.01.2020, 15:48
Ладно вот я тебе привожу аналогию:
C#
1
2
3
4
5
6
7
if (value == 1)
{
    if (value == 2)
    {
         // И тут ты безуспешно пытаешься что-то делать...
    }
}
Ты знаешь как условия в блоках обрабатываются?
В твоем коде должно быть что-то типа:
C#
1
2
3
4
5
6
7
8
9
    public void OnDrag(PointerEventData eventData)
    {
        var touch = Input.GetTouch(0);
 
        if (touch.phase == TouchPhase.Moved)
        {
            Inventory.DragIcon.transform.position = touch.position;
        }
    }
0
250 / 186 / 68
Регистрация: 04.03.2019
Сообщений: 1,010
11.01.2020, 15:49
честно говоря вообще не вижу смысла проверять в методе OnDrag что там с пальцами

Добавлено через 1 минуту
ну разве что будет более 1го
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
11.01.2020, 16:21  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Ладно вот я тебе привожу аналогию:
Спасибо я понял. Сейчас попробую переписать код.

Цитата Сообщение от MuaddibFremen Посмотреть сообщение
честно говоря вообще не вижу смысла проверять в методе OnDrag что там с пальцами
Объясни

Добавлено через 16 минут
Я всё переделал. всё как и было раньше. Объект просто появляется но не движется за пальцем

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
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
 
 
public class DragItem : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
    public GameObject DragetObject;
    public PlayerInventory Inventory;
    public Touch Finger;
 
    
    public void Start()
    {
        Inventory = GameObject.FindGameObjectWithTag("Inventory Manager").GetComponent<PlayerInventory>();
    }
 
    public void OnBeginDrag(PointerEventData eventData)
    {
        DragetObject = gameObject;
        Inventory.DragIcon.SetActive(true);
        if (DragetObject.GetComponent<CurrentItem>())
        {
            int index = DragetObject.GetComponent<CurrentItem>().IDCurrentItem;
            Inventory.DragIcon.GetComponent<Image>().sprite = Inventory.Item[index].Icon;
        }
    }
 
 
    public void OnDrag(PointerEventData eventData)
    {
 
        if (Finger.phase == TouchPhase.Moved)
        {
            Inventory.DragIcon.transform.position = Finger.position;
        }
    }
    
 
    public void OnEndDrag(PointerEventData eventData)
    {
        DragetObject = null;
        Inventory.DragIcon.SetActive(false);
    }
}
P.S я не писал var touch = Input.GetTouch(0); так как с этим результат тот же
0
 Аватар для Steroid
296 / 217 / 86
Регистрация: 17.02.2016
Сообщений: 1,276
Записей в блоге: 1
11.01.2020, 16:59
Цитата Сообщение от Cliffster Посмотреть сообщение
public PlayerInventory Inventory;
Цитата Сообщение от Cliffster Посмотреть сообщение
Inventory.DragIcon.transform.position = Finger.position;
Цитата Сообщение от Cliffster Посмотреть сообщение
Объект просто появляется но не движется за пальцем
потомучто ты двигаешь не объект а скрипт
тебе нужна ссылка на объект
например:
C#
1
2
3
4
5
6
7
public GameObject DragIcon;
void Start()
{
DragIcon = GetComponent<Inventory>().DragIcon; // 
// а потом в методе Драг уже жвигаешь этот объект
 
}
писал с колена, к правописанию не придираться
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
11.01.2020, 17:34
Finger всегда нулевой у тебя, ты просто обязан брать Input.GetTouch(0).
1
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
11.01.2020, 17:48  [ТС]
Цитата Сообщение от Steroid Посмотреть сообщение
потому что ты двигаешь не объект а скрипт
тебе нужна ссылка на объект
например:
С твоим примером Unity выдаёт ошибку:

NullReferenceException: Object reference not set to an instance of an object
DragItem.Start () (at Assets/Scripts/MainInterfase/Inventory/DragItem.cs:17)

Код стал такой(это сторока 17):
C#
1
DragIcon = GetComponent<PlayerInventory>().DragIcon;
Цитата Сообщение от 1max1 Посмотреть сообщение
Finger всегда нулевой у тебя, ты просто обязан брать Input.GetTouch(0).
Я понял
0
250 / 186 / 68
Регистрация: 04.03.2019
Сообщений: 1,010
11.01.2020, 19:45
Цитата Сообщение от Cliffster Посмотреть сообщение
OnDrag
вы уже двигаете. там не может быть нажат палец Первый.
Цитата Сообщение от Cliffster Посмотреть сообщение
OnBeginDrag
а вот тут начинается движение
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
11.01.2020, 19:50
Я бы вообще инвентарь делал через pointer up/down + update. И соскальзывать не будет, если понимаете о чем я))
1
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
11.01.2020, 21:50  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Я бы вообще инвентарь делал через pointer up/down + update. И соскальзывать не будет, если понимаете о чем я))
Вот я переделал, но опять же объект появляется и не движется....
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
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
 
public class TestDrag : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
 
    public Touch Finger;
    public GameObject DragetObject;
    public PlayerInventory Inventory;
    public bool PressButton;
    public Vector3 PosDragItem;
 
    
    public void Start()
    {
        Inventory = GameObject.FindGameObjectWithTag("Inventory Manager").GetComponent<PlayerInventory>();
        PosDragItem = Inventory.DragIcon.GetComponent<Transform>().position;
    }
 
    public void Update()
    {
        if (PressButton)
        {
            PosDragItem = Finger.position;
        }
    }
 
    public void OnPointerDown(PointerEventData eventData)
    {
        DragetObject = gameObject;
        Inventory.DragIcon.SetActive(true);
        if (DragetObject.GetComponent<CurrentItem>())
        {
            int index = DragetObject.GetComponent<CurrentItem>().IDCurrentItem;
            Inventory.DragIcon.GetComponent<Image>().sprite = Inventory.Item[index].Icon;
        }
        PressButton = true;
    }
 
    public void OnPointerUp(PointerEventData eventData)
    {
        DragetObject = null;
        Inventory.DragIcon.SetActive(false);
        PressButton = false;
    }
}

Цитата Сообщение от Steroid Посмотреть сообщение
потомучто ты двигаешь не объект а скрипт
тебе нужна ссылка на объект
например:
Ещё по поводу этого. В скрипте есть переменная которая хранит объект. И я двигаю объект. Я всё- таки переделал под твой совет, но всё так же не работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.01.2020, 21:50
Помогаю со студенческими работами здесь

Визуальное отображение и перетягивание
Хотела посоветоваться, какие лучше плагины \ алгоритмы использовать. Хочу сделать программу для печати на конвертах, собственно...

Mousemove, перетягивание многоугольника
Скажите пожалуйста, как мне реализовать метод MoveBy - перетягивание многоугольника. Я питалася делать методы для определения является ли...

Перетягивание файлов на иконку программы
Приветствую! Не знаю, как сформировать запрос в поисковую систему, так что спрошу у вас - как известно, у некоторых программ есть...

Роутер Acorp W422G + DWA-525 + ноут + комп = перетягивание одеяла интернета.
Жили-были люди с компом, ноутом и роутером DLink-2640U. Но захотел человек в соседнем подъезде присоединиться к их счастью (Его...

Нанесение картинки на другую с прозрачностью. Перетягивание картинки по окну
Здравствуйте. Мне нужно, чтобы картинка шашки наносилась на картинку доски сохраняя прозрачность фона, как на оригинальной картинке. Так-же...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru