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

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

10.01.2020, 23:33. Показов 3654. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru