Unity: Определить нажатие на объект

Если разрабатывать проект под Андроид, то приходится взаимодействовать с объектами сцены. В случае с элементами интерфейса (например UI Button) уже всё встроено и мы легко можем обработать событие нажатия на кнопку с помощью заполнения поля OnClick() в Инспекторе:
Unity: Определить нажатие на объект
Однако для других объектов такого функционала нет. Придётся писать свои скрипты для отслеживания нажатия на экран устройства и определять, совпали ли эти координаты с координатами объекта.

1. Поместим на сцену объекты (у меня это цилиндр, куб и шар):
Unity: Определить нажатие на объект
2. К каждому из этих объектов добавим скрипт ObjectAction.cs:

ObjectAction.cs
using UnityEngine;

public class ObjectAction : MonoBehaviour
{
  private Color baseColor;

  private void Start()
  {
    baseColor = gameObject.GetComponent<Renderer>().material.color;
  }

  public void ChangeColor()
  {
    gameObject.GetComponent<Renderer>().material.SetColor("_Color", Color.yellow);
  }

  public void Reset()
  {
    gameObject.GetComponent<Renderer>().material.color = baseColor;
  }
}
В этом скрипте для данного примера нужен только метод ChangeColor(), остальные методы не нужны — я их использовал для кнопки Reset, а её я не рассматриваю в данной заметке.

 

3. На камеру добавим скрипт SelectObject.cs:

SelectObject.cs
using UnityEngine;

public class SelectObject : MonoBehaviour
{
  void Update()
  {
    if ((Input.touchCount > 0) && (Input.touches[0].phase == TouchPhase.Began))
    {
      Ray ray = Camera.main.ScreenPointToRay(Input.touches[0].position);
      RaycastHit hit;
      if (Physics.Raycast(ray, out hit))
      {
        if (hit.collider != null)
        {
          hit.collider.GetComponent<ObjectAction>().ChangeColor();
        }
      }
    }
  }
}

Нам нужно определить, было ли хоть одно касание (тач), поэтому мы используем такое условие:

(Input.touchCount > 0) 

Поскольку мы находимся в цикле метода Update, то нас интересует момент самого первого срабатывания, а не все возможные. Для этого мы ограничиваем условие:

(Input.touches[0].phase == TouchPhase.Began)

Далее создаётся «луч», который выходит из камеры и направлен на сцену в сторону координат прикосновения к экрану:

Ray ray = Camera.main.ScreenPointToRay(Input.touches[0].position);

Если этот луч «попадает» в объект с коллайдером, то мы меняем цвет объекта:

if (hit.collider != null)
{
  hit.collider.GetComponent<ObjectAction>().ChangeColor();
}

 

После запуска приложения на смартфоне можно будет поменять цвет каждого объекта, просто нажав на него:
Unity: Определить нажатие на объект



Подписаться
Уведомление о
guest
0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments