[Unity] ACT 战斗系统学习 5:使用 ScriptableObject 制作角色属性 1

首先最重要的是属性

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值