Как Raycast может взаимодействовать с элементами пользовательского интерфейса Unity Canvas?

Я создал Raycast, который снимает с объекта (не с основной камеры), и я хочу, чтобы он попадал в элементы пользовательского интерфейса. Пример ниже. Пример

Пользовательский интерфейс обведен оранжевым, большая серая плоскость — это тестовый объект, красная голова помещается на голову пользователя, а зеленый — это DrawRay моего raycast, прикрепленного к глазу. Я пытаюсь сделать так, чтобы пользователь смотрел на кнопку пользовательского интерфейса, и raycast мог нажать эту кнопку.

Я играл с Graphic Raycast, но ничего не работает. Серый самолет все еще подвергается воздействию лучей. Я пробовал играть с OnPointerEnter, но дело в том, что мой raycast не является касанием мыши/пальца, а является вторым указателем. Любые идеи, как заставить его работать либо с isPointerOverGameObject, либо с Graphic Raycaster, либо с любым другим методом?? Или как создать второй указатель, который будет рейкастом глаза? Текущий код ниже.

private void FixedUpdate()
{
    GraphicRaycaster gr = this.GetComponent<GraphicRaycaster>();

    PointerEventData pointerData = new PointerEventData(EventSystem.current);

    pointerData.position = Input.mousePosition;

    List<RaycastResult> results = new List<RaycastResult>();
    gr.Raycast(pointerData, results);
    //EventSystem.current.RaycastAll(pointerData, results);
    if (results.Count > 0)
    {
        if (results[0].gameObject.tag == "Test tag")
        {
            Debug.Log("test");
        }
    }




    //----- Failed Graphic raycast experiments above; working RaycastHit below --------


    RaycastHit hit;


        Debug.DrawRay(transform.position, transform.forward * -10000f, Color.green);

        if (Physics.Raycast(transform.position, transform.forward * -1, out hit))
        {

            Debug.Log(hit.transform.name);
        }



}

person Denis Kulikov    schedule 21.05.2018    source источник
comment
Я поиграюсь с этим завтра, но есть несколько вещей, которые нужно попробовать: 1) использовать Update вместо FixedUpdate 2) обернуть его if (Input.GetKey(KeyCode.Mouse0)) проверкой. Оба они находятся в примере документации, и я не уверен насколько это важно.   -  person Draco18s no longer trusts SE    schedule 21.05.2018


Ответы (1)


На самом деле это намного сложнее, если вы хотите правильно взаимодействовать с элементами холста.

Предлагаю не пытаться выкатывать решение самостоятельно, а посмотреть некоторые уже сделанные решения. У большинства наборов инструментов VR есть свои собственные реализации, вы можете изучить пример сцены 007 VRTK — Взаимодействие. Вам не нужно использовать виртуальную реальность, чтобы использовать его — просто используйте запасной SDK.

Для получения более подробной информации о том, как это работает, я мог бы указать вам на статью от Oculus: Пример платформы Unity (немного устарел).

person Krzysztof Bociurko    schedule 21.05.2018