NLDClient-yudde/ProjectNLD/Assets/Art/temp/Editor/PlayerBrowser/PlayerBrowserWin.cs

149 lines
5.8 KiB
C#

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<DataPerson> personList;
[MenuItem("Tools/*角色工具/主角浏览器")]
public static void ShowEditor()
{
var win = GetWindow<PlayerBrowserWin>("主角浏览器");
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<object> 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 });
}
}
}