150 lines
5.4 KiB
C#
150 lines
5.4 KiB
C#
![]() |
#if UNITY_2019_4_OR_NEWER
|
|||
|
using System;
|
|||
|
using System.Linq;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEditor;
|
|||
|
using UnityEngine;
|
|||
|
using UnityEditor.UIElements;
|
|||
|
using UnityEngine.UIElements;
|
|||
|
using YooAsset.Editor;
|
|||
|
|
|||
|
public class ShaderVariantCollectorWindow : EditorWindow
|
|||
|
{
|
|||
|
[MenuItem("Tools/着色器变种收集器", false, 100)]
|
|||
|
public static void OpenWindow()
|
|||
|
{
|
|||
|
ShaderVariantCollectorWindow window = GetWindow<ShaderVariantCollectorWindow>("着色器变种收集工具", true);
|
|||
|
window.minSize = new Vector2(800, 600);
|
|||
|
}
|
|||
|
|
|||
|
private Button _collectButton;
|
|||
|
private TextField _collectOutputField;
|
|||
|
private Label _currentShaderCountField;
|
|||
|
private Label _currentVariantCountField;
|
|||
|
private SliderInt _processCapacitySlider;
|
|||
|
private PopupField<string> _packageField;
|
|||
|
|
|||
|
private List<string> _packageNames;
|
|||
|
private string _currentPackageName;
|
|||
|
|
|||
|
public void CreateGUI()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
VisualElement root = this.rootVisualElement;
|
|||
|
|
|||
|
// 加载布局文件
|
|||
|
var visualAsset = UxmlLoader.LoadWindowUXML<ShaderVariantCollectorWindow>();
|
|||
|
if (visualAsset == null)
|
|||
|
return;
|
|||
|
|
|||
|
visualAsset.CloneTree(root);
|
|||
|
|
|||
|
// 包裹名称列表
|
|||
|
_packageNames = GetBuildPackageNames();
|
|||
|
_currentPackageName = _packageNames[0];
|
|||
|
|
|||
|
// 文件输出目录
|
|||
|
_collectOutputField = root.Q<TextField>("CollectOutput");
|
|||
|
_collectOutputField.SetValueWithoutNotify(ShaderVariantCollectorSetting.GeFileSavePath(_currentPackageName));
|
|||
|
_collectOutputField.RegisterValueChangedCallback(evt =>
|
|||
|
{
|
|||
|
ShaderVariantCollectorSetting.SetFileSavePath(_currentPackageName, _collectOutputField.value);
|
|||
|
});
|
|||
|
|
|||
|
// 收集的包裹
|
|||
|
var packageContainer = root.Q("PackageContainer");
|
|||
|
if (_packageNames.Count > 0)
|
|||
|
{
|
|||
|
int defaultIndex = GetDefaultPackageIndex(_currentPackageName);
|
|||
|
_packageField = new PopupField<string>(_packageNames, defaultIndex);
|
|||
|
_packageField.label = "Package";
|
|||
|
_packageField.style.width = 350;
|
|||
|
_packageField.RegisterValueChangedCallback(evt =>
|
|||
|
{
|
|||
|
_currentPackageName = _packageField.value;
|
|||
|
});
|
|||
|
packageContainer.Add(_packageField);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_packageField = new PopupField<string>();
|
|||
|
_packageField.label = "Package";
|
|||
|
_packageField.style.width = 350;
|
|||
|
packageContainer.Add(_packageField);
|
|||
|
}
|
|||
|
|
|||
|
// 容器值
|
|||
|
_processCapacitySlider = root.Q<SliderInt>("ProcessCapacity");
|
|||
|
_processCapacitySlider.SetValueWithoutNotify(ShaderVariantCollectorSetting.GeProcessCapacity(_currentPackageName));
|
|||
|
#if !UNITY_2020_3_OR_NEWER
|
|||
|
_processCapacitySlider.label = $"Capacity ({_processCapacitySlider.value})";
|
|||
|
_processCapacitySlider.RegisterValueChangedCallback(evt =>
|
|||
|
{
|
|||
|
ShaderVariantCollectorSetting.SetProcessCapacity(_currentPackageName, _processCapacitySlider.value);
|
|||
|
_processCapacitySlider.label = $"Capacity ({_processCapacitySlider.value})";
|
|||
|
});
|
|||
|
#else
|
|||
|
_processCapacitySlider.RegisterValueChangedCallback(evt =>
|
|||
|
{
|
|||
|
ShaderVariantCollectorSetting.SetProcessCapacity(_currentPackageName, _processCapacitySlider.value);
|
|||
|
});
|
|||
|
#endif
|
|||
|
|
|||
|
_currentShaderCountField = root.Q<Label>("CurrentShaderCount");
|
|||
|
_currentVariantCountField = root.Q<Label>("CurrentVariantCount");
|
|||
|
|
|||
|
// 变种收集按钮
|
|||
|
_collectButton = root.Q<Button>("CollectButton");
|
|||
|
_collectButton.clicked += CollectButton_clicked;
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
Debug.LogError(e.ToString());
|
|||
|
}
|
|||
|
}
|
|||
|
private void Update()
|
|||
|
{
|
|||
|
if (_currentShaderCountField != null)
|
|||
|
{
|
|||
|
int currentShaderCount = ShaderVariantCollectionHelper.GetCurrentShaderVariantCollectionShaderCount();
|
|||
|
_currentShaderCountField.text = $"Current Shader Count : {currentShaderCount}";
|
|||
|
}
|
|||
|
|
|||
|
if (_currentVariantCountField != null)
|
|||
|
{
|
|||
|
int currentVariantCount = ShaderVariantCollectionHelper.GetCurrentShaderVariantCollectionVariantCount();
|
|||
|
_currentVariantCountField.text = $"Current Variant Count : {currentVariantCount}";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void CollectButton_clicked()
|
|||
|
{
|
|||
|
string savePath = ShaderVariantCollectorSetting.GeFileSavePath(_currentPackageName);
|
|||
|
int processCapacity = _processCapacitySlider.value;
|
|||
|
ShaderVariantCollector.Run(savePath, _currentPackageName, processCapacity, null);
|
|||
|
}
|
|||
|
|
|||
|
// 构建包裹相关
|
|||
|
private int GetDefaultPackageIndex(string packageName)
|
|||
|
{
|
|||
|
for (int index = 0; index < _packageNames.Count; index++)
|
|||
|
{
|
|||
|
if (_packageNames[index] == packageName)
|
|||
|
{
|
|||
|
return index;
|
|||
|
}
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
private List<string> GetBuildPackageNames()
|
|||
|
{
|
|||
|
List<string> result = new List<string>();
|
|||
|
foreach (var package in AssetBundleCollectorSettingData.Setting.Packages)
|
|||
|
{
|
|||
|
result.Add(package.PackageName);
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|