---ScriptableObject代替单例
和单例一样,在内存是独一份的,是可以被不同的东西读取,需要一些工具链配合。
结构是这样的 startEvent事件->EventListener事件监听->事件数据Event;这样可以跨scene传递信息。
1、用来代替enum
enum的缺点:必须改代码(删改不方便,基于下标)不能存储更多数据。不支持null
2、data scriptableObject
对设计师友好,对git友好,可以被别处监听,打包运输方便
1、如果要监听某个血量,so序列化一个float,随时监听数据变化
2、配置文件,数据和美术分离。相互修改不影响。将多属性脚本集成到so文件中。
3、Event
///
[CreateAssetMenu(menuName="Events.Equipment Select Event Channel")]
public class YYYYYSelectEventChannelSO:ScriptableObject
{
public UnityAction<xxxxItemSO> OnEquipmentSelected;
public void Raise(MerchantItemSo itemSO)
{
OnEquipmentSelected?.Invoke(itemSo)
}
}
//
public class UIxxxItem:MonoBehaviour
{
....
[serializeField] private xxxxItemSO _itemSo;
[serializeField] private YYYYYSelectEventChannelSO _channel;
pulic void OnSelected(){
_chanel.Raise(_itemSo);
}
}
//点击上面的项目这个面板会响应
public class UIxxxxInspector:MonoBehaviour
{
....
[serializeField] private YYYYYSelectEventChannelSO _channel;
private void OnEnable(){
_channel.OnEquipmentSelected+=ZZZZZZZZZZ;
}
private void OnDisable(){
_channel.OnEquipmentSelected-=ZZZZZZZZZZ;
}
void ZZZZZZZZZZ(){
}
}
4、可以储存方法。 onValidate();例如攻击概率
[serializeField] private float normalAttackRate;
[serializeField]private float criticalRare;
//因为普通攻击和暴击概率相加==1;所以设置一个概率即可,这里用onValidate方法控制
onValidate(){
criticalRare=1-normalAttackRate;
}
5、editor扩展
在editor扩展 增加按钮
//扩展
[CustomEditor(typeof(xxxxxSo))]
public class xxxxSOEditor:Editor{
private AudioSource _previewAudioSource;
private xxxxSO _target//
private void OnEnable(){
_target=target as XXXXSO;//target是父类提供的
_previewAudioSource=EditorUtility.CreateGameObjectWithHideFlags("AudioPreview"
,HideFlags.HideAndDontSave,typeof(AudioSource).GetComponent<AudioSource>());
}
private void OnDisable(){
DestroyImmediate(_previewAudioSource);//官方要求隐藏物体要销毁
}
public override void OnInspectorGUI(){
base.OnInspectorGUI();
if(GUILayout.Button("PreviewAudio")){
_target.Play(_previewAudioSource);
}
}
}
public class xxxxso:ScriptableObject{
[serilizeField]private float minVolume;
[serilizeField]private float maxVolume;//最大音量
[serilizeField]private float minPitch;
[serilizeField]private float maxPitch;//最大音调
public void Play(AudioSource source){
}
}
6、RuntimeSet
pulic List<xxx> allxxx=new list<xxx>();
public void Add(){}
public Remove(){}
public void Onxxx(){xxx x,vector3 location }{Remove() foreach(){ dosometings}}