自定义ProjectSettings设置项

2024-03-08 04:30

本文主要是介绍自定义ProjectSettings设置项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于ScriptableObject资源和SettingsProvider特性方式实现

1.实现ScriptableObject数据设计


/// <summary>
/// 用于存储我们的设置配置
/// </summary>
public class EditorLearnSettings : ScriptableObject
{/// <summary>/// 用于我们设置的保存位置/// </summary>private const string SettingsFile= "Assets/Settings/EditorLearnSetting.asset";#region 此处可以存储我们自定义的配置信息/// <summary>/// 模拟我们的配置/// </summary>public int m_ConfigVersionCode = 1;#endregion
}

2.提供配置文件内容的全局实例方法 

在我们的EditorLearnSettings类提供以下方法,为我们提供全局配置信息。

    /// <summary>/// 这里提供一个配置对象/// </summary>/// <returns></returns>public static EditorLearnSettings GetOrCreateSettings(){var settings = AssetDatabase.LoadAssetAtPath<EditorLearnSettings>(SettingsFile);if (settings == null){settings = ScriptableObject.CreateInstance<EditorLearnSettings>();settings.m_ConfigVersionCode = 0;if (!Directory.Exists(Path.GetDirectoryName(SettingsFile))){Directory.CreateDirectory(Path.GetDirectoryName(SettingsFile));}AssetDatabase.CreateAsset(settings, SettingsFile);AssetDatabase.SaveAssets();}return settings;}/// <summary>/// 提供一个SerializedObject的对象/// </summary>/// <returns></returns>public static SerializedObject GetSerializedSettings(){return new SerializedObject(GetOrCreateSettings());}
  • 当资源配置被创建出来我们可以直接进行配置,如果不想通过资源配置文件配置,可以为其制定一个CustomEditor。
[CustomEditor(typeof(EditorLearnSettings))]
public class EditorLearnSettingsView:Editor
{protected override void OnHeaderGUI(){GUILayout.Label("请从Project Settings配置");}public override void OnInspectorGUI() { }
}

3.编写一个提供SettingsProvider数据的静态方法。

我们继续在EditorLearnSettings类提供以下方法。

    /// <summary>/// 这里主要是制定我们的Settings路径/// </summary>private const string ProjectSettingPtah = "Project/编辑器学习";/// <summary>/// 将我们的Setting提供给Unity/// </summary>/// <returns></returns>[SettingsProvider]public static SettingsProvider CreateEditorLearnSettingsProvider(){///创建一个SettingsProvidervar provider = new SettingsProvider(ProjectSettingPtah, SettingsScope.Project){guiHandler = (searchContext) =>{///searchContext:提供用户搜索的信息///这里是一个gui的处理行为var settings = EditorLearnSettings.GetSerializedSettings();EditorGUILayout.PropertyField(settings.FindProperty("m_ConfigVersionCode"), new GUIContent("版本码:"));settings.ApplyModifiedPropertiesWithoutUndo();},// 用于搜索的关键字,在Project 可以搜索对应的配置keywords = new HashSet<string>(new[] { "Learn", "KTGame" })};return provider;}

 4.到此我们就可以在Project Setting看见我们自定义的配置模块了。

