using System.Collections.Generic; using System.Linq; using Art.temp.Editor.PrefabTool; using artcfg.ArtDesign; using Framework; using UnityEditor; using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; namespace Art.temp.Editor.PlayerBrowser { public class PlayerBrowserWin : EditorWindow { private VisualElement infoPane; private VisualElement assetsPane1; private VisualElement assetsPane2; private List personList; [MenuItem("Tools/*角色工具/主角浏览器")] public static void ShowEditor() { var win = GetWindow("主角浏览器"); win.minSize = new Vector2(900, 400); } public void CreateGUI() { var toolbar = new Toolbar(); var refreshBtn = new ToolbarButton(LoadPersonData) { text = "刷新" }; toolbar.Add(refreshBtn); rootVisualElement.Add(toolbar); // 布局 var topView = new TwoPaneSplitView(0, 200, TwoPaneSplitViewOrientation.Horizontal); var listPane = new ListView(); var playerView = new TwoPaneSplitView(0, 300, TwoPaneSplitViewOrientation.Vertical); infoPane = new VisualElement(); var assetsView = new TwoPaneSplitView(0, 350, TwoPaneSplitViewOrientation.Horizontal); assetsPane1 = new VisualElement(); assetsPane2 = new VisualElement(); rootVisualElement.Add(topView); topView.Add(listPane); topView.Add(playerView); playerView.Add(infoPane); playerView.Add(assetsView); assetsView.Add(assetsPane1); assetsView.Add(assetsPane2); // 列表元素 LoadPersonData(); listPane.makeItem = () => new Label(); listPane.bindItem = (item, index) => { ((Label)item).text = $"{personList[index].NameId} {personList[index].Name}"; string model1Id = personList[index].NameId; string model2Id = GetModel2Id(model1Id); var player1 = CharacterFactory.CreatePlayer(model1Id); var player2 = CharacterFactory.CreatePlayer(model2Id); if (player1.AutoPrefab) { ((Label)item).style.color = Color.green; } else { if ( player1.Skill && (player1.Model ? player1.Model.transform.Find("Root") : null) && (player2.Model ? player2.Model.transform.Find("Root") : null) ) { ((Label)item).style.color = Color.yellow; } else { ((Label)item).style.color = Color.white; } } }; listPane.itemsSource = personList; listPane.selectionChanged += OnIDSelectionChange; } private void LoadPersonData() { ArtTableManager.instance.ForceReload(); personList = ArtTableManager.instance.tables.PersonConfig.DataList.Where(a => a.NameId.StartsWith("A")) .ToList(); } private static string GetModel2Id(string nameId) { char[] chars = nameId.ToCharArray(); chars[nameId.Length - 4] = '1'; return new string(chars); } private void OnIDSelectionChange(IEnumerable selectedItems) { infoPane.Clear(); assetsPane1.Clear(); assetsPane2.Clear(); if (selectedItems.First() is not DataPerson selectedPerson) return; string nameId = selectedPerson.NameId; CreateInfoView(infoPane, nameId); CreateAssetView(assetsPane1, nameId); CreateAssetView(assetsPane2, GetModel2Id(nameId)); } private void CreateInfoView(VisualElement pane, string nameId) { DataPerson person = personList.Find(x => x.NameId == nameId); if (person == null) return; pane.Add(new TextField("名字") { value = person.Name }); pane.Add(new TextField("武器名") { value = person.WeaponName }); pane.Add(new TextField("武器Id") { value = person.WeaponId }); pane.Add(new TextField("武器组") { value = person.GroupName }); pane.Add(new Label("表情设定")); pane.Add(new TextField("brow") { value = person.BowsType.ToString() }); pane.Add(new TextField("eye") { value = person.EyesType.ToString() }); pane.Add(new TextField("mouth") { value = person.MouseType.ToString() }); pane.Add(new TextField("brow color") { value = person.BowsColor }); pane.Add(new TextField("eye color") { value = person.EyesColor }); int faceId = (person.BowsType - 1) * 5 + person.EyesType; pane.Add(new TextField("DefaultEmojiImgId") { value = faceId > 0 ? faceId.ToString() : string.Empty }); } private static void CreateAssetView(VisualElement pane, string modelId) { CharacterAssetInfo player = CharacterFactory.CreatePlayer(modelId); pane.Add(new Label("资源完成度")); pane.Add(new ObjectField("模型") { value = player.Model }); pane.Add(new ObjectField("蒙皮") { value = player.Model ? player.Model.transform.Find("Root") : null }); pane.Add(new ObjectField("技能") { value = player.Skill }); pane.Add(new ObjectField("Display Prefab") { value = player.DisplayPrefab }); pane.Add(new ObjectField("Auto Prefab") { value = player.AutoPrefab }); } } }