센로그
[Unity] Oculus VR raycast로 ui 버튼 클릭 및 하이라이트 본문
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