[Unity] 战斗系统学习 11:Buff 框架 1

1. Time

一开始我是希望有一个 ScriptableObject 可以用来计时的
对于一些需要持续计时的事情可以用

1.1 ScriptableTimer

Assets/MeowFramework/Core/Scriptable/ScriptableTimer/ScriptableTimer.cs

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 02/04/2022 23:19
// 最后一次修改于: 11/04/2022 10:31
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------

using System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;

namespace MeowFramework.Core.Scriptable
{
   
    /// <summary>
    /// 计时器
    /// </summary>
    [InlineEditor]
    [CreateAssetMenu(menuName = "MeowFramework/Scriptable Timer/Create Scriptable Timer")]
    public class ScriptableTimer : SerializedScriptableObject
    {
   
        /// <summary>
        /// 是否暂停
        /// </summary>
        [ShowInInspector]
        private bool isPasue;
        
        /// <summary>
        /// 是否暂停
        /// </summary>
        public bool IsPasue => isPasue;
        
        /// <summary>
        /// 是否停止
        /// </summary>
        [ShowInInspector]
        private bool isStop;
        
        /// <summary>
        /// 是否停止
        /// </summary>
        public bool IsStop => isStop;
        
        /// <summary>
        /// 流逝时间
        /// </summary>
        [ShowInInspector]
        private float elapsedTime;
        
        /// <summary>
        /// 流逝时间
        /// </summary>
        public float ElapsedTime 
        {
   
            get => elapsedTime;
            set
            {
   
                if (!isStop && !isPasue) 
                    elapsedTime = value;
            }
        }

        /// <summary>
        /// 时长
        /// </summary>
        [ShowInInspector]
        private float duration;
        
        /// <summary>
        /// 时长
        /// </summary>
        public float Duration => duration;

        /// <summary>
        /// 是否循环
        /// </summary>
        [ShowInInspector]
        private bool isLoop;
        
        /// <summary>
        /// 是否循环
        /// </summary>
        public bool IsLoop => isLoop;
        
        /// <summary>
        /// 委托回调
        /// </summary>
        [ShowInInspector]
        private Action<object[]> callback;
        
        /// <summary>
        /// 回调参数
        /// </summary>
        private object[] args;

        /// <summary>
        /// 计时器的构造函数
        /// </summary>
        /// <param name="duration">时长</param>
        /// <param name="isLoop">是否循环</param>
        /// <param name="callback">委托回调</param>
        /// <param name="args">回调参数</param>
        public ScriptableTimer(float duration, bool isLoop, Action<object[]> callback,
            params object[] args)
        {
   
            this.isPasue = true;
            this.isStop = false;
            this.duration = duration;
            this.isLoop = isLoop;
            this.callback = callback;
            this.args = args;
        }

        /// <summary>
        /// 重置计时器
        /// </summary>
        public void Reset()
        {
   
            elapsedTime = 0;
        }

        /// <summary>
        /// 启动计时器
        /// </summary>
        public void Start()
        {
   
            isPasue = false;
        }
        
        /// <summary>
        /// 暂停计时器
        /// </summary>
        public void Pause()
        {
   
            isPasue = true;
        }
        
        /// <summary>
        /// 停止计时器
        /// </summary>
        public void Stop()
        {
   
            callback?.Invoke(args);
            if (isLoop)
            {
   
                elapsedTime -= duration;
            }
            else
            {
   
                isPasue = true;
                isStop = true;
            }
        }
    }
}

1.2 ScriptableTimerManager

Assets/MeowFramework/Core/Scriptable/ScriptableTimer/ScriptableTimerManager.cs

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 02/04/2022 23:14
// 最后一次修改于: 11/04/2022 10:31
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------

using System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;

namespace MeowFramework.Core.Scriptable
{
   
    /// <summary>
    /// 可资产化计时器管理器
    /// </summary>
    [InlineEditor]
    [CreateAssetMenu(menuName = "MeowFramework/Scriptable Timer/Create Scriptable Timer Manager")]
    public class ScriptableTimerManager : SerializedScriptableObject
    {
   
        /// <summary>
        /// 可资产化计时器管理器的时间缩放比例
        /// </summary>
        private float timeScale = 1f;
        
        /// <summary>
        /// 可资产化计时器管理器的时间缩放比例
        /// </summary>
        public float TimeScale => timeScale;

        /// <summary>
        /// 计时器列表 可以在 ForEach 中删除元素
        /// </summary>
        public static List<ScriptableTimer> ScriptableTimerList = new List<ScriptableTimer>();
        
        /// <summary>
        /// 创建计时器
        /// </summary>
        /// <param name="duration">时长</param>
        /// <param name="isLoop">是否循环</param>
        /// <param name="callback">回调函数</param>
        /// <returns></returns>
        public ScriptableTimer CreateScriptableTimer(float duration, bool isLoop, Action<object[]> callback)
        {
   
   
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值