关于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);
}
}
#endif
public class SoundBarAttribute : PropertyAttribute
{
}
不终结996的时代和草台班子的时代,试问,我们又如何能创造出此等美妙的代码?
毁灭吧,累了
之前写的Shader 面板的自定义,Inspector 的自定义
《待补充》