官方文档链接 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. LSP协议被劫持,导致无法上网

    QQ无法登录,网页打不开 用火绒的断网修复 说已经修复了 结果屁用没有 然后找的百度经验 管理员打开命令行窗口 输入 netsh winsock reset catalog 重启即生效

  2. PhotoShop AI 爱国版保姆级安装和使用

    上篇Photoshop AI 令人惊叹的生成式填充介绍了 PhotoShop AI 的新特性功能,有人以为我收了 Adobe 公司的钱帮它们做推广~~~.别不信,事实上确有其事,某平台审核直接把它删掉 ...

  3. Semantic Kernel Java SDK,为Java应用程序提供AI功能集成

    美国时间 2023 年 7 月 19 日,Semantic Kernel 团队在其官方博客[1]上宣布发布 Java 版Semantic Kernel. Samantic Kernel系列的源代码可在 ...

  4. 《HelloGitHub》第 88 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  5. Typescript:基础语法学习(尚硅谷 李立超)

    官方文档:https://www.tslang.cn/docs/handbook/typescript-in-5-minutes.html 搭建开发环境 npm i -g typescript安装完成 ...

  6. 三万字盘点Spring 9大核心基础功能

    大家好,我是三友~~ 今天来跟大家聊一聊Spring的9大核心基础功能. 其实最近有小伙伴私信问我怎么不写文章了,催更来了 其实我不是不写,而是一直在写这篇文章,只不过令我没想到的是,从前期的选题.准 ...

  7. json虽然简单,但这些细节你未必知道

    基本介绍 JSON的全称是JavaScript Object Notation,它并不是编程语言,而是一种可以在服务器和客户端之间传输的数据格式,本来是JavaScript的子集,但现在已独立存在于各 ...

  8. 【pandas小技巧】--缺失值的列

    在实际应用中,数据集中经常会存在缺失值,也就是某些数据项的值并未填充或者填充不完整.缺失值的存在可能会对后续的数据分析和建模产生影响,因此需要进行处理. pandas提供了多种方法来处理缺失值,例如删 ...

  9. 简单搭建基本Prometheus监控系统

    前言 适用场景:新手入门:内网离线部署,只是需要了解服务器基本情况,不需要告警系统. 需要准备的安装包: grafana的docker包(先在线下载,然后docker save保存镜像.如果没有doc ...

  10. 一键部署 Umami 统计个人网站访问数据

    谈到网站统计,大家第一时间想到的肯定是 Google Analytics.然而,我们都知道 Google Analytics 会收集所有用户的信息,对数据没有任何控制和隐私保护. Google Ana ...