using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; namespace Stary.Evo.Editor { /// /// PlayerPrefs和CustomEditorPrefs的管理窗口 /// public class PlayerPrefsWindow : EditorWindow { private Vector2 _scrollPosition; private string _searchFilter = ""; private Dictionary _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("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); } } /// /// 手动保存数据 /// private void SaveDataManually() { // 这两个类在每个Set方法中已经自动保存,这里只需要更新状态提示 _lastSaveTime = $"最后保存: {DateTime.Now.ToString("HH:mm:ss")}"; EditorUtility.DisplayDialog("保存成功", $"{_selectedPrefsType}数据已保存", "确定"); } /// /// 添加新键值对 /// 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(); } } }