本文主要是介绍真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界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!