Files
Shopping_UnityVR/Assets/02_Scripts/Interact/ItemHoverHighlight.cs

55 lines
2.0 KiB
C#

using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
using UnityEngine.XR.Interaction.Toolkit.Interactables;
using HighlightPlus;
namespace VRShopping.Interact
{
/// <summary>
/// 호버 중이고 선택되지 않은 상태에서만 HighlightPlus 외곽선 표시.
/// </summary>
[RequireComponent(typeof(XRBaseInteractable))]
[RequireComponent(typeof(HighlightEffect))]
public class ItemHoverHighlight : MonoBehaviour
{
private HighlightEffect _highlight;
private XRBaseInteractable _interactable;
private void Awake()
{
_interactable = GetComponent<XRBaseInteractable>();
if (_highlight == null) _highlight = GetComponent<HighlightEffect>();
_highlight.highlighted = false;
}
private void OnEnable()
{
_interactable.hoverEntered.AddListener(OnHoverEntered);
_interactable.hoverExited.AddListener(OnHoverExited);
_interactable.selectEntered.AddListener(OnSelectEntered);
_interactable.selectExited.AddListener(OnSelectExited);
Refresh();
}
private void OnDisable()
{
_interactable.hoverEntered.RemoveListener(OnHoverEntered);
_interactable.hoverExited.RemoveListener(OnHoverExited);
_interactable.selectEntered.RemoveListener(OnSelectEntered);
_interactable.selectExited.RemoveListener(OnSelectExited);
_highlight.highlighted = false;
}
private void OnHoverEntered(HoverEnterEventArgs _) => Refresh();
private void OnHoverExited(HoverExitEventArgs _) => Refresh();
private void OnSelectEntered(SelectEnterEventArgs _) => Refresh();
private void OnSelectExited(SelectExitEventArgs _) => Refresh();
private void Refresh()
{
// 잡지 않은 상태로 호버 중일 때만 하이라이트
_highlight.highlighted = _interactable.isHovered && !_interactable.isSelected;
}
}
}