【m】框架优化
This commit is contained in:
367
Assets/00.StaryEvo/Editor/Tools/PlayerPrefsWindow.cs
Normal file
367
Assets/00.StaryEvo/Editor/Tools/PlayerPrefsWindow.cs
Normal file
@@ -0,0 +1,367 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Stary.Evo.Editor
|
||||
{
|
||||
/// <summary>
|
||||
/// PlayerPrefs和CustomEditorPrefs的管理窗口
|
||||
/// </summary>
|
||||
public class PlayerPrefsWindow : EditorWindow
|
||||
{
|
||||
private Vector2 _scrollPosition;
|
||||
private string _searchFilter = "";
|
||||
private Dictionary<string, object> _dataCache;
|
||||
private bool _isAutoSave = true;
|
||||
private string _lastSaveTime = "";
|
||||
|
||||
// 添加新键值对的相关字段
|
||||
private string _newKey = "";
|
||||
private string _newStringValue = "";
|
||||
private int _newIntValue = 0;
|
||||
private float _newFloatValue = 0f;
|
||||
private bool _newBoolValue = false;
|
||||
|
||||
private enum ValueType
|
||||
{
|
||||
String,
|
||||
Int,
|
||||
Float,
|
||||
Bool
|
||||
}
|
||||
|
||||
private ValueType _selectedValueType = ValueType.String;
|
||||
|
||||
// 数据存储类型
|
||||
private enum PrefsType
|
||||
{
|
||||
CustomEditorPrefs,
|
||||
CustomPlayerPrefs
|
||||
}
|
||||
|
||||
private PrefsType _selectedPrefsType = PrefsType.CustomEditorPrefs;
|
||||
|
||||
[MenuItem("Evo/Utility/PlayerPrefs")]
|
||||
public static void ShowWindow()
|
||||
{
|
||||
var window = GetWindow<PlayerPrefsWindow>("PlayerPrefs Manager");
|
||||
window.minSize = new Vector2(700, 500);
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
RefreshData();
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
// 顶部工具栏
|
||||
GUILayout.BeginHorizontal(EditorStyles.toolbar);
|
||||
|
||||
// 数据类型选择 - 保存当前值以便检查是否有变化
|
||||
var oldPrefsType = _selectedPrefsType;
|
||||
_selectedPrefsType =
|
||||
(PrefsType)EditorGUILayout.EnumPopup(_selectedPrefsType, EditorStyles.toolbarPopup,
|
||||
GUILayout.Width(150));
|
||||
|
||||
// 当_selectedPrefsType被修改时,刷新数据
|
||||
if (_selectedPrefsType != oldPrefsType)
|
||||
{
|
||||
RefreshData();
|
||||
}
|
||||
|
||||
// 搜索框
|
||||
_searchFilter = EditorGUILayout.TextField(_searchFilter, EditorStyles.toolbarSearchField);
|
||||
|
||||
// 自动保存选项
|
||||
_isAutoSave = GUILayout.Toggle(_isAutoSave, "自动保存", EditorStyles.toolbarButton);
|
||||
|
||||
// 刷新按钮
|
||||
if (GUILayout.Button("刷新", EditorStyles.toolbarButton))
|
||||
{
|
||||
RefreshData();
|
||||
}
|
||||
|
||||
if (!_isAutoSave)
|
||||
{
|
||||
// 手动保存按钮
|
||||
if (GUILayout.Button("保存", EditorStyles.toolbarButton))
|
||||
{
|
||||
SaveDataManually();
|
||||
}
|
||||
}
|
||||
|
||||
// 清除所有按钮
|
||||
if (GUILayout.Button("清除所有", EditorStyles.toolbarButton, GUILayout.Width(80)))
|
||||
{
|
||||
if (EditorUtility.DisplayDialog("确认清除", $"确定要清除所有{_selectedPrefsType}数据吗?", "清除", "取消"))
|
||||
{
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
CustomEditorPrefs.DeleteAll();
|
||||
else
|
||||
CustomPlayerPrefs.DeleteAll();
|
||||
|
||||
RefreshData();
|
||||
_lastSaveTime = $"最后保存: {DateTime.Now.ToString("HH:mm:ss")}";
|
||||
}
|
||||
}
|
||||
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
// 保存状态提示
|
||||
if (!string.IsNullOrEmpty(_lastSaveTime))
|
||||
{
|
||||
GUILayout.Label(_lastSaveTime, EditorStyles.miniLabel);
|
||||
}
|
||||
|
||||
// 添加新键值对区域
|
||||
GUILayout.BeginVertical(EditorStyles.helpBox);
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
_selectedValueType = (ValueType)EditorGUILayout.EnumPopup(_selectedValueType);
|
||||
GUILayout.Space(20);
|
||||
_newKey = EditorGUILayout.TextField("键:", _newKey);
|
||||
GUILayout.Space(20);
|
||||
// 根据选择的类型显示不同的输入框
|
||||
switch (_selectedValueType)
|
||||
{
|
||||
case ValueType.String:
|
||||
_newStringValue = EditorGUILayout.TextField("值:", _newStringValue);
|
||||
break;
|
||||
case ValueType.Int:
|
||||
_newIntValue = EditorGUILayout.IntField("值:", _newIntValue);
|
||||
break;
|
||||
case ValueType.Float:
|
||||
_newFloatValue = EditorGUILayout.FloatField("值:", _newFloatValue);
|
||||
break;
|
||||
case ValueType.Bool:
|
||||
_newBoolValue = EditorGUILayout.Toggle("值:", _newBoolValue);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (GUILayout.Button("添加", GUILayout.Width(80)))
|
||||
{
|
||||
AddNewKeyValuePair();
|
||||
}
|
||||
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// 内容区域
|
||||
_scrollPosition = GUILayout.BeginScrollView(_scrollPosition);
|
||||
|
||||
// 绘制数据
|
||||
DrawData();
|
||||
|
||||
GUILayout.EndScrollView();
|
||||
}
|
||||
|
||||
private void RefreshData()
|
||||
{
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
_dataCache = CustomEditorPrefs.GetAll();
|
||||
else
|
||||
_dataCache = CustomPlayerPrefs.GetAll();
|
||||
|
||||
Repaint();
|
||||
}
|
||||
|
||||
private void DrawData()
|
||||
{
|
||||
var filteredData = string.IsNullOrEmpty(_searchFilter)
|
||||
? _dataCache
|
||||
: _dataCache.Where(kvp => kvp.Key.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase))
|
||||
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
|
||||
|
||||
foreach (var kvp in filteredData)
|
||||
{
|
||||
GUILayout.BeginHorizontal("box");
|
||||
|
||||
// 键名
|
||||
GUILayout.Label(kvp.Key, GUILayout.Width(200));
|
||||
|
||||
// 值类型和编辑
|
||||
var key = kvp.Key;
|
||||
var value = kvp.Value;
|
||||
|
||||
if (value is string stringValue)
|
||||
{
|
||||
GUILayout.Label("String", GUILayout.Width(80));
|
||||
var newValue = EditorGUILayout.TextField(stringValue);
|
||||
if (newValue != stringValue)
|
||||
{
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
CustomEditorPrefs.SetString(key, newValue);
|
||||
else
|
||||
CustomPlayerPrefs.SetString(key, newValue);
|
||||
|
||||
if (_isAutoSave)
|
||||
{
|
||||
_lastSaveTime = $"最后保存: {DateTime.Now.ToString("HH:mm:ss")}";
|
||||
}
|
||||
|
||||
RefreshData();
|
||||
}
|
||||
}
|
||||
else if (value is float floatValue)
|
||||
{
|
||||
GUILayout.Label("Float", GUILayout.Width(80));
|
||||
var newValue = EditorGUILayout.FloatField(floatValue);
|
||||
if (newValue != floatValue)
|
||||
{
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
CustomEditorPrefs.SetFloat(key, newValue);
|
||||
else
|
||||
CustomPlayerPrefs.SetFloat(key, newValue);
|
||||
|
||||
if (_isAutoSave)
|
||||
{
|
||||
_lastSaveTime = $"最后保存: {DateTime.Now.ToString("HH:mm:ss")}";
|
||||
}
|
||||
|
||||
RefreshData();
|
||||
}
|
||||
}
|
||||
else if (value is int intValue)
|
||||
{
|
||||
GUILayout.Label("Int", GUILayout.Width(80));
|
||||
var newValue = EditorGUILayout.IntField(intValue);
|
||||
if (newValue != intValue)
|
||||
{
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
CustomEditorPrefs.SetInt(key, newValue);
|
||||
else
|
||||
CustomPlayerPrefs.SetInt(key, newValue);
|
||||
|
||||
if (_isAutoSave)
|
||||
{
|
||||
_lastSaveTime = $"最后保存: {DateTime.Now.ToString("HH:mm:ss")}";
|
||||
}
|
||||
|
||||
RefreshData();
|
||||
}
|
||||
}
|
||||
else if (value is bool boolValue)
|
||||
{
|
||||
GUILayout.Label("Bool", GUILayout.Width(80));
|
||||
var newValue = EditorGUILayout.Toggle(boolValue);
|
||||
if (newValue != boolValue)
|
||||
{
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
CustomEditorPrefs.SetBool(key, newValue);
|
||||
else
|
||||
CustomPlayerPrefs.SetBool(key, newValue);
|
||||
|
||||
if (_isAutoSave)
|
||||
{
|
||||
_lastSaveTime = $"最后保存: {DateTime.Now.ToString("HH:mm:ss")}";
|
||||
}
|
||||
|
||||
RefreshData();
|
||||
}
|
||||
}
|
||||
|
||||
// 删除按钮
|
||||
if (GUILayout.Button("删除", GUILayout.Width(60)))
|
||||
{
|
||||
if (EditorUtility.DisplayDialog("确认删除", $"确定要删除键 '{key}' 吗?", "删除", "取消"))
|
||||
{
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
CustomEditorPrefs.DeleteKey(key);
|
||||
else
|
||||
CustomPlayerPrefs.DeleteKey(key);
|
||||
|
||||
if (_isAutoSave)
|
||||
{
|
||||
_lastSaveTime = $"最后保存: {DateTime.Now.ToString("HH:mm:ss")}";
|
||||
}
|
||||
|
||||
RefreshData();
|
||||
}
|
||||
}
|
||||
|
||||
GUILayout.EndHorizontal();
|
||||
}
|
||||
|
||||
if (filteredData.Count == 0)
|
||||
{
|
||||
GUILayout.Label("没有找到数据", EditorStyles.centeredGreyMiniLabel);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 手动保存数据
|
||||
/// </summary>
|
||||
private void SaveDataManually()
|
||||
{
|
||||
// 这两个类在每个Set方法中已经自动保存,这里只需要更新状态提示
|
||||
_lastSaveTime = $"最后保存: {DateTime.Now.ToString("HH:mm:ss")}";
|
||||
EditorUtility.DisplayDialog("保存成功", $"{_selectedPrefsType}数据已保存", "确定");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加新键值对
|
||||
/// </summary>
|
||||
private void AddNewKeyValuePair()
|
||||
{
|
||||
if (string.IsNullOrEmpty(_newKey))
|
||||
{
|
||||
EditorUtility.DisplayDialog("错误", "键名不能为空", "确定");
|
||||
return;
|
||||
}
|
||||
|
||||
if (_dataCache.ContainsKey(_newKey))
|
||||
{
|
||||
EditorUtility.DisplayDialog("错误", $"键 '{_newKey}' 已存在", "确定");
|
||||
return;
|
||||
}
|
||||
|
||||
// 根据选择的类型添加新键值对
|
||||
switch (_selectedValueType)
|
||||
{
|
||||
case ValueType.String:
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
CustomEditorPrefs.SetString(_newKey, _newStringValue);
|
||||
else
|
||||
CustomPlayerPrefs.SetString(_newKey, _newStringValue);
|
||||
break;
|
||||
case ValueType.Int:
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
CustomEditorPrefs.SetInt(_newKey, _newIntValue);
|
||||
else
|
||||
CustomPlayerPrefs.SetInt(_newKey, _newIntValue);
|
||||
break;
|
||||
case ValueType.Float:
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
CustomEditorPrefs.SetFloat(_newKey, _newFloatValue);
|
||||
else
|
||||
CustomPlayerPrefs.SetFloat(_newKey, _newFloatValue);
|
||||
break;
|
||||
case ValueType.Bool:
|
||||
if (_selectedPrefsType == PrefsType.CustomEditorPrefs)
|
||||
CustomEditorPrefs.SetBool(_newKey, _newBoolValue);
|
||||
else
|
||||
CustomPlayerPrefs.SetBool(_newKey, _newBoolValue);
|
||||
break;
|
||||
}
|
||||
|
||||
if (_isAutoSave)
|
||||
{
|
||||
_lastSaveTime = $"最后保存: {DateTime.Now.ToString("HH:mm:ss")}";
|
||||
}
|
||||
|
||||
// 清空输入框
|
||||
_newKey = "";
|
||||
_newStringValue = "";
|
||||
_newIntValue = 0;
|
||||
_newFloatValue = 0f;
|
||||
_newBoolValue = false;
|
||||
|
||||
RefreshData();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user