真Unity-Editor二次开发-ScriptableObject 可自定义UI界面

2024-03-07 08:12

本文主要是介绍真Unity-Editor二次开发-ScriptableObject 可自定义UI界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于ScriptablObject自定义

作为官方指定的,曾经我也吐槽过ScriptableObject很鸡肋,个人曾经也是强烈反对在项目中使用,但直到我今天看到下面这个代码,菜发现其实只是自己太菜鸡而已

--------------不想多写什么

--------------不要多说什么言语

反正最后发现,小丑还是自己

但还是要说下:掌握这些知识并没有什么卵用,

众所周知,在一些小型项目中,我们经常会用到ScriptableObject,以下简称SO,作为基础的数据存储,可以做一下背包系统啊等等,例如,做了一个音效管理:

以上这个截图完全就是一个SoundDatabase(却仅使用了单一SO)

但中间 soundVolume的拖动是如何实现的呢,

说来只是涉及一些 C# 的自定义 Atrribute 的概念,非常简单的代码

//https://blog.csdn.net/avi9111/article/details/136522189
[CreateAssetMenu(menuName = "ScriptableObjects/SoundsStorage", fileName = "SoundsStorage")]
public class SoundsStorage : ScriptableObject
{[Header("Sound Storage")][SerializeField] private List<SomeSound> someSounds = default;public void SomeSoundPlay(SoundType _soundType) {SoundManager.PlaySomeSoundOnce?.Invoke(_soundType);}public void SomeSoundPlayContinuous(SoundType _soundType, Func<bool> _factor) {SoundManager.PlaySomeSoundContinuous?.Invoke(_soundType, _factor);}public SomeSound GetConcreteSound(SoundType _soundType) {return someSounds.Find(someSound => someSound.soundType == _soundType);}
}
[Serializable]
public class SomeSound {[SerializeField]public string soundTypeStr;public SoundType soundType;[SoundBar]public float soundVolume = 1f;public List<AudioClip> audioClip;
}

关键在于

//https://blog.csdn.net/avi9111/article/details/136522189
using UnityEditor;
using UnityEngine;#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(SoundBarAttribute))]
public class SundVolumeProperty : PropertyDrawer
{public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){property.floatValue =  EditorGUI.Slider(position, property.floatValue, 0f, 1f);EditorGUI.ProgressBar(new Rect(position.x, position.y, position.width - 53f, position.height), property.floatValue, property.name);}
}
#endifpublic class SoundBarAttribute : PropertyAttribute
{
}

不终结996的时代和草台班子的时代,试问,我们又如何能创造出此等美妙的代码?

毁灭吧,累了

之前写的Shader 面板的自定义,Inspector 的自定义

《待补充》

这篇关于真Unity-Editor二次开发-ScriptableObject 可自定义UI界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

在 PyQt 加载 UI 三种常见方法

《在PyQt加载UI三种常见方法》在PyQt中,加载UI文件通常指的是使用QtDesigner设计的.ui文件,并将其转换为Python代码,以便在PyQt应用程序中使用,这篇文章给大家介绍在... 目录方法一:使用 uic 模块动态加载 (不推荐用于大型项目)方法二:将 UI 文件编译为 python 模

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依