using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.UIElements; namespace Unity.Cinemachine.Samples { /// /// Runtime UI script that can create toggles and buttons. /// [RequireComponent(typeof(UIDocument))] public class SamplesDynamicUI : MonoBehaviour { [Serializable] public class Item { [Tooltip("Text displayed on button")] public string Name = "Text"; [Serializable] public class ToggleSettings { public bool Enabled; [Tooltip("Initial value of the toggle")] public bool Value; [Tooltip("Event sent when toggle button is clicked")] public UnityEvent OnValueChanged = new(); } [Tooltip("Set this to true to create a toggle button")] [FoldoutWithEnabledButton] public ToggleSettings IsToggle = new(); [Tooltip("Event sent when button is clicked")] public UnityEvent OnClick = new(); } [Tooltip("The buttons to be displayed")] public List Buttons = new(); VisualElement m_Root; readonly List m_DynamicElements = new (); void OnEnable() { var uiDocument = GetComponent(); m_Root = uiDocument.rootVisualElement.Q("TogglesAndButtons"); // Should be justified - flex grow 1 if (m_Root == null) { Debug.LogError("Cannot find TogglesAndButtons. Is the source asset set in the UIDocument?"); return; } for (int i = 0; i < Buttons.Count; ++i) { var item = Buttons[i]; if (item.IsToggle.Enabled) { var toggle = new Toggle { label = item.Name, value = item.IsToggle.Value, focusable = false, }; toggle.AddToClassList("dynamicToggle"); toggle.RegisterValueChangedCallback(e => item.IsToggle.OnValueChanged.Invoke(e.newValue)); m_Root.Add(toggle); m_DynamicElements.Add(toggle); } else { var button = new Button { text = item.Name, focusable = false }; button.AddToClassList("dynamicButton"); button.clickable.clicked += item.OnClick.Invoke; m_Root.Add(button); m_DynamicElements.Add(button); } } m_Root.visible = Buttons.Count > 0; } void OnDisable() { for (int i = 0; i < m_DynamicElements.Count; ++i) m_Root.Remove(m_DynamicElements[i]); m_DynamicElements.Clear(); } } }