[Unity] ACT 战斗系统学习 6:使用 ScriptableObject 制作 Buff 和 Ability 1

本文介绍了如何在Unity中使用ScriptableObject来创建战斗系统的Buff和Ability。作者探讨了如何抽象Action,利用反射获取物体的公有变量,并在过程中遇到了序列化问题。虽然遇到困难,如枚举转换和表达式解析,但最终得出结论,对于通用性强的工具,可视化脚本可能更为合适。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实我已经把 Action 抽象地很好了,唯一差了那么一点,就是要把整一个 Action 抽象出来,这个 Action 有触发条件,有生命周期……实际上就是一个 Ability 啊
得,还是要回到 Ability 和 Buff 系统

哦……还是用回了 odin,太香了

一开始我是这么写 Ability

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 30/03/2022 1:10
// 最后一次修改于: 30/03/2022 15:14
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------

using System.Collections.Generic;
using Bolt;
using JetBrains.Annotations;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Events;

namespace MeowACT
{
   
    /// <summary>
    /// 可素材化技能
    /// </summary>
    [CreateAssetMenu(fileName = "New Scriptable Ability", menuName = "MeowACT/Create Scriptable Ability")]
    public class ScriptableAbility : SerializedScriptableObject
    {
   
        /// <summary>
        /// 验证函数:是否为非负数
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        private bool DurationValidate(float value) => MathUtility.IsntNegative(value);
        
        /// <summary>
        /// 技能持续时间种类
        /// </summary>
        [EnumToggleButtons]
        [BoxGroup("Time")]
        [Tooltip("技能持续时间种类")]
        public AbilityDurationType DurationType;

        /// <summary>
        /// 技能持续时间
        /// </summary>
        [ShowIf("DurationType",AbilityDurationType.Durable)]
        [BoxGroup("Time")]
        [ValidateInput("DurationValidate")]
        [Tooltip("技能持续时间")]
        public float Duration;

        /// <summary>
        /// 是否能够被打断
        /// </summary>
        [ShowIf("@DurationType == AbilityDurationType.Durable || DurationType == AbilityDurationType.Infinite")]
        [BoxGroup("Time")]
        [Tooltip("是否能够被打断")]
        public bool CanBeInterrupted;

        /// <summary>
        /// 打断时是否需要执行内容
        /// </summary>
        [ShowIf("@CanBeInterrupted && (DurationType == AbilityDurationType.Durable || DurationType == AbilityDurationType.Infinite)")]
        [BoxGroup("Time")]
        [Tooltip("是否能够被打断")]
        public bool HasInterruptedExecution;
        
        /// <summary>
        /// 技能执行延迟
        /// </summary>
        [ShowIf("@HasInterruptedExecution && (DurationType == AbilityDurationType.Durable || DurationType == AbilityDurationType.Infinite)")]
        [BoxGroup("Time/Interrupted Execution")]
        [ValidateInput("DurationValidate")]
        [Tooltip("技能执行延迟")]
        public float InterruptedExecutionDelay;
        
        /// <summary>
        /// 技能执行内容种类
        /// </summary>
        [ShowIf("@HasInterruptedExecution && (DurationType == AbilityDurationType.Durable || DurationType == AbilityDurationType.Infinite)")]
        [EnumToggleButtons]
        [BoxGroup("Time/Interrupted Execution")]
        [Tooltip("技能执行内容种类")]
        public AbilityExecutionType InterruptedExecutionType;

        /// <summary>
        /// 技能执行内容为事件
        /// </summary>
        [ShowIf("@HasInterruptedExecution && InterruptedExecutionType != AbilityExecutionType.Flow && (DurationType == AbilityDurationType.Durable || DurationType == AbilityDurationType.Infinite)")]
        [BoxGroup("Time/Interrupted Execution")]
        [Tooltip("技能执行内容为事件")]
        [ItemCanBeNull]
        public List<UnityEvent<List<UnityEngine.Object>>> InterruptedEventExecution;
        
        /// <summary>
        /// 技能执行内容
        /// </summary>
        [ShowIf("@HasInterruptedExecution && InterruptedExecutionType != AbilityExecutionType.Event && (DurationType == AbilityDurationType.Durable || DurationType == AbilityDurationType.Infinite)")]
        [BoxGroup("Time/Interrupted Execution")]
        [Tooltip("技能执行内容为 Bolt 脚本")]
        [ItemCanBeNull]
        public List<FlowMacro> InterruptedFlowExecution;
        
        /// <summary>
        /// 技能执行条件种类
        /// </summary>
        [EnumToggleButtons]
        [BoxGroup("Condition")]
        [Tooltip("技能执行条件种类")]
        public AbilityConditionType ConditionType;
        
        /// <summary>
        /// 打断时是否需要执行内容
        /// </summary>
        [BoxGroup("Main Execution")]
        [Tooltip("是否能够被打断")]
        public bool HasMainExecution;
        
        /// <summary>
        /// 技能执行延迟
        /// </summary>
        [ShowIf("@HasMainExecution"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值