官方文档链接 https://docs.unity3d.com/2020.3/Documentation/ScriptReference/SettingsProvider.html

一直不习惯使用Unity提供的ScriptableObject来存储数据,更习惯使用xml和json这种通用格式

这个自定义的配置设置看起来还挺方便的,可以用来做一些编辑器内的选项配置

#if !UNITY_EDITOR

public class CustomEditorSettings
{
public static void Initialize()
{
} public static string GetString(string name, string defaultValue = "")
{
return defaultValue;
}
} #else using System.Collections.Generic;
using System.IO;
using System.Xml;
using UnityEditor;
using UnityEngine; public class CustomEditorSettings
{
private const string FILE_PATH = "UserSettings/EditorBootSettings.xml"; private static CustomEditorSettings s_Instance; public static void Initialize()
{
if (s_Instance == null) s_Instance = new CustomEditorSettings();
} private Dictionary<string, string> m_Values; private CustomEditorSettings()
{
m_Values = new Dictionary<string, string>(); if (!File.Exists(FILE_PATH)) return; XmlDocument xml = new XmlDocument();
xml.Load(FILE_PATH);
xmlNode root = root.SelectSingleNode("data");
XmlNodeList items = root.SelectNodes("i");
foreach (XmlNode item in items)
{
XmlElement element = (XmlElement)item;
string key = element.GetAttribute("key");
string value = element.GetAttribute("value");
m_Values[key] = value;
}
} private void SaveData()
{
if (s_Instance == null) return; XmlDocument xml = new XmlDocument();
XmlNode root = xml.CreateElement("data");
xml.AppendChild(root); List<string> keys = new List<string>(s_Instance.m_Values.Keys);
keys.Sort();
foreach (string key in keys)
{
string value = s_Instance.m_Values[key];
XmlElement element = xml.CreateElement("i");
element.SetAttribute("key", key);
root.AppendChild(element);
} xml.Save(FILE_PATH);
} public static string GetString(string name, string defaultValue = "")
{
if (s_Instance == null) Initialize();
if (!s_Instance.m_Values.ContainsKey(name)) return defaultValue;
return s_Instance.m_Values[name];
} public static void SetString(string name, string value)
{
if (s_Instance == null) Initialize();
s_Instance.m_Values[name] = value;
s_Instance.SaveData();
} // 注册自定义设置页面
[SettingsProvider]
private static SettingsProvider CreateProvider()
{
// 第二个参数决定显示在什么地方,如果是SettingsScope.Project, 就显示在Project Settings里面
// 相应的,数据也需要存储在ProjectSettings文件夹里面
// guiHandler表示使用IMGUI的展示函数, 官方也提供了UIElements版本的
// 但是如果没有完整封装一套UIElements逻辑的话,写属性一类的编辑器UI还是用IMGUI更方便(基本不在乎效率) return new SettingsProvider("CustomEditorSettings", SettingsScope.User)
{
label = "自定义配置",
guiHandler = OnProviderGUI,
};
} // 自定义页面的UI函数
private static void OnProviderGUI(string _)
{
Initialize(); List<string> keys = new List<string>(s_Instance.m_Values.Keys);
foreach (string key in keys)
{
if (!s_Instance.m_Values.ContainsKey(key)) continue; string value = s_Instance.m_Values[key];
EditorGUI.BeginChangeCheck();
value = EditorGUILayout.TextField(key, value);
if (EditorGUI.EndChangeCheck())
{
SetString(key, value);
}
}
}
} #endif

添加更多值类型、让UI更加人性化等内容不再赘述

