官方文档链接 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. 2023-07-08:RabbitMQ如何做到消息不丢失?

    2023-07-08:RabbitMQ如何做到消息不丢失? 答案2023-07-08: 1.持久化 发送消息时设置delivery_mode属性为2,使消息被持久化保存到磁盘,即使RabbitMQ服务 ...

  2. 使用 Sa-Token 实现不同的登录模式:单地登录、多地登录、同端互斥登录

    一.需求分析 如果你经常使用腾讯QQ,就会发现它的登录有如下特点:它可以手机电脑同时在线,但是不能在两个手机上同时登录一个账号. 同端互斥登录,指的就是:像腾讯QQ一样,在同一类型设备上只允许单地点登 ...

  3. NodeJS使用npm安装vue脚手架

    开发环境准备:Windows10.Windows11 NodeJS,安装官网最新LTS版即可 下载地址:https://nodejs.org/安装一路下一步,默认即可 ================ ...

  4. HTML前端js

    ajax请求方法书写 $.ajax({ type:"POST", url:CONTEXT_PATH+"/appAudit/insertSnDocCountAdmin&qu ...

  5. 正交实例二(不规则数据的测试:也就是因子数和水平数不是正好满足正交表)allpairs的使用即下载

    allpairs工具的使用 作用可以针对不规则的数据生成用例 下载地址: 链接:https://pan.baidu.com/s/1SgvciN427z_WRzA5QG5eJg ** 提取码:52yj* ...

  6. os模块常用操作

    作者:Simon0903 链接:https://www.jianshu.com/u/2b4bc3b5e6fc 來源:简书 os.getcwd() #返回当前工作目录 os.chdir(path) #改 ...

  7. 从原理聊JVM(四):JVM中的方法调用原理

    1 引言 多态是Java语言极为重要的一个特性,可以说是Java语言动态性的根本,那么线程执行一个方法时到底在内存中经历了什么,JVM又是如何确定方法执行版本的呢? 2 栈帧 JVM中由栈帧存储方法的 ...

  8. 如何提升 API-First 设计流程

    一个 API-First 设计应该具有可复用性.互操作性.可修改性.用户友好性.安全性.高效性.务实性,并且重要的是,与组织目标保持一致.这些基本特征将确保 API 能够有效地为 API- First ...

  9. [linux]搭建nfs

    环境 说明 IP 系统版本 服务端 192.168.137.7 centos 7 客户端 192.168.137.8 centos 7 步骤 配置服务端 安装 nfs 服务 yum install - ...

  10. 部署ELK+filebeat收集nginx日志

    前言 简介 ELK(Elasticsearch.Logstash.Kibana)是开源的实时日志收集分析解决方案. Elasticsearch:开源搜索引擎,是一个基于Lucene.分布式.通过Res ...