5.完整代码

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.IO;[CustomEditor(typeof(EditorLearnSettings))]
public class EditorLearnSettingsView:Editor
{protected override void OnHeaderGUI(){GUILayout.Label("请从Project Settings配置");}public override void OnInspectorGUI() { }
}/// <summary>
/// 用于存储我们的设置配置
/// </summary>
public class EditorLearnSettings : ScriptableObject
{/// <summary>/// 用于我们设置的保存位置/// </summary>private const string SettingsFile= "Assets/Settings/EditorLearnSetting.asset";#region 此处可以存储我们自定义的配置信息/// <summary>/// 模拟我们的配置/// </summary>public int m_ConfigVersionCode = 1;#endregion/// <summary>/// 这里提供一个全局的设置获取方式/// </summary>/// <returns></returns>public static EditorLearnSettings GetOrCreateSettings(){var settings = AssetDatabase.LoadAssetAtPath<EditorLearnSettings>(SettingsFile);if (settings == null){settings = ScriptableObject.CreateInstance<EditorLearnSettings>();settings.m_ConfigVersionCode = 0;if (!Directory.Exists(Path.GetDirectoryName(SettingsFile))){Directory.CreateDirectory(Path.GetDirectoryName(SettingsFile));}AssetDatabase.CreateAsset(settings, SettingsFile);AssetDatabase.SaveAssets();}return settings;}/// <summary>/// 提供一个SerializedObject的获取/// </summary>/// <returns></returns>public static SerializedObject GetSerializedSettings(){return new SerializedObject(GetOrCreateSettings());}/// <summary>/// 这里主要是制定我们的Settings路径/// </summary>private const string ProjectSettingPtah = "Project/编辑器学习";/// <summary>/// 将我们的Setting提供给Unity/// </summary>/// <returns></returns>[SettingsProvider]public static SettingsProvider CreateEditorLearnSettingsProvider(){///创建一个SettingsProvidervar provider = new SettingsProvider(ProjectSettingPtah, SettingsScope.Project){guiHandler = (searchContext) =>{///searchContext:提供用户搜索的信息///这里是一个gui的处理行为var settings = EditorLearnSettings.GetSerializedSettings();EditorGUILayout.PropertyField(settings.FindProperty("m_ConfigVersionCode"), new GUIContent("版本码:"));settings.ApplyModifiedPropertiesWithoutUndo();},// 用于搜索的关键字,在Project 可以搜索对应的配置keywords = new HashSet<string>(new[] { "Learn", "KTGame" })};return provider;}
}

基于继承SettingsProvider的实现方式。

1.同样需要一个配置文件。

配置文件我们直接使用上面的文件。

/// <summary>
/// 用于存储我们的设置配置
/// </summary>
public class EditorLearnSettings : ScriptableObject
{/// <summary>/// 用于我们设置的保存位置/// </summary>private const string SettingsFile= "Assets/Settings/EditorLearnSetting.asset";#region 此处可以存储我们自定义的配置信息/// <summary>/// 模拟我们的配置/// </summary>public int m_ConfigVersionCode = 1;#endregion/// <summary>/// 这里提供一个全局的设置获取方式/// </summary>/// <returns></returns>public static EditorLearnSettings GetOrCreateSettings(){var settings = AssetDatabase.LoadAssetAtPath<EditorLearnSettings>(SettingsFile);if (settings == null){settings = ScriptableObject.CreateInstance<EditorLearnSettings>();settings.m_ConfigVersionCode = 0;if (!Directory.Exists(Path.GetDirectoryName(SettingsFile))){Directory.CreateDirectory(Path.GetDirectoryName(SettingsFile));}AssetDatabase.CreateAsset(settings, SettingsFile);AssetDatabase.SaveAssets();}return settings;}/// <summary>/// 提供一个SerializedObject的获取/// </summary>/// <returns></returns>public static SerializedObject GetSerializedSettings(){return new SerializedObject(GetOrCreateSettings());}
}

2.继承 SettingsProvider

首先我们创建EditorLearnSettingsProvider类并继承SettingsProvider

public class EditorLearnSettingsProvider: SettingsProvider{}

实现SettingsProvider构造函数。

public EditorLearnSettingsProvider(string path, SettingsScope scope) : base(path, scope) { }

重写OnGUI和OnActivate

    /// <summary>/// 当模块被激活时被调用/// </summary>/// <param name="searchContext">用户搜索的内容</param>/// <param name="rootElement">UIElements根节点。如果添加到此,则 SettingsProvider 使用 UIElements 而不是调用 SettingsProvider.OnGUI 来构建 UI。如果不添加到此 VisualElement,则必须使用 IMGUI 来构建 UI。</param>public override void OnActivate(string searchContext, VisualElement rootElement){serializedObject = EditorLearnSettings.GetSerializedSettings();}public override void OnGUI(string searchContext){EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ConfigVersionCode"), new GUIContent("版本码:"));}

3.通过SettingsProvider方法特性注册到SettingsProvider中

    [SettingsProvider]public static SettingsProvider CreateMyCustomSettingsProvider(){var provider = new EditorLearnSettingsProvider(ProjectSettingPtah, SettingsScope.Project);provider.keywords = new[] { "Learn", "KTGame" };return provider;}

4.完整代码

using UnityEditor;
using UnityEngine;
using System.IO;
using UnityEngine.UIElements;[CustomEditor(typeof(EditorLearnSettings))]
public class EditorLearnSettingsView:Editor
{protected override void OnHeaderGUI(){GUILayout.Label("请从Project Settings配置");}public override void OnInspectorGUI() { }
}/// <summary>
/// 用于存储我们的设置配置
/// </summary>
public class EditorLearnSettings : ScriptableObject
{/// <summary>/// 用于我们设置的保存位置/// </summary>private const string SettingsFile= "Assets/Settings/EditorLearnSetting.asset";#region 此处可以存储我们自定义的配置信息/// <summary>/// 模拟我们的配置/// </summary>public int m_ConfigVersionCode = 1;#endregion/// <summary>/// 这里提供一个全局的设置获取方式/// </summary>/// <returns></returns>public static EditorLearnSettings GetOrCreateSettings(){var settings = AssetDatabase.LoadAssetAtPath<EditorLearnSettings>(SettingsFile);if (settings == null){settings = ScriptableObject.CreateInstance<EditorLearnSettings>();settings.m_ConfigVersionCode = 0;if (!Directory.Exists(Path.GetDirectoryName(SettingsFile))){Directory.CreateDirectory(Path.GetDirectoryName(SettingsFile));}AssetDatabase.CreateAsset(settings, SettingsFile);AssetDatabase.SaveAssets();}return settings;}/// <summary>/// 提供一个SerializedObject的获取/// </summary>/// <returns></returns>public static SerializedObject GetSerializedSettings(){return new SerializedObject(GetOrCreateSettings());}
}public class EditorLearnSettingsProvider: SettingsProvider
{private const string ProjectSettingPtah = "Project/编辑器学习";public EditorLearnSettingsProvider(string path, SettingsScope scope) : base(path, scope) { }private SerializedObject serializedObject;/// <summary>/// 当模块被激活时被调用/// </summary>/// <param name="searchContext">用户搜索的内容</param>/// <param name="rootElement">UIElements根节点。如果添加到此,则 SettingsProvider 使用 UIElements 而不是调用 SettingsProvider.OnGUI 来构建 UI。如果不添加到此 VisualElement,则必须使用 IMGUI 来构建 UI。</param>public override void OnActivate(string searchContext, VisualElement rootElement){serializedObject = EditorLearnSettings.GetSerializedSettings();}public override void OnGUI(string searchContext){EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ConfigVersionCode"), new GUIContent("版本码:"));}[SettingsProvider]public static SettingsProvider CreateMyCustomSettingsProvider(){var provider = new EditorLearnSettingsProvider(ProjectSettingPtah, SettingsScope.Project);provider.keywords = new[] { "Learn", "KTGame" };return provider;}
}

总结

  • SettingsScope共有两项,User显示在Preferences 窗口;Project显示在Project Settings窗口。
  • 这里我们使用的是ScriptableObject方式对配置进行存储,我们也可以使用其它的方式存储在非工程里或者存在ProjectSettings文件夹里。
  • 我们存储的配置目标尽可能的保证全局的唯一性。
  • 关于Project Settings配置模块和Preferences 配置我们还是最好进行一个统一的管理。
  • AssetDatabase.CreateAsset创建资源时要保证路径有效。
  • 此主题所有代码都是编辑器代码应该放在Editor下。
  • 如果我们需要提交多个配置模块可以使用SettingsProviderGroup,你的方法应该提供一个SettingsProvider[]

这篇关于自定义ProjectSettings设置项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/785979

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本