Unity 在Preferences或Project Setting窗口创建自定义配置的更多相关文章

  1. 使用 ConfigurationSection 创建自定义配置节

    我们可以通过用自己的 XML 配置元素来扩展标准的 ASP.NET 配置设置集,要完成这一功能,我们必须实现继承System.Configuration.ConfigurationSection 类来 ...

  2. 迁移appseting.json创建自定义配置中心

    创建一个自定义的配置中心,将框架中各类配置,迁移至数据库,支持切换数据库,热重载. 说在前面的话 自使用.net Core框架以来,配置大多存在json文件中: [框架默认加载配置]文件为appset ...

  3. ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节集合

    核心代码 using System; using System.Data; using System.Configuration; using System.Web; using System.Web ...

  4. ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节

    主要代码,一定要继续System.Configuration.ConfigurationSection,具体的节点名称可以自行修改 using System; using System.Data; u ...

  5. C#创建自定义配置节

    在.Net应用程序中,我们经常看到VS为我们生成的项目工程中都会含有nfig或者nfig这样的文件.这个文件就是我们所说的应用程序配置文件.在这个文件里面记述着一些与我们的应用程序相关的信息,如:数据 ...

  6. C#创建自定义配置节点

    转载:http://www.educity.cn/develop/495003.html 在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfi ...

  7. C# 创建自定义配置节点1

    转载:http://www.educity.cn/develop/495003.html 在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfi ...

  8. unity编辑器扩展_08(创建自定义窗口)

    代码: using UnityEngine;using UnityEditor; public class MyWidow : EditorWindow{    [MenuItem("Win ...

  9. Unity用GUI绘制Debug/print窗口/控制台-打包后测试

    Unity游戏视窗控制台输出 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

  10. IntelliJ IDEA 如何在同一个窗口创建多个项目--超详细教程

    一.IntelliJ IDEA与Eclipse的区别 二.在同一个窗口创建多个项目 1.打开IntelliJ IDEA,点击Create New Project 2.Java Enterprise-- ...

随机推荐

  1. Pycharm里Python运行窗口显示乱码���的解决方法

    当你的Python程序运行后,会在运行窗口中显示乱码 ��� 等字样,如下 原因是 Pycharm中默认设置只显示UTF-8编码的格式,需要修改支持显示中文支持. 解决方法: 菜单中选择 File S ...

  2. locust与jmeter测试过程及结果对比

    JMeter和Locust都是强大的性能测试工具,各自拥有自己的优势和专注领域.JMeter提供了全面的功能和基于GUI的界面,适用于复杂的场景和非技术人员.相比之下,Locust采用了以代码为中心的 ...

  3. Avalonia中用FluentAvalonia+DialogHost.Avalonia实现界面弹窗和对话框

    Avalonia中用FluentAvalonia+DialogHost.Avalonia实现界面弹窗和对话框 本文是项目中关于 弹窗界面 设计的技术分享,通过 FluentAvalonia+Dialo ...

  4. 2021-11-30 WPF的MVVM绑定

    主页面代码 public partial class MainWindow : Window { MainViewModel mainViewModel = null; public MainWind ...

  5. 论文解读(BERT-DAAT)《Adversarial and Domain-Aware BERT for Cross-Domain Sentiment Analysis》

    论文信息 论文标题:Adversarial and Domain-Aware BERT for Cross-Domain Sentiment Analysis论文作者:论文来源:2020 ACL论文地 ...

  6. 磁盘问题和解决: fsck,gdisk,fdisk等

    错误: Resize inode not valid 对于gpt分区的硬盘一般fsck只能检查分区, 不能用于检查整个硬盘, 但是如果对硬盘设备运行时遇到这样的错误 $ sudo fsck -n /d ...

  7. 好用工具: windows terminal

    直接在微软商店搜索该软件即可,本文介绍无法使用微软商店的情况. 解题思路 当我们无法下载某个软件时,可直接去Github中寻找该项目,知道该软件资源并下载. 下载地址 https://github.c ...

  8. FlinkSQL类型系统

    类型有什么作用, 类型可以提供编译期检查, 避免到运行期才报错. 类型 首先Flink中自己定义了一套类型, 有LogicalType和DataType两个表示 LogicalType Logical ...

  9. 【opencv】传统目标检测:Haar检测器实现人脸检测

    传统目标分类器主要包括Viola Jones Detector.HOG Detector.DPM Detector,本文主要介绍VJ检测器,在VJ检测器基础上发展出了Haar检测器,Haar检测器也是 ...

  10. SRC赏金猎人—笔记二

    以下是如何将速率限制漏洞的影响从低增加到高甚至严重 过程 1.我访问了该网站,然后开始在网站的主文件中手动查找main.js 2.我发现有一个 Web 服务托管在 http:// redacted.c ...