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

Създадох 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 - Взаимодействия. Не е необходимо да използвате VR, за да го използвате – просто използвайте резервния SDK.

За повече подробности как работи това, може да ви насоча към статията от Oculus: Unity Sample Framework (малко остаряла).

person Krzysztof Bociurko    schedule 21.05.2018