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获取技能数据 根据技能数据 例如蓝耗 判断是否能够释放 达到释放条件后 创建选择器
- 选择器根据传入技能数据 影响效果 通过工厂 拿到具体方法 进行释放
效果
实现
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))