Тач по спрайту (Unity 2D)

Рейтинг: 0Ответов: 1Опубликовано: 22.04.2015

Есть персонаж (спрайт) и кнопка-стрелка (спрайт) на сцене. Нужно по тачу переместить персонажа. Как это можно реализовать?

Ray ray = camera.ScreenPointToRay(touch.position);
Raycast2D hit = Raycast.Physics(ray.origin, ray.direction);
if(hit){ тач по картинке }

Правильно ли это?

Ответы

▲ 3

Нет, это неправильно. 2d физика почти всегда (и именно так это в Unity) обрабатывает только столкновения в 2d плоскости, то есть в XY. Соответственно, луч "из камеры" идет в плоскости Z и никогда не столкнется со спрайтом. Чтобы все работало, нужно повесить на спрайт трехмерный коллайдер и кастовать трехмерный луч.

Но, если кнопка - это именно кнопка, и нажать нужно именно на нее, то проще и лучше будет использовать встроенный UI (тот, который называют uGUI или new UI). Там есть уже готовая кнопка, нажатие на которую будет обрабатываться автоматически и ничего кастовать не нужно. Для этого надо создать GameObject->UI->Button, указать ей в качестве Source Image Вашу текстуру. Дальше на компоненте Button (Script) добавить действие на событие OnClick() (плюс в самом низу). Там нужно будет выбрать объект, а затем компонент, висящий на объекте и его метод или свойство для вызова. Для того, чтобы суметь вызвать метод собственноручно написанного скрипта, метод должен быть публичным и, если я правильно помню, он должен иметь не более одного параметра (можно без).

Update
Из кода подписаться на событие нажатия можно так:

using UnityEngine;
using UnityEngine.UI;

public class ButtonPress : MonoBehaviour {
    public Button Button;

    void OnEnable () {
        Button.onClick.AddListener(ClickHandler);
    }

    void OnDisable () {
        Button.onClick.RemoveListener(ClickHandler);
    }

    void ClickHandler() {
        Debug.Log ("Clicked");
    }
}

Update 2
Варианты, как отловить удержание кнопки:

Вариант 1: повесить на кнопку компонент EventTrigger. Добавить на него события OnPointerDown и OnPointerUp, повесить на них вызовы публичных методов скрипта (может висеть на любом объекте), в которых ставить булевое поле класса в false или true. И это поле проверять, например, в Update. Скрипт будет выглядеть примерно так:

using UnityEngine;

public class ButtonHold : MonoBehaviour
{
    bool pressed;

    public void PointerDown()
    {
        pressed = true;
    }

    public void PointerUp()
    {
        pressed = false;
    }

    void Update()
    {
        if (!pressed)
            return;

        Debug.Log("Pressed");
    }
}

Вариант 2: сделать скрипт, обрабатывающий эти события автоматически. Скрипт нужно вешать на кнопку.

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class ButtonHold : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    bool pressed;

    public void OnPointerDown(PointerEventData eventData)
    {
        pressed = true;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        pressed = false;
    }

    void Update()
    {
        if (!pressed)
            return;

        Debug.Log("Pressed");
    }
}