센로그

[Unity] Oculus VR raycast로 ui 버튼 클릭 및 하이라이트 본문

게임/Unity, C#

[Unity] Oculus VR raycast로 ui 버튼 클릭 및 하이라이트

seeyoun 2022. 12. 13. 16:00

raycast를 사용해 ui button을 클릭하도록 구현. (Highlight시 효과 포함)

ovr에서 제공하는 raycast 쓰려다가 .. 시간도 없고 잘 안돼서 그냥 만들어봤다

 

ovr에서 제공하는 raycast sample의 visual 을 훔쳐다가 붙였다

그리고 그 방향으로 ray 쏘게 함. 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class ray : MonoBehaviour
{
    public int rayLength = 10;

    public GameObject DEF;
    public GameObject SEL;

    public enum MyHand {left, right};
    public MyHand myhand;

    OVRInput.Button ovrBtn;
    GameObject button = null;
    
    //디버그용 매테리얼
    public Material DebugMat;

    private void Awake()
    {
        if (myhand == MyHand.left)
        {
            ovrBtn = OVRInput.Button.PrimaryHandTrigger;
        }
        else if (myhand == MyHand.right)
        {
            ovrBtn = OVRInput.Button.SecondaryHandTrigger;
        }
    }
    void Update()
    {
        RaycastHit hit;

        if (OVRInput.Get(ovrBtn))
        {
            DEF.SetActive(false);
            SEL.SetActive(true);
        }
        else
        {
            SEL.SetActive(false);
            DEF.SetActive(true);
        }

        if (Physics.Raycast(transform.position, transform.forward, out hit, rayLength))
        {
            
            //디버깅
            //Debug.Log(hit.point);

            //GameObject myLine = new GameObject();
            //myLine.transform.position = transform.position;
            //myLine.AddComponent<LineRenderer>();

            //LineRenderer lr = myLine.GetComponent<LineRenderer>();
            //lr.material = DebugMat;

            //lr.startWidth = 0.01f;
            //lr.endWidth = 0.01f;
            //lr.SetPosition(0, transform.position);
            //lr.SetPosition(1, hit.point);

            //GameObject.Destroy(myLine, 0.1f);

            if(hit.collider.gameObject.tag == "UI")
            {
                if (button == null)
                {
                    button = hit.collider.gameObject;
                    IPointerEnterHandler highlightEnterHandler = button.GetComponent<IPointerEnterHandler>();
                    PointerEventData pointerEnterEventData = new PointerEventData(EventSystem.current);
                    highlightEnterHandler.OnPointerEnter(pointerEnterEventData);
                    //Debug.Log(button);
                }
                if (OVRInput.GetDown(ovrBtn))
                {
                    IPointerClickHandler clickHandler = hit.collider.gameObject.GetComponent<IPointerClickHandler>();
                    PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
                    clickHandler.OnPointerClick(pointerEventData);
                }
            }
            else
            {
                if (button != null)
                {
                    Debug.Log(button);
                    IPointerExitHandler highlightExitHandler = button.GetComponent<IPointerExitHandler>();
                    PointerEventData pointerExitEventData = new PointerEventData(EventSystem.current);
                    highlightExitHandler.OnPointerExit(pointerExitEventData);
                    button = null;
                }
            }
        }
        else
        {
            if (button != null)
            {
                Debug.Log(button);
                IPointerExitHandler highlightExitHandler = button.GetComponent<IPointerExitHandler>();
                PointerEventData pointerExitEventData = new PointerEventData(EventSystem.current);
                highlightExitHandler.OnPointerExit(pointerExitEventData);
                button = null;
            }
        }
    }
}

급하게 하느라 tag썼지만

그냥 LayerMask 쓸걸 그랫음.

 

 

왼손이랑 오른손에다 갖다붙임

잘 된다.

 

 

 

 

 

웬만하면 그냥 만들어진 거 쓰자!

'게임 > Unity, C#' 카테고리의 다른 글

[Unity] Scriptable Object (스크립터블 오브젝트)  (0) 2023.06.30
[Unity] 유니티 라이프사이클  (0) 2023.06.30
[C#] Class vs Struct  (0) 2023.06.29
[C#] 프로퍼티(property) - get, set  (0) 2023.06.29
[Unity] Object Pool  (0) 2023.06.27
Comments