Воскресенье, 28 Апреля 2024, 00:52

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Получить gameobject в котором сработало событие OnMouseDown
Получить gameobject в котором сработало событие OnMouseDown
timur2008Дата: Воскресенье, 01 Мая 2016, 19:02 | Сообщение # 1
частый гость
Сейчас нет на сайте
Здравствуйте ,подскажите пожалуйста как получить объект по которому пользователь кликнул мышью. До меня дошло что нужно на все объекты повесить скрипт примерно такой
Код
if (Input.GetMouseButtonDown(0))
            Debug.Log("Pressed left click.");


Это срабатывает, но как мне потом получить доступ к геймобъекту на котором сработала эта проверка, чтобы уже работать непосредственно с ним ?
8Observer8Дата: Воскресенье, 01 Мая 2016, 19:22 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
С помощью Physics.Raycast

Повесьте, например, на камеру следующий скрипт. Как видите, здесь получают gameObject и скрипт, который на нём висит:

Код

    void Update()
    {
        var ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        RaycastHit hit = new RaycastHit();

        if (Physics.Raycast(ray, out hit))
        {
            var clickMove = hit.collider.gameObject.GetComponent<ClickMove>();
            clickMove.OnClick(hit.point);
        }
    }


Сообщение отредактировал 8Observer8 - Воскресенье, 01 Мая 2016, 19:23
timur2008Дата: Воскресенье, 01 Мая 2016, 20:31 | Сообщение # 3
частый гость
Сейчас нет на сайте
это не сработает sad мне нужно что бы я мог поменять у того геймобджекта высоту и ширину, а именно у инпутфиэлда. У меня задумка такая, юзер тыкает по одному из инпутфиэлдов и тот разворачивается на весь экран, затем он может подредактировать и сохранить его либо просто посмотреть и закрыть без изменений.
8Observer8Дата: Воскресенье, 01 Мая 2016, 20:56 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
А если для UI то должно так сработать:

Код

    void OnMouseOver()
    {
        // Left Mouse Button
        if (Input.GetMouseButtonDown(0))
        {
             // Проводим нужные действия с данным объектом
        }
     }


Сообщение отредактировал 8Observer8 - Воскресенье, 01 Мая 2016, 20:56
timur2008Дата: Воскресенье, 01 Мая 2016, 21:02 | Сообщение # 5
частый гость
Сейчас нет на сайте
ну оно и работает, но я споткнулся на том что мне теперь нужно получить сам геймобджект у которого сработало это условие чтобы у него высоту и ширину поменять. У меня много динамически создающихся геймобжектов которые состоят из канваса и внутри него находится инпутфиэлд.
8Observer8Дата: Воскресенье, 01 Мая 2016, 21:04 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Вот так протестируйте:

Код

    void OnMouseOver()
    {
        // Left Mouse Button
        if (Input.GetMouseButtonDown(0))
        {
             Debug.Log(this.gameobject.name);
        }
     }


Сообщение отредактировал 8Observer8 - Воскресенье, 01 Мая 2016, 21:05
timur2008Дата: Воскресенье, 01 Мая 2016, 21:10 | Сообщение # 7
частый гость
Сейчас нет на сайте
Вво классно работает спасибо большое , забыл про this , блин. Только нужно в Update его пихать :)
Код


void Update () {
        if (Input.GetMouseButtonDown(0))
            Debug.Log(this.gameObject.name);
    }
8Observer8Дата: Воскресенье, 01 Мая 2016, 21:24 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
Цитата timur2008 ()
забыл про this

Цитата timur2008 ()
Только нужно в Update его пихать :)

И в Update можно и через MouseOver будет работать. И кстати, this необязательно писать:

Код

public class Element : MonoBehaviour
{
    void OnMouseOver()
    {
        // Left Mouse Button
        if (Input.GetMouseButtonDown(0))
        {
             Debug.Log(gameobject.name);
        }
    }
}

Добавлено (01 мая 2016, 21:24)
---------------------------------------------

Цитата timur2008 ()
Только нужно в Update его пихать :)

Ещё такой момент, что если делать через Update, то сработают все Input.GetMouseButtonDown(0) у всех объектов, а если через MouseOver, то только один над которым курсор


Сообщение отредактировал 8Observer8 - Воскресенье, 01 Мая 2016, 21:18
timur2008Дата: Понедельник, 02 Мая 2016, 19:22 | Сообщение # 9
частый гость
Сейчас нет на сайте
Спасибо, ноблин какой то косяк, не отрабатывает почему то событие. На созданных объектах висит скрипт с событием OnMouseOver() но он почему-то не срабатывает sad
berilДата: Понедельник, 02 Мая 2016, 22:06 | Сообщение # 10
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Цитата timur2008 ()
Спасибо, ноблин какой то косяк, не отрабатывает почему то событие. На созданных объектах висит скрипт с событием OnMouseOver() но он почему-то не срабатывает sad

А коллайдеры висят на созданных обьектах ?




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
timur2008Дата: Вторник, 03 Мая 2016, 08:11 | Сообщение # 11
частый гость
Сейчас нет на сайте
эмм а как посмотреть есть ли колайдр на инпутбоксе ?

Добавлено (03 мая 2016, 08:11)
---------------------------------------------
и если нет то как его добавить ??

LertmindДата: Вторник, 03 Мая 2016, 08:31 | Сообщение # 12
заслуженный участник
Сейчас нет на сайте
timur2008, это элемент UI, ему не нужен коллайдер. Чтобы узнать, когда произошёл клик на элемент UI, реализуешь интерфейс IPointerClickHandler, и этот скрипт вешаешь на элемент, например:
Код
using UnityEngine;
using UnityEngine.EventSystems;

public class Test1 : MonoBehaviour, IPointerClickHandler
{
    #region IPointerClickHandler implementation

    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("Click");
    }

    #endregion
}


Как вариант, добавляешь на InputField компонент EventTrigger, там добавляешь событие PointerClick, потом выбираешь объект на сцене и метод у одного из его компонентов, который будет вызван при клике. На этом видео это происходит для Image https://youtu.be/3NBYqPAA5Es?t=221


Сообщение отредактировал Lertmind - Вторник, 03 Мая 2016, 08:34
8Observer8Дата: Вторник, 03 Мая 2016, 10:37 | Сообщение # 13
заслуженный участник
Сейчас нет на сайте
Lertmind, да вы правы, OnMouseOver не работает с UI. Тогда за одно покажите TC как увеличивать InputField при клике, как он писал:

Цитата timur2008 ()
я споткнулся на том что мне теперь нужно получить сам геймобджект у которого сработало это условие чтобы у него высоту и ширину поменять. У меня много динамически создающихся геймобжектов которые состоят из канваса и внутри него находится инпутфиэлд
LertmindДата: Вторник, 03 Мая 2016, 18:47 | Сообщение # 14
заслуженный участник
Сейчас нет на сайте
8Observer8, мог бы сам) Если что, вот так при клике меняется размер InputField для первого способа:
Код
using UnityEngine;
using UnityEngine.EventSystems;

public class Test1 : MonoBehaviour, IPointerClickHandler
{
    #region IPointerClickHandler implementation

    public void OnPointerClick(PointerEventData eventData)
    {
        // RectTransform наследуется от Transform, значит можем привести
        RectTransform rt = (RectTransform)transform;
        // Свойства Width и Height у RectTransform в Инспекторе
        rt.sizeDelta = new Vector2(300f, 100f);
    }

    #endregion
}

для второго способа:
Код
using UnityEngine;
using UnityEngine.EventSystems;

public class Test2 : MonoBehaviour
{
    public void PointerClick(PointerEventData eventData)
    {
        // Получаем GO на который кликнули
        GameObject go = eventData.selectedObject;
        // Делаем тоже самое, что в OnPointerClick
        RectTransform rt = (RectTransform)go.transform;
        rt.sizeDelta = new Vector2(300f, 100f);
    }
}
timur2008Дата: Среда, 04 Мая 2016, 07:10 | Сообщение # 15
частый гость
Сейчас нет на сайте
Спасибо огромное !!!, сегодня попробую так сделать smile

Добавлено (04 мая 2016, 07:10)
---------------------------------------------
Сработало спамтбо большое!!!

Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Получить gameobject в котором сработало событие OnMouseDown
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг