Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/64: Рейтинг темы: голосов - 64, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 21.08.2020
Сообщений: 112
1

Как реализовать перемещение объекта мышкой в Unity2D?

22.09.2020, 19:36. Показов 12492. Ответов 12

Author24 — интернет-сервис помощи студентам
Вообщем, 2д пространство . Нужно чтобы при нажатие(зажатие) на обЪект мышкой , его можно было таскать по экрану , а когда отпускаешь он падал .
Помогите пожалуйста , смотрел форумы но там либо для 2д либо не до конца понятно.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2020, 19:36
Ответы с готовыми решениями:

Перемещение объекта мышкой
Добрый вечер. Начала изучать OpenGL при выполнении задания - сделать пасьянс. В программе просто...

Перемещение объекта мышкой!
Есть горизонтальная линия, по которой движется шарик(имеет координаты и скорость,соответственно)....

Перемещение объекта мышкой
Я перехожу с flash на html5, точнее уже перешла и пытаюсь сделать перемещение объекта с помощью...

Перемещение объекта мышкой
public void Move(Keys key) { if (key == Keys.Left) { ...

12
300 / 209 / 94
Регистрация: 04.07.2012
Сообщений: 895
23.09.2020, 11:43 2
Medoed, Для этого существует EventTrigger. Создаете публичный метод, который вешаете на OnPointerDown.
В банальном случае тупо меняете в этом методе bool переменную. Ну а в Update двигаете объект за курсором если bool true. Ну и в OnPointerUp, ставим переменную false и делаем проверки нужные Вам, типа если на месте, то вы победили.
0
1 / 1 / 0
Регистрация: 21.08.2020
Сообщений: 112
23.09.2020, 13:06  [ТС] 3
Вы не могли бы показать пример кода?
0
2636 / 1564 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
23.09.2020, 13:48 4
Medoed, уточните, это вы хотите перетаскивать изначально физические объекты? Иначе, что означает "чтобы он падал "?
0
1 / 1 / 0
Регистрация: 21.08.2020
Сообщений: 112
23.09.2020, 17:06  [ТС] 5
На 2д сцене есть например "ящик" , мышкой наводишь на него , зажимаешь , поднимаешь и таскаешь , отпускаешь и он падает.

Добавлено через 1 минуту
Как я понимаю для падения нужен просто риджет бади , а вот как сделать само перетаскивание я не знаю.
0
2636 / 1564 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
23.09.2020, 19:35 6
Лучший ответ Сообщение было отмечено Medoed как решение

Решение

Цитата Сообщение от Medoed Посмотреть сообщение
а вот как сделать само перетаскивание я не знаю.
В сети очень много разной информации на эту тему, куча уроков, статей и способов.
Пусть будет ещё один способ.
Закиньте этот скрипт на пустой объект в сцене. Этот объект будет отвечать за перетаскивание всех объектов на сцене с rb2d.
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
66
67
68
69
70
71
72
73
74
using UnityEngine;
 
[RequireComponent(typeof(Rigidbody2D))]
public class Drag2dObjects : MonoBehaviour
{
    private bool _isDraged = false;
 
    private Plane _planeXY;
 
    private Rigidbody2D _rb2D;
    private HingeJoint2D _hindleJoint2D;
 
    void Start()
    {
        _rb2D = GetComponent<Rigidbody2D>();
        _rb2D.isKinematic = true;
 
        _isDraged = false;
    }
 
    void Update()
    {
        // начинаем перетаскивание, если нажали на какой-то объект в сцене
        if (Input.GetMouseButtonDown(0) && _isDraged == false)
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D hit2D = Physics2D.GetRayIntersection(ray);
 
            if (hit2D.collider != null)
            {
                _planeXY = new Plane(Vector3.forward, hit2D.transform.position);
 
                _rb2D.position = hit2D.point;
 
                _hindleJoint2D = hit2D.transform.gameObject.AddComponent<HingeJoint2D>();
                _hindleJoint2D.connectedBody = this._rb2D;
 
                _isDraged = true;
            }
        }
 
        // прекращаем перетаскивание при отпускании мыши
        if (Input.GetMouseButtonUp(0) && _isDraged)
        {
            Destroy(_hindleJoint2D);
            _isDraged = false;
        }
 
        // реализанция перетаскивания
        if (_isDraged)
        {
            if (_hindleJoint2D == null || _hindleJoint2D.gameObject == null)
            {
                _hindleJoint2D = null;
                _isDraged = false;
                return;
            }
 
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (_planeXY.Raycast(ray, out float enterPoint))
            {
                _rb2D.position = ray.GetPoint(enterPoint);
            }
        }
    }
 
    private void OnDestroy()
    {
        if (_hindleJoint2D != null && _hindleJoint2D.gameObject != null)
        {
            Destroy(_hindleJoint2D);
        }
    }
}
1
1 / 1 / 0
Регистрация: 21.08.2020
Сообщений: 112
25.09.2020, 17:09  [ТС] 7
Спасибо за ответ , но как сделать так чтобы он игрока не мог перемещать?
0
2636 / 1564 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
25.09.2020, 17:45 8
Если перетаскивать в игре можно всё кроме игрока, тогда можно просто проверить имя или тег текущего объекта, на котором была нажата кнопка мыши и делать выход из метода, если это оказался игрок.

Либо воспользоваться слоями (LayerMask), и назначить всем объектам, которые можно перетаскивать какой нибудь слой. А при рейкасте (27 строка кода), добавить в метод этот слой, чтобы луч мог реагировать только на объекты с конкретным слоем.

О слоях есть много уроков в сети.
0
1 / 1 / 0
Регистрация: 21.08.2020
Сообщений: 112
25.09.2020, 18:02  [ТС] 9
Хорошо

Добавлено через 7 минут
Вот изменил часть скрипта . Но он не работает , в чем ошибка?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Item")
        {
        // начинаем перетаскивание, если нажали на какой-то объект в сцене
            if (Input.GetMouseButtonDown (0) && _isDraged == false) {
                Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
                RaycastHit2D hit2D = Physics2D.GetRayIntersection (ray);
 
                if (hit2D.collider != null) {
                    _planeXY = new Plane (Vector3.forward, hit2D.transform.position);
 
                    _rb2D.position = hit2D.point;
 
                    _hindleJoint2D = hit2D.transform.gameObject.AddComponent<HingeJoint2D> ();
                    _hindleJoint2D.connectedBody = this._rb2D;
 
                    _isDraged = true;
                }
            }
        }
Добавлено через 6 минут
На объект тег повесить я не забыл
0
2636 / 1564 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
25.09.2020, 18:02 10
А причем здесь метод?
C#
1
void OnTriggerEnter2D(Collider2D other)
0
1 / 1 / 0
Регистрация: 21.08.2020
Сообщений: 112
25.09.2020, 18:05  [ТС] 11
Я понял в чем ошибка , но какой метод нужно использовать?
0
2636 / 1564 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
25.09.2020, 18:09 12
Просто измените 29 строчку из моего кода
C#
1
if (hit2D.collider != null)
на эту

C#
1
if (hit2D.collider != null && hit2D.collider.CompareTag("Item"))
1
1 / 1 / 0
Регистрация: 21.08.2020
Сообщений: 112
25.09.2020, 18:09  [ТС] 13
Хорошо
0
25.09.2020, 18:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2020, 18:09
Помогаю со студенческими работами здесь

Перемещение объекта по форме мышкой
Допустим на форме мы рисуем TextBox и Label. Пользователь запускает программу и хочет переместить...

Перемещение влево-вправо летящего объекта мышкой?
Добрый день, есть куб, который движется по Z и Y координате, движение задается приложением силы...

Как реализовать мгновенное перемещение объекта в цикле к его начальной позиции?
Имеется объект в виде машинки, которая движется к кубу. В момент,когда их расстояние становится...

Как сделать мгновенное перемещение в Unity2d
Здравствуйте, у меня появился вопрос как сделать &quot;телепортацию&quot;(Не магическую телепортацию) в...

Как сделать поворот объекта в Unity2d
Вот код контроллер персонажа. Нужно чтобы спрайт персонажа разворачивался в сторону куда он идет....

Реализовать перемещение button1 по X оси, внутри какого либо объекта
Вообщем, решил немного упростить код в своей основной программе, для этого решил создать контрол и...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru