using TMPro; using UnityEditor; using UnityEngine; using UnityEngine.Serialization; using UnityEngine.UI; namespace VRUIP { public class Element : A_UIIntercations { [SerializeField] private RectTransform rectTransform; [SerializeField] private AudioClip hoverSound; [SerializeField] private AudioClip clickSound; [SerializeField] private bool hasOverlay; [SerializeField] private bool hasBanner; [SerializeField] private Image image; [SerializeField] private Image overlay; [SerializeField] private TextMeshProUGUI bannerTitle; private AudioSource _audioSource; protected bool initialized; protected Camera mainCamera; // Colors private readonly Color clickColor = new Color(0, 0, 0, 200/255f); private readonly Color hoverColor = new Color(1, 1, 1, 30/255f); public Vector2 Size { get { var rect = rectTransform.rect; var scale = rectTransform.localScale; return new Vector2(rect.width * scale.x, rect.height * scale.y); } } protected override void Start() { base.Start(); if (!initialized) Initialize(); } /// /// Create a copy of this element. /// public Element CreateElement(Vector3 position, Transform parent) { var clone = Instantiate(this, parent); clone.transform.localPosition = position; clone.Initialize(); return clone; } /// /// Create an element from an ElementInfo. /// /// /// /// public void CreateElementFromInfo(Collection.ElementInfo info, Vector3 position, Transform parent) { var element = CreateElement(position, parent); element.SetInfo(info); } #if UNITY_EDITOR /// /// Create a copy of this element in the editor. /// /// /// public Element CreateElementEditor(Vector3 position, Transform parent) { var clone = PrefabUtility.InstantiatePrefab(gameObject, parent) as GameObject; if (clone == null) throw new System.Exception("Could not instantiate element."); clone.transform.localPosition = position; return clone.GetComponent(); } /// /// Create an element from an ElementInfo. /// /// /// /// public void CreateElementFromInfoEditor(Collection.ElementInfo info, Vector3 position, Transform parent) { var element = CreateElementEditor(position, parent); element.SetInfo(info); } #endif /// /// Initialize this Element with the correct info or properties. /// protected virtual void Initialize() { // Do the initialization here. initialized = true; _audioSource = VRUIPManager.instance.AudioSource; mainCamera = VRUIPManager.instance.mainCamera; RegisterOnEnter(() => _audioSource.PlayOneShot(hoverSound, 0.5f)); RegisterOnClicked(() => _audioSource.PlayOneShot(clickSound)); // If has an overlay, register the events. if (hasOverlay) { RegisterOnEnter(() => overlay.gameObject.SetActive(true)); RegisterOnExit(() => overlay.gameObject.SetActive(false)); RegisterOnDown(() => overlay.color = clickColor); RegisterOnUp(() => overlay.color = hoverColor); } } protected override void SetColors(ColorTheme theme) { // Nothing needed here. } private void SetInfo(Collection.ElementInfo info) { if (hasBanner) bannerTitle.text = info.title; image.sprite = info.sprite; } } }