首先最重要的是属性
// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 29/03/2022 1:19
// 最后一次修改于: 29/03/2022 8:03
// 版权所有: CheapMiaoStudio
// 描述:
// ----------------------------------------------
using UnityEngine;
namespace MeowACT.Scripts.Scriptable.ScriptableVariable
{
/// <summary>
/// 可资产化浮点值
/// </summary>
[CreateAssetMenu(menuName = "MeowACT/Scriptable Variable/Create Scriptable Float")]
public class ScriptableFloat : ScriptableObject
{
#if UNITY_EDITOR
/// <summary>
/// 开发者注释
/// </summary>
[Multiline]
public string DeveloperDescription = "";
#endif
/// <summary>
/// 浮点值
/// </summary>
public float Value;
/// <summary>
/// 使用浮点值给可资产化浮点值赋值
/// </summary>
/// <param name="other">右值</param>
public void SetValue(float other)
{
Value = other;
}
/// <summary>
/// 使用整型值给可资产化浮点值赋值
/// </summary>
/// <param name="other">右值</param>
public void SetValue(int other)
{
Value = other;
}
/// <summary>
/// 使用可资产化浮点值给可资产化浮点值赋值
/// </summary>
/// <param name="other">右值</param>
public void SetValue(ScriptableFloat other)
{
Value = other.Value;
}
/// <summary>
/// 使用可资产化整型值给可资产化浮点值赋值
/// </summary>
/// <param name="other">右值</param>
public void SetValue(ScriptableInt other)
{
Value = other.Value;
}
/// <summary>
/// 使用浮点值增量给可资产化浮点值赋值
/// </summary>
/// <param name="amount">增量</param>
public void ApplyChange(float amount)
{
Value += amount;
}
/// <summary>
/// 使用整型值增量给可资产化浮点值赋值
/// </summary>
/// <param name="amount">增量</param>
public void ApplyChange(int amount)
{
Value += amount;
}
/// <summary>
/// 使用可资产化浮点值增量给可资产化浮点值赋值
/// </summary>
/// <param name="amount">增量</param>
public void ApplyChange(ScriptableFloat amount)
{
Value += amount.Value;
}
/// <summary>
/// 使用可资产化整型值增量给可资产化浮点值赋值
/// </summary>
/// <param name="amount">增量</param>
public void ApplyChange(ScriptableInt amount)
{
Value += amount.Value;
}
}
}
然后是事件
一开始我是直接抄的
// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 29/03/2022 8:20
// 最后一次修改于: 29/03/2022 8:30
// 版权所有: CheapMiaoStudio
// 描述:
// ----------------------------------------------
using System.Collections.Generic;
using UnityEngine;
namespace MeowACT.Scripts.Scriptable.ScriptableReflection
{
/// <summary>
/// 可资产化事件
/// </summary>
[CreateAssetMenu(menuName = "MeowACT/Sriptable Reflection/Create Scriptable Event")]
public class ScriptableEvent : ScriptableObject
{
/// <summary>
/// 可资产化事件的订阅者列表
/// </summary>
private readonly List<ScriptableEventListener> eventListeners =
new List<ScriptableEventListener>();
/// <summary>
/// 触发可资产化事件
/// </summary>
public void Raise()
{
for(int i = eventListeners.Count -1; i >= 0; i--)
eventListeners[i].OnEventRaised();
}
/// <summary>
/// 订阅可资产化事件
/// </summary>
/// <param name="listener"></param>
public void RegisterListener(ScriptableEventListener listener)
{
if (!eventListeners.Contains(listener))
eventListeners.Add(listener);
}
/// <summary>
/// 退订可资产化事件
/// </summary>
/// <param name="listener"></param>
public void UnregisterListener(ScriptableEventListener listener)
{
if (eventListeners.Contains(listener))
eventListeners.Remove(listener);
}
}
}
// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 29/03/2022 8:24
// 最后一次修改于: 29/03/2022 8:26
// 版权所有: CheapMiaoStudio
// 描述:
// ----------------------------------------------
using UnityEngine;
using UnityEngine.Events;
namespace MeowACT.Scripts.Scriptable.ScriptableReflection
{
/// <summary>
/// 可资产化事件的订阅者
/// </summary>
public class ScriptableEventListener : MonoBehaviour
{
/// <summary>
/// 要订阅的可资产化事件
/// </summary>
[Tooltip("Event to register with.")]
public ScriptableEvent Event;
/// <summary>
/// 订阅者的事件回调
/// </summary>
[Tooltip("Response to invoke when Event is raised.")]
public UnityEvent Response;
/// <summary>
/// 脚本激活时订阅可资产化事件
/// </summary>
private void OnEnable()
{
Event.RegisterListener(this);
}
/// <summary>
/// 脚本禁用时退订可资产化事件
/// </summary>
private void OnDisable()
{
Event.UnregisterListener(this);
}
/// <summary>
/// 可资产化事件触发时调用自己的事件回调
/// </summary>
public void OnEventRaised()
{
Response.Invoke();
}
}
}
但是我想到可能一个对象需要监听多个事件,所以做了一个可以监听多个事件的订阅者
// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 29/03/2022 8:20
// 最后一次修改于: 29/03/2022 10:12
// 版权所有: CheapMiaoStudio
// 描述:
// ----------------------------------------------
using System.Collections.Generic;
using UnityEngine;
namespace MeowACT
{
/// <summary>
/// 可资产化事件
/// </summary>
[CreateAssetMenu(menuName = "MeowACT/Sriptable Reflection/Create Scriptable Event")]
public class ScriptableEvent : ScriptableObject
{
/// <summary>
/// 可资产化事件的订阅者列表
/// </summary>
private readonly List<ScriptableEventListener> eventListeners =
new List<ScriptableEventListener>();
/// <summary>
/// 触发可资产化事件
/// </summary>
public void Raise()
{
for(int i = eventListeners.Count -1; i >= 0; i--)
eventListeners[i].OnEventRaised(this);
}
/// <summary>
/// 订阅可资产化事件
/// </summary>
/// <param name="listener"></param>
public void RegisterListener(ScriptableEventListener listener)
{
if (!eventListeners.Contains(listener))
eventListeners.Add(listener);
}
/// <summary>
/// 退订可资产化事件
/// </summary>
/// <param name="listener"></param>
public void UnregisterListener(ScriptableEventListener listener)
{
if (eventListeners.Contains(listener))
eventListeners.Remove(listener);
}
}
}
// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 29/03/2022 8:24
// 最后一次修改于: 29/03/2022 10:52
// 版权所有: CheapMiaoStudio
// 描述:
// ----------------------------------------------
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
namespace MeowACT
{
/// <summary>
/// 可资产化事件的订阅者
/// </summary>
public class ScriptableEventListener : MonoBehaviour
{
/// <summary>
/// 为了 Unity 的序列化而制作的可资产化事件-响应映射对结构体
/// </summary>
[Serializable]
public struct EventMapPair
{
public ScriptableEvent Key;
public UnityEvent Value;
}
/// <summary>
/// 可资产化事件-响应映射对数组
/// </summary>
public EventMapPair[] EventMap;
/// <summary>
/// 可资产化事件-响应字典
/// </summary>
public Dictionary<ScriptableEvent, UnityEv