как определить, на каком игровом объекте щелкают - PullRequest
0 голосов
/ 13 марта 2020

Я хочу знать, какой игровой объект щелкается мышью в 2D-проекте

Я использовал

 void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            clickTime = DateTime.Now;
            mousePosition = Input.mousePosition;

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction);

            if (hit != null && hit.collider != null)
            {


            }

        }
}

, но он никогда не переходит во второе, если условие

РЕДАКТИРОВАТЬ Я работаю над одним сценарием и получаю доступ ко всему игровому объекту оттуда с помощью GameObject.FindGameObjectWithTag (), и, как я понимаю, именно поэтому код коллайдера в основном сценарии не срабатывает. Я добавил скриншот, мой код в GameObject enter image description here

Ответы [ 3 ]

0 голосов
/ 13 марта 2020

Рассмотрите возможность использования метода OnMouseOver() ( документы ):

private void OnMouseOver() {
    if (!Input.GetMouseButtonDown(0)) return;

    // Your logic here.
}

Этот метод работает только с коллайдером, присоединенным к игровому объекту, так же, как Raycast.

быть чище и чуть более производительным, потому что нет нескольких Update() методов для итерации каждого кадра. Что следует иметь в виду, если у вас есть десятки или сотни интерактивных объектов.

(хотя есть сообщения, что этот метод не работает с несколькими камерами, одна из которых - ортографическая c, в этом случае это не вариант для вас.)

0 голосов
/ 13 марта 2020

Этот метод отлично работает как для настольных, так и для мобильных приложений:

  1. Добавьте компонент коллайдера к каждому объекту, для которого вы хотите определить событие нажатия.
  2. Добавить скрипт в ваш проект (назовем его MyObject.cs ). Этот сценарий должен реализовывать интерфейс IPointerDownHandler и его метод. И этот скрипт должен добавить Physics2DRaycaster к камере. Все тело этого скрипта может выглядеть так:

    public class MyObject : MonoBehaviour, IPointerDownHandler
    {
        private void Start()
        {
            AddPhysics2DRaycaster();
        }
    
        public void OnPointerDown(PointerEventData eventData)
        {
            Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
        }
    
        private void AddPhysics2DRaycaster()
        {
            Physics2DRaycaster physicsRaycaster = FindObjectOfType<Physics2DRaycaster>();
            if (physicsRaycaster == null)
            {
                Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
            }
        }
    }
    
  3. Добавьте скрипт MyObject.cs к каждому объекту, который вы хотите обнаружить, щелкните по нему. После этого при нажатии на эти объекты их имя будет отображаться в консоли.

  4. Убедитесь, что в иерархии вашего проекта существует EventSystem . Если нет, добавьте его правой кнопкой мыши.

PS Сценарий MyObject.cs теперь имеет IPointerDownHandler . Это обнаруживает щелчок, как только вы касаетесь объектов. Вы также можете использовать IPointerUpHandler и IDragHandler для различных целей!

и извините за мой плохой Engli sh.

0 голосов
/ 13 марта 2020

Когда вы используете raycast, вы должны установить коллайдер на свой спрайт

private void Update()
{
   if (Input.GetMouseButtonDown(0))
   {
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction);

      if (hit.collider != null) {
         Debug.Log ("CLICKED " + hit.collider.name);
      }
   }
}

Это работает для меня в единстве 5.6

enter image description here

Примечание:"LeftClick" - это просто "GameObject", больше ничего, я назвал его так для лучшей идентификации:)


EDITED

Я тестирую этот метод для кнопки пользовательского интерфейса, но она не работает; поэтому я использовал другой подход. Для кнопки пользовательского интерфейса вы можете добавить слушателя так:

GameObject.Find ("YourButtonName").GetComponent<Button> ().onClick.AddListener (() => {

});
...