Как получить указатель вниз и вверх события для камеры? - PullRequest
0 голосов
/ 15 апреля 2019

Мне нужно, чтобы, когда пользователь касается любой точки экрана, камера получает указатель вниз | вверх событий. Я пытался прикрепить BoxCollider2D к камере со скриптом:

public class PlayerController : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    public void OnPointerUp(PointerEventData eventData)
    {
        // Some logic
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        // Some logic
    }
}

но это не работает.

Как это сделать?

P.S. Мне все равно, нажмет ли он на GameObject или нет, это не имеет значения, самое главное, что пользователь нажал на экран. НО мне нужно игнорировать щелчки на элементах пользовательского интерфейса.
P.P.S Я использую Unity3D 2018.3.12f1 .

1 Ответ

0 голосов
/ 15 апреля 2019

Короче говоря, я не уверен, является ли это оптимальным решением или нет, но используя некоторые другие темы и совет Пьера Барета, я придумал этот сценарий:

[RequireComponent(typeof(CatController))]
public class PlayerController : MonoBehaviour
{
    public float delay = 0.25f;

    private CatController _cat;
    private short _clicked = 0;
    private float _pressingTime = 0f;
    private bool _isPressed = false;

    private void Awake()
    {
        _cat = GetComponent<CatController>();
    }

    private void Update()
    {
        if (_pressingTime > 0)
        {
            _pressingTime -= Time.deltaTime;
        }

        if (Input.GetMouseButtonDown(0))
        {
            if (!IsOverUI())
            {
                OnPointerPressedDown();
            }
        }
        else if (Input.GetMouseButtonUp(0))
        {
            _isPressed = false;
            OnPointerPressedUp();
        }
        else if (_isPressed && _pressingTime <= 0)
        {
            OnPointerPressing();
        }
    }

    private void OnPointerPressedDown()
    {
        _isPressed = true;

        if (_clicked == 1)
        {
            if (_pressingTime > 0f)
            {
                OnDoubleClick();
                _clicked = 0;
            }
            else
            {
                _pressingTime = delay;
            }
        }
        else
        {
            _clicked = 1;
            _pressingTime = delay;
        }
    }

    private void OnPointerPressedUp()
    {
        _cat.Stop();
    }

    private void OnDoubleClick()
    {
        _cat.Jump();
    }

    private void OnPointerPressing()
    {
        var clickPos = Camera.main.ScreenToViewportPoint(Input.mousePosition);
        var direction = clickPos.x < 0.5 ? CatController.Direction.Left : CatController.Direction.Right;
        _cat.Walk(direction);
    }

    private static bool IsOverUI()
    {
        var pointerData = new PointerEventData(EventSystem.current)
        {
            position = Input.mousePosition
        };
        var results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(pointerData, results);

        if (results.Count > 0)
        {
            for (int i = 0; i < results.Count; i++)
            {
                if (results[i].gameObject.GetComponent<CanvasRenderer>())
                {
                    return true;
                }
            }
        }

        return false;
    }
}

Может быть, кто-то будет искать тот же контроллер.

...