unity简单技能系统

unity简单技能系统

类类型概览

  • CharacterSkillManager      角色技能管理器 挂载在角色 持有SkillData与释放器 通过释放器进行技能释放

  • SkillDeployer                       技能释放器基类 持有选取类型与影响效果两个接口 抽象函数释放方式

  • SkillData                             技能数据类 保存技能基本信息、攻击基本信息、影响效果、选择类型等

  • IImpactEffects                     影响效果接口 持有效果执行方法Execute(SkillDeployer deployer)

  • IAttackSelector                   选区算法接口 持有选区算法 SelectTarget(SkillData data)

  • DeployerConfigFactory      释放器算法工厂返回具体类方法

  • Enum SkillAttackType         攻击类型 群体/单体

  • Enum SelectorType           选择类型 扇形/矩形


  • MeleeSkillDeployer           近战释放器 继承自 SkillDeployer

  • CostSPImpact                 消耗法力值 实现IImpactEffects接口

  • HurtHPImpact                 伤害生命

  • AddSPImapact                 增加蓝耗

具体思路

  • 将技能拆分为 数据(伤害,范围) 效果 (浮空,减速) 根据数据不同例如 范围、持续时间等 根据不同效果构建不同效果 例如: 英雄联盟中 艾希的W 技能与E技能 前者向前方一定扇形的敌人造成伤害与减速 两个效果 ,后者 向释放方向发射弹体 对沿途进行视野暴露一个效果 。
  • 拿到相应技能该像哪里释放,如何获得效果对象,我们需要一个替我们处理技能释放的对象 去处理技能从初始化到释放的过程。 SkillDeployer 持有 技能数据、影响效果接口与选区算法接口 ,在具体创建时通过释放器工厂拿到相应具体实现。

代码具体流程

  • 技能管理器持有技能数据 与唯一选择器 检测到相应输入 通过唯一ID获取技能数据 根据技能数据 例如蓝耗 判断是否能够释放 达到释放条件后 创建选择器
  • 选择器根据传入技能数据 影响效果 通过工厂 拿到具体方法 进行释放

效果

释放前
释放后
结果

角色脚本1
角色脚本2
受击脚本

实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//人物状态
public class CharacterStateData : MonoBehaviour
{
   
     public float HP = 100;
     public float SP = 100;
     public float BeAttack = 10;//攻击力
     
    void Start()
    {
   
        
    }

    void Update()
    {
   
        
    }
}



using System.Collections;
using System.Collections.Generic;
using TestSkillSystem;
using UnityEngine;
using Debug = UnityEngine.Debug;
//技能管理器
public class CharacterSkillManager : MonoBehaviour
{
   

    
    private Transform m_Transform;

    private CharacterStateData m_PlayerData;

    private SkillData m_NowSKill;
    //技能列表
    public List<SkillData> Skills;
    private SkillDeployer m_Deployer;
    
    private void Awake()
    {
   
        m_Transform = GetComponent<Transform>();
        m_PlayerData = GetComponent<CharacterStateData>();
        m_Deployer = GetComponent<SkillDeployer>();
    }

    private void Start()
    {
   
        for (int i = 0; i < Skills.Count; i++)
        {
   
            InitSkill(Skills[i]);
        }
        
       
    }

  
    private void Update()
    {
   
        if (Input.GetKeyDown(KeyCode.Q))
        {
   
           useSkill();
        }
        
    }

    private void useSkill()
    {
   
        m_NowSKill = PrepareSkill(1001);
        if (m_NowSKill == null)
        {
   
            return;
        }
        GenerateSkill(m_NowSKill);
    }




    /// <summary>
    /// 生成技能
    /// </summary>
    public void GenerateSkill(SkillData data)
    {
   
        GameObject skill = Instantiate(data.skillPrefab, m_Transform.position, m_Transform.rotation);
        
        SkillDeployer skillDeployer = skill.GetComponent<SkillDeployer>();
        skillDeployer.skillData = data;
        skillDeployer.DeploySkill();
        
        //定时销毁
        Destroy(skill, data.durationTime);
        //开启cd
        StartCoroutine(CoolTimeDown(data))
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值