using TMPro; using System.Linq; using UnityEngine; using UnityEngine.Events; using System.Collections.Generic; using System; public class EversoulCharacterDropdown : MonoBehaviour { [SerializeField] private TMP_Dropdown MainDropdown; [SerializeField] private TMP_InputField MainLabel; public List DropdownLabels = new List() { "Character", "Costume" }; public List Dropdowns = new List(); public List Labels = new List(); private bool _awake; private void Awake() { if (_awake) return; _awake = true; Rebuild(); } private void Rebuild() { var labelParent = MainLabel.transform.parent; var dropdownParent = MainDropdown.transform.parent; MainDropdown.ClearOptions(); Dropdowns.Clear(); Dropdowns.Add(MainDropdown); foreach (var child in dropdownParent.GetComponentsInChildren()) { if (child != MainDropdown) Destroy(child); } foreach (var child in labelParent.GetComponentsInChildren()) { if (child != MainLabel) Destroy(child); } MainDropdown.name = DropdownLabels[0]; MainLabel.text = DropdownLabels[0]; foreach (var label in DropdownLabels.Skip(1)) { var dd = Instantiate(MainDropdown, dropdownParent); dd.name = "dropdown_" + label; var ll = Instantiate(MainLabel, labelParent); ll.name = label + " (TMP)"; ll.text = label; Dropdowns.Add(dd); } } public void SetData(List characters) { Awake(); SetDropdownData(0, characters.Select(c => c.Name).Distinct().ToList(), true, true); UnityAction groupCallback = (index) => { if (index == 0) return; var name = GetOption(0); SetDropdownData(1, characters.Where(c => c.Name == name).Select(c => c.Prefab).Distinct().ToList(), true, true); //SetDropdownData(2, new List(), true, true); }; UnityAction charaCallback = (index) => { if (index == 0) return; var name = GetOption(0); var prefab = GetOption(1); var costume = characters.First(c => c.Name == name && c.Prefab == prefab); EversoulModelBuilder.Instance.SpawnCharacter(costume); }; SetCallbacks(new List>() { groupCallback, charaCallback }); } public void SetCallbacks(List> callbacks) { if (callbacks.Count < Dropdowns.Count) { Error.Log(Color.red, $"Incorrect number of callbacks for dropdowns. Got {callbacks.Count}, required {Dropdowns.Count}"); } for (int i = 0; i < Dropdowns.Count; i++) { Dropdowns[i].onValueChanged.RemoveAllListeners(); Dropdowns[i].onValueChanged.AddListener(callbacks[i]); } } public void OnDropdownSelected(int selection) { if (selection == 0) { Debug.LogError("Delete Current"); } StartCoroutine(ModelBuilder.GetInstance().SpawnAssetCoroutine(AssetTypes.Character, MainDropdown.options[selection].text)); } public void SetDropdownData(string label, List options, bool nullValue = false, bool sortValues = false) { var depth = DropdownLabels.IndexOf(label); SetDropdownData(depth, options, nullValue, sortValues); } public string GetOption(int depth) { if (Dropdowns[depth].value == 0) return null; return Dropdowns[depth].options[Dropdowns[depth].value].text; } public void SetDropdownData(int depth, List options, bool nullValue = false, bool sortValues = false) { if (depth >= Dropdowns.Count || depth < 0) { Error.Log(Color.red, $"Dropdown {depth} out of range"); return; } ModelViewerInterface.SetDropdownData(Dropdowns[depth], options, nullValue, sortValues); } }