Unity 在Preferences或Project Setting窗口创建自定义配置
官方文档链接 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窗口创建自定义配置的更多相关文章
- 使用 ConfigurationSection 创建自定义配置节
我们可以通过用自己的 XML 配置元素来扩展标准的 ASP.NET 配置设置集,要完成这一功能,我们必须实现继承System.Configuration.ConfigurationSection 类来 ...
- 迁移appseting.json创建自定义配置中心
创建一个自定义的配置中心,将框架中各类配置,迁移至数据库,支持切换数据库,热重载. 说在前面的话 自使用.net Core框架以来,配置大多存在json文件中: [框架默认加载配置]文件为appset ...
- ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节集合
核心代码 using System; using System.Data; using System.Configuration; using System.Web; using System.Web ...
- ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节
主要代码,一定要继续System.Configuration.ConfigurationSection,具体的节点名称可以自行修改 using System; using System.Data; u ...
- C#创建自定义配置节
在.Net应用程序中,我们经常看到VS为我们生成的项目工程中都会含有nfig或者nfig这样的文件.这个文件就是我们所说的应用程序配置文件.在这个文件里面记述着一些与我们的应用程序相关的信息,如:数据 ...
- C#创建自定义配置节点
转载:http://www.educity.cn/develop/495003.html 在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfi ...
- C# 创建自定义配置节点1
转载:http://www.educity.cn/develop/495003.html 在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfi ...
- unity编辑器扩展_08(创建自定义窗口)
代码: using UnityEngine;using UnityEditor; public class MyWidow : EditorWindow{ [MenuItem("Win ...
- Unity用GUI绘制Debug/print窗口/控制台-打包后测试
Unity游戏视窗控制台输出 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...
- IntelliJ IDEA 如何在同一个窗口创建多个项目--超详细教程
一.IntelliJ IDEA与Eclipse的区别 二.在同一个窗口创建多个项目 1.打开IntelliJ IDEA,点击Create New Project 2.Java Enterprise-- ...
随机推荐
- 2023-07-08:RabbitMQ如何做到消息不丢失?
2023-07-08:RabbitMQ如何做到消息不丢失? 答案2023-07-08: 1.持久化 发送消息时设置delivery_mode属性为2,使消息被持久化保存到磁盘,即使RabbitMQ服务 ...
- 使用 Sa-Token 实现不同的登录模式:单地登录、多地登录、同端互斥登录
一.需求分析 如果你经常使用腾讯QQ,就会发现它的登录有如下特点:它可以手机电脑同时在线,但是不能在两个手机上同时登录一个账号. 同端互斥登录,指的就是:像腾讯QQ一样,在同一类型设备上只允许单地点登 ...
- NodeJS使用npm安装vue脚手架
开发环境准备:Windows10.Windows11 NodeJS,安装官网最新LTS版即可 下载地址:https://nodejs.org/安装一路下一步,默认即可 ================ ...
- HTML前端js
ajax请求方法书写 $.ajax({ type:"POST", url:CONTEXT_PATH+"/appAudit/insertSnDocCountAdmin&qu ...
- 正交实例二(不规则数据的测试:也就是因子数和水平数不是正好满足正交表)allpairs的使用即下载
allpairs工具的使用 作用可以针对不规则的数据生成用例 下载地址: 链接:https://pan.baidu.com/s/1SgvciN427z_WRzA5QG5eJg ** 提取码:52yj* ...
- os模块常用操作
作者:Simon0903 链接:https://www.jianshu.com/u/2b4bc3b5e6fc 來源:简书 os.getcwd() #返回当前工作目录 os.chdir(path) #改 ...
- 从原理聊JVM(四):JVM中的方法调用原理
1 引言 多态是Java语言极为重要的一个特性,可以说是Java语言动态性的根本,那么线程执行一个方法时到底在内存中经历了什么,JVM又是如何确定方法执行版本的呢? 2 栈帧 JVM中由栈帧存储方法的 ...
- 如何提升 API-First 设计流程
一个 API-First 设计应该具有可复用性.互操作性.可修改性.用户友好性.安全性.高效性.务实性,并且重要的是,与组织目标保持一致.这些基本特征将确保 API 能够有效地为 API- First ...
- [linux]搭建nfs
环境 说明 IP 系统版本 服务端 192.168.137.7 centos 7 客户端 192.168.137.8 centos 7 步骤 配置服务端 安装 nfs 服务 yum install - ...
- 部署ELK+filebeat收集nginx日志
前言 简介 ELK(Elasticsearch.Logstash.Kibana)是开源的实时日志收集分析解决方案. Elasticsearch:开源搜索引擎,是一个基于Lucene.分布式.通过Res ...