Files
2026-02-21 16:45:37 +08:00

330 lines
8.6 KiB
C#

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<GameObject> toEnable;
[SerializeField]
private List<GameObject> 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<RectTransform>[] insertedElements;
private Vector3 menuOffset;
private OVRCameraRig rig;
private Dictionary<string, ToggleGroup> radioGroups = new Dictionary<string, ToggleGroup>();
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<OVRCameraRig>();
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<RectTransform>[targetContentPanels.Length];
for (int k = 0; k < insertedElements.Length; k++)
{
insertedElements[k] = new List<RectTransform>();
}
if ((bool)uiHelpersToInstantiate)
{
Object.Instantiate(uiHelpersToInstantiate);
}
lp = Object.FindObjectOfType<LaserPointer>();
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<OVRRaycaster>().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<RectTransform>();
List<RectTransform> 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<RectTransform>();
Button componentInChildren = component.GetComponentInChildren<Button>();
componentInChildren.onClick.AddListener(delegate
{
handler();
});
((Text)component.GetComponentsInChildren(typeof(Text), true)[0]).text = label;
AddRect(component, targetCanvas);
return component;
}
public RectTransform AddLabel(string label, int targetCanvas = 0)
{
RectTransform component = Object.Instantiate(labelPrefab).GetComponent<RectTransform>();
component.GetComponent<Text>().text = label;
AddRect(component, targetCanvas);
return component;
}
public RectTransform AddSlider(string label, float min, float max, OnSlider onValueChanged, bool wholeNumbersOnly = false, int targetCanvas = 0)
{
RectTransform rectTransform = Object.Instantiate(sliderPrefab);
Slider componentInChildren = rectTransform.GetComponentInChildren<Slider>();
componentInChildren.minValue = min;
componentInChildren.maxValue = max;
componentInChildren.onValueChanged.AddListener(delegate(float f)
{
onValueChanged(f);
});
componentInChildren.wholeNumbers = wholeNumbersOnly;
AddRect(rectTransform, targetCanvas);
return rectTransform;
}
public RectTransform AddDivider(int targetCanvas = 0)
{
RectTransform rectTransform = Object.Instantiate(dividerPrefab);
AddRect(rectTransform, targetCanvas);
return rectTransform;
}
public RectTransform AddToggle(string label, OnToggleValueChange onValueChanged, int targetCanvas = 0)
{
RectTransform rectTransform = Object.Instantiate(togglePrefab);
AddRect(rectTransform, targetCanvas);
Text componentInChildren = rectTransform.GetComponentInChildren<Text>();
componentInChildren.text = label;
Toggle t = rectTransform.GetComponentInChildren<Toggle>();
t.onValueChanged.AddListener(delegate
{
onValueChanged(t);
});
return rectTransform;
}
public RectTransform AddToggle(string label, OnToggleValueChange onValueChanged, bool defaultValue, int targetCanvas = 0)
{
RectTransform rectTransform = Object.Instantiate(togglePrefab);
AddRect(rectTransform, targetCanvas);
Text componentInChildren = rectTransform.GetComponentInChildren<Text>();
componentInChildren.text = label;
Toggle t = rectTransform.GetComponentInChildren<Toggle>();
t.isOn = defaultValue;
t.onValueChanged.AddListener(delegate
{
onValueChanged(t);
});
return rectTransform;
}
public RectTransform AddRadio(string label, string group, OnToggleValueChange handler, int targetCanvas = 0)
{
RectTransform rectTransform = Object.Instantiate(radioPrefab);
AddRect(rectTransform, targetCanvas);
Text componentInChildren = rectTransform.GetComponentInChildren<Text>();
componentInChildren.text = label;
Toggle tb = rectTransform.GetComponentInChildren<Toggle>();
if (group == null)
{
group = "default";
}
ToggleGroup toggleGroup = null;
bool isOn = false;
if (!radioGroups.ContainsKey(group))
{
toggleGroup = tb.gameObject.AddComponent<ToggleGroup>();
radioGroups[group] = toggleGroup;
isOn = true;
}
else
{
toggleGroup = radioGroups[group];
}
tb.group = toggleGroup;
tb.isOn = isOn;
tb.onValueChanged.AddListener(delegate
{
handler(tb);
});
return rectTransform;
}
public void ToggleLaserPointer(bool isOn)
{
if ((bool)lp)
{
if (isOn)
{
lp.enabled = true;
}
else
{
lp.enabled = false;
}
}
}
}