[Unity] 战斗系统学习 9:构建 TPS 框架 4

本文详细介绍了在Unity中构建第三人称射击(TPS)游戏的战斗系统,包括技能框架和Buff框架的设计。技能框架涉及ScriptableAbility、AbilityEntity和ActorBase等组件的实现,用于技能的编写和执行。同时,文章探讨了Buff框架,讨论了将射击功能设计为Buff的优劣,并展示了如何创建和管理BuffEntity。整个过程结合FlowCanvas和C#进行,以提高游戏逻辑的可维护性和灵活性。

1. 技能框架

我的需求是要在 FlowScript 中写技能,然后在角色中引用这个 FlowScript,当需要释放技能的时候就启用这个 FlowScript

1.1 ScriptableAbility v1

ScriptableAbility 是用来存代表技能内容的 FlowScript 的
之后可能还会有其他功能

Assets/MeowFramework/Core/Scriptable/ScriptableAbility/ScriptableAbility.cs

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

using FlowCanvas;
using Sirenix.OdinInspector;
using UnityEngine;

namespace MeowFramework.Core.Scriptable
{
   
   
    /// <summary>
    /// 可资产化技能
    /// </summary>
    [CreateAssetMenu(fileName = "New Scriptable Ability",
        menuName = "MeowFramework/Scriptable Ability/Create Scriptable Ability")]
    public class ScriptableAbility : SerializedScriptableObject
    {
   
   
        /// <summary>
        /// 技能 ID
        /// </summary>
        [ValidateInput("IDValidate")]
        [Tooltip("技能 ID")]
        public int AbilityID;

        /// <summary>
        /// 俗名
        /// </summary>
        [Tooltip("俗名")]
        public string FriendlyName;

        /// <summary>
        /// 概述
        /// </summary>
        [TextArea]
        [Tooltip("概述")]
        public string Description = "";
        
        /// <summary>
        /// 技能 FlowScript
        /// </summary>
        [Required]
        [Tooltip("技能 FlowScript")]
        public FlowScript AbilityFlowScript;

        /// <summary>
        /// 验证函数:是否为非负数
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        private bool IDValidate(int value) => value >= 0;
    }
}

1.2 AbilityEntity v1

为了让技能的 FlowScript 能够执行,需要有一个 FlowScriptController,而 FlowScriptController 又需要挂在一个物体上,因此,一个技能实体需要一个空物体,空物体上面要挂一个 FlowScriptController,这个 FlowScriptController 的 FlowScript 要赋为 ScriptableAbility 中设置好的 FlowScript

Assets/MeowFramework/Core/Entity/AbilityEntity.cs

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 11/04/2022 17:49
// 最后一次修改于: 11/04/2022 20:27
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------

using FlowCanvas;
using Sirenix.OdinInspector;

namespace MeowFramework.Core.Entity
{
   
   
    public class AbilityEntity : SerializedMonoBehaviour
    {
   
   
        /// <summary>
        /// FlowScript 控制器
        /// </summary>
        private FlowScriptController flowScriptController;
        
        private void OnEnable()
        {
   
   
            flowScriptController = GetComponent<FlowScriptController>();
        }

        /// <summary>
        /// 启动技能
        /// </summary>
        public void StartAbility()
        {
   
   
            flowScriptController.StartBehaviour();
        }

        /// <summary>
        /// 暂停技能
        /// </summary>
        public void PauseAbility()
        {
   
   
            flowScriptController.PauseBehaviour();
        }
        
        /// <summary>
        /// 结束技能
        /// </summary>
        public void StopAbility()
        {
   
   
            flowScriptController.StopBehaviour();
        }

        /// <summary>
        /// 重置技能
        /// </summary>
        public void ResetAbility()
        {
   
   
            flowScriptController.RestartBehaviour();
        }
    }
}

有一点很怪的是,private Dictionary 在监视器上的设置没办法保存下来。
点开挂有 ActorBase 的 GameObject,在监视器中选择 ActorBase,为暴露出来的 Dictionary 添加一项,然后离开监视器界面,再点开原来的 GameObject,监视器中 ActorBase 的 Dictionary 又变为初始化的空值了
但是 public Dictionary 就不会
所以就,Odin 很神奇

1.3 ActorBase v1

实际释放技能的时候就是生成一个技能实体,然后调用这个技能实体的方法

Assets/MeowFramework/Core/Entity/Actor/ActorBase.cs

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 28/03/2022 17:43
// 最后一次修改于: 11/04/2022 20:41
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------

using System.Collections.Generic;
using System.ComponentModel;
using MeowFramework.Core.FrameworkComponent;
using MeowFramework.Core.Scriptable;
using NodeCanvas.Framework;
using Sirenix.OdinInspector;
using UnityEngine;

namespace MeowFramework.Core.Actor
{
   
   
    public class ActorBase : SerializedMonoBehaviour
    {
   
   
        /// <summary>
        /// 血量
        /// </summary>
        [BoxGroup("Attribute")]
        [Tooltip("血量")] 
        public ActorAttribute<float> HP = new ActorAttribute<float>();
        
        /// <summary>
        /// 最大血量
        /// </summary>
        [BoxGroup("Attribute")]
        [Tooltip("最大血量")] 
        public ActorAttribute<float> MaxHP = new ActorAttribute<float>();

        /// <summary>
        /// 可用技能字典
        /// </summary>
        [BoxGroup("GamePlay")]
        [Tooltip("可用技能字典")]
        public Dictionary<int,ScriptableAbility> availableAbilityDictionary = new Dictionary<int,ScriptableAbility>();

        /// <summary>
        /// 出生时附加的 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值