using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class DebugUIBuilder : MonoBehaviour { public delegate void OnClick(); public delegate void OnToggleValueChange(Toggle t); public delegate void OnSlider(float f); public delegate bool ActiveUpdate(); public const int DEBUG_PANE_CENTER = 0; public const int DEBUG_PANE_RIGHT = 1; public const int DEBUG_PANE_LEFT = 2; [SerializeField] private RectTransform buttonPrefab; [SerializeField] private RectTransform labelPrefab; [SerializeField] private RectTransform sliderPrefab; [SerializeField] private RectTransform dividerPrefab; [SerializeField] private RectTransform togglePrefab; [SerializeField] private RectTransform radioPrefab; [SerializeField] private GameObject uiHelpersToInstantiate; [SerializeField] private Transform[] targetContentPanels; [SerializeField] private bool manuallyResizeContentPanels; private bool[] reEnable; [SerializeField] private List toEnable; [SerializeField] private List toDisable; public static DebugUIBuilder instance; private const float elementSpacing = 16f; private const float marginH = 16f; private const float marginV = 16f; private Vector2[] insertPositions; private List[] insertedElements; private Vector3 menuOffset; private OVRCameraRig rig; private Dictionary radioGroups = new Dictionary(); private LaserPointer lp; private LineRenderer lr; public LaserPointer.LaserBeamBehavior laserBeamBehavior; public void Awake() { instance = this; menuOffset = base.transform.position; base.gameObject.SetActive(false); rig = Object.FindObjectOfType(); for (int i = 0; i < toEnable.Count; i++) { toEnable[i].SetActive(false); } insertPositions = new Vector2[targetContentPanels.Length]; for (int j = 0; j < insertPositions.Length; j++) { insertPositions[j].x = 16f; insertPositions[j].y = -16f; } insertedElements = new List[targetContentPanels.Length]; for (int k = 0; k < insertedElements.Length; k++) { insertedElements[k] = new List(); } if ((bool)uiHelpersToInstantiate) { Object.Instantiate(uiHelpersToInstantiate); } lp = Object.FindObjectOfType(); if (!lp) { Debug.LogError("Debug UI requires use of a LaserPointer and will not function without it. Add one to your scene, or assign the UIHelpers prefab to the DebugUIBuilder in the inspector."); return; } lp.laserBeamBehavior = laserBeamBehavior; if (!toEnable.Contains(lp.gameObject)) { toEnable.Add(lp.gameObject); } GetComponent().pointer = lp.gameObject; lp.gameObject.SetActive(false); } public void Show() { Relayout(); base.gameObject.SetActive(true); base.transform.position = rig.transform.TransformPoint(menuOffset); Vector3 eulerAngles = rig.transform.rotation.eulerAngles; eulerAngles.x = 0f; eulerAngles.z = 0f; base.transform.eulerAngles = eulerAngles; if (reEnable == null || reEnable.Length < toDisable.Count) { reEnable = new bool[toDisable.Count]; } reEnable.Initialize(); int count = toDisable.Count; for (int i = 0; i < count; i++) { if ((bool)toDisable[i]) { reEnable[i] = toDisable[i].activeSelf; toDisable[i].SetActive(false); } } count = toEnable.Count; for (int j = 0; j < count; j++) { toEnable[j].SetActive(true); } int num = targetContentPanels.Length; for (int k = 0; k < num; k++) { targetContentPanels[k].gameObject.SetActive(insertedElements[k].Count > 0); } } public void Hide() { base.gameObject.SetActive(false); for (int i = 0; i < reEnable.Length; i++) { if ((bool)toDisable[i] && reEnable[i]) { toDisable[i].SetActive(true); } } int count = toEnable.Count; for (int j = 0; j < count; j++) { toEnable[j].SetActive(false); } } private void Relayout() { for (int i = 0; i < targetContentPanels.Length; i++) { RectTransform component = targetContentPanels[i].GetComponent(); List list = insertedElements[i]; int count = list.Count; float x = 16f; float num = -16f; float num2 = 0f; for (int j = 0; j < count; j++) { RectTransform rectTransform = list[j]; rectTransform.anchoredPosition = new Vector2(x, num); num -= rectTransform.rect.height + 16f; num2 = Mathf.Max(rectTransform.rect.width + 32f, num2); } component.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, num2); component.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 0f - num + 16f); } } private void AddRect(RectTransform r, int targetCanvas) { if (targetCanvas > targetContentPanels.Length) { Debug.LogError("Attempted to add debug panel to canvas " + targetCanvas + ", but only " + targetContentPanels.Length + " panels were provided. Fix in the inspector or pass a lower value for target canvas."); } else { r.transform.SetParent(targetContentPanels[targetCanvas], false); insertedElements[targetCanvas].Add(r); if (base.gameObject.activeInHierarchy) { Relayout(); } } } public RectTransform AddButton(string label, OnClick handler, int targetCanvas = 0) { RectTransform component = Object.Instantiate(buttonPrefab).GetComponent(); Button componentInChildren = component.GetComponentInChildren