367 lines
13 KiB
C#
367 lines
13 KiB
C#
|
|
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();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|