《霸三国》百变武将技能
发布时间:06/21 10:50:30
从零落地Unity引擎《霸三国》百变武将技能纯干货实操指南
();
Rigidbody2D rb = enemy.AddComponent();
rb.gravityScale = 0;
rb.constraints = RigidbodyConstraints2D.FreezeAll;
}
// 默认选中第一个敌人
currentTarget = GameObject.Find("敌人1");
}
void Update()
{
// 更新所有技能的冷却时间
for (int i = 0; i < skillCooldowns.Length; i++)
{
if (skillCooldowns[i] > 0)
{
skillCooldowns[i] -= Time.deltaTime;
}
}
// 按1、2、3键对应释放第0、1、2个技能
if (Input.GetKeyDown(KeyCode.Alpha1) && skillCooldowns[0] <= 0)
{
equippedSkills[0].Execute(gameObject, currentTarget);
skillCooldowns[0] = equippedSkills[0].cooldownTime;
}
if (Input.GetKeyDown(KeyCode.Alpha2) && skillCooldowns[1] <= 0)
{
equippedSkills[1].Execute(gameObject, currentTarget);
skillCooldowns[1] = equippedSkills[1].cooldownTime;
}
if (Input.GetKeyDown(KeyCode.Alpha3) && skillCooldowns[2] <= 0)
{
equippedSkills[2].Execute(gameObject, currentTarget);
skillCooldowns[2] = equippedSkills[2].cooldownTime;
}
}
}
```
一、准备工作(10分钟搞定)
所有操作依赖Unity 2022.3 LTS稳定版,无需额外付费插件。
- 下载安装Unity Hub:访问Unity官网直接下载Windows/Mac版:https://unity.com/download
- 安装指定Unity版本:打开Unity Hub→左侧“安装编辑器”→搜索“2022.3”→勾选“Windows Build Support(如果是Mac则勾选Mac)”→点击“安装”
- 创建基础项目:打开Unity Hub→左侧“项目”→右上角“新建项目”→选择“2D Core”模板→项目名填“BaSanGuo_Skill”→保存位置选无中文路径的文件夹→点击“创建项目”
二、核心架构设计(15分钟理解)
采用策略模式+ScriptableObject(SO)资源配置的组合方案:SO存技能“静态数据”(伤害、冷却、图标等),策略脚本处理“动态逻辑”(单体/群体、减速/眩晕、近战/远程特效触发等),后续加新技能只需新增SO和对应策略类,零代码修改现有系统。
在Project窗口右键依次创建文件夹,搭建固定目录结构:
- Scripts/Skill(技能核心脚本)
- Resources/SkillData(SO技能数据,必须放Resources才能动态加载)
- Art/Sprites(后续随便找3张武将/技能图标占位,或跳过,纯逻辑也能运行)
三、从零写技能系统脚本(45分钟编码)
3.1 技能数据基类SO
在Scripts/Skill下右键→Create→C Script,命名为SkillBaseSO,直接复制以下代码:
```csharp using UnityEngine; // 技能类型枚举,目前支持单体攻击、群体减速、远程眩晕,后续加只需在此处加枚举 public enum SkillType { SingleAttack, GroupSlow, RangedStun } // 所有技能数据的基类,必须是ScriptableObject public abstract class SkillBaseSO : ScriptableObject { [Header("基础通用信息")] public string skillName; // 技能名 public Sprite skillIcon; // 技能图标 public float cooldownTime; // 冷却时间(秒) public SkillType skillType; // 技能类型,对应策略类 // 执行技能的抽象方法,由子类策略脚本实现 public abstract void Execute(GameObject caster, GameObject target); } ```3.2 具体技能策略类
先写3个常用技能,对应3.1的3个枚举,代码结构一致,只需改Execute方法的逻辑:
-
单体攻击策略类SingleAttackSO.cs:
```csharp using UnityEngine; // 创建SO的右键菜单入口 [CreateAssetMenu(fileName = "NewSingleAttack", menuName = "BaSanGuo/Skill/SingleAttack")] public class SingleAttackSO : SkillBaseSO { [Header("单体攻击专属数据")] public int damage; // 伤害值 // 实现Execute:简单打印日志模拟伤害,正式开发替换为血量扣减逻辑 public override void Execute(GameObject caster, GameObject target) { Debug.Log($"{caster.name} 释放了 {skillName},对 {target.name} 造成了 {damage} 点伤害!"); } } ``` -
群体减速策略类GroupSlowSO.cs:
```csharp using UnityEngine; [CreateAssetMenu(fileName = "NewGroupSlow", menuName = "BaSanGuo/Skill/GroupSlow")] public class GroupSlowSO : SkillBaseSO { [Header("群体减速专属数据")] public float slowDuration; // 减速时长 public float slowPercent; // 减速百分比(0-1) public override void Execute(GameObject caster, GameObject target) { // 模拟获取范围内所有敌人 Collider2D[] enemies = Physics2D.OverlapCircleAll(caster.transform.position, 3f); foreach (Collider2D enemy in enemies) { if (enemy.CompareTag("Enemy")) { Debug.Log($"{caster.name} 释放了 {skillName},对 {enemy.name} 施加了 {slowPercent100}% 减速,持续 {slowDuration} 秒!"); } } } } ``` -
远程眩晕策略类RangedStunSO.cs:
```csharp using UnityEngine; [CreateAssetMenu(fileName = "NewRangedStun", menuName = "BaSanGuo/Skill/RangedStun")] public class RangedStunSO : SkillBaseSO { [Header("远程眩晕专属数据")] public float stunDuration; // 眩晕时长 public float attackRange; // 攻击范围 public override void Execute(GameObject caster, GameObject target) { if (Vector2.Distance(caster.transform.position, target.transform.position) <= attackRange) { Debug.Log($"{caster.name} 释放了 {skillName},将 {target.name} 眩晕了 {stunDuration} 秒!"); } else { Debug.Log($"{target.name} 超出 {skillName} 的攻击范围!"); } } } ```
3.3 武将技能管理组件
在Scripts/Skill下创建GeneralSkillManager.cs,挂在武将对象上控制技能释放和冷却:
```csharp using UnityEngine; public class GeneralSkillManager : MonoBehaviour { [Header("武将配置")] public GameObject enemyPrefab; // 临时敌人预制体占位 public SkillBaseSO[] equippedSkills; // 当前装备的所有技能SO private float[] skillCooldowns; // 记录每个技能的当前冷却剩余时间 private GameObject currentTarget; // 当前选中的目标 void Start() { // 初始化冷却时间数组 skillCooldowns = new float[equippedSkills.Length]; // 临时生成2个敌人方便测试 for (int i = 0; i < 2; i++) { GameObject enemy = Instantiate(enemyPrefab); enemy.name = $"敌人{i+1}"; enemy.tag = "Enemy"; enemy.transform.position = new Vector2(i+1, 0); // 临时给敌人加个碰撞体和刚体 enemy.AddComponent四、配置资源与测试(20分钟收尾)
4.1 创建3个测试技能SO
在Project窗口的Resources/SkillData下:
- 右键→BaSanGuo→Skill→SingleAttack,命名为“SingleSlash”,配置:skillName=横扫千军,cooldownTime=2,damage=100
- 右键→BaSanGuo→Skill→GroupSlow,命名为“WindBlow”,配置:skillName=风起云涌,cooldownTime=5,slowDuration=3,slowPercent=0.5
- 右键→BaSanGuo→Skill→RangedStun,命名为“StoneThrow”,配置:skillName=飞石击将,cooldownTime=3,stunDuration=2,attackRange=5
4.2 创建武将与敌人预制体
- 在Hierarchy窗口右键→2D Object→Sprites→Square,命名为“LiuBei”(刘备),作为武将,挂GeneralSkillManager.cs
- 在Hierarchy窗口右键→2D Object→Sprites→Square,命名为“EnemyTemp”,拖到Project窗口的根目录(或Art文件夹)做成预制体,然后删除Hierarchy里的EnemyTemp
- 给LiuBei的GeneralSkillManager组件:EnemyPrefab拖刚才的EnemyTemp,Equipped Skills拖入刚才的3个SO(顺序:SingleSlash→WindBlow→StoneThrow)
- 在Hierarchy窗口选中Main Camera,调整Position为(0,0,-10),Size为3
4.3 运行测试
- 点击Unity顶部的播放按钮??
- 观察Console窗口(顶部Window→General→Console打开):
- 按1键:打印“LiuBei 释放了 横扫千军,对 敌人1 造成了 100 点伤害!”
- 按2键:打印“LiuBei 释放了 风起云涌,对 敌人1 施加了 50% 减速,持续 3 秒!”“LiuBei 释放了 风起云涌,对 敌人2 施加了 50% 减速,持续 3 秒!”
- 按3键:观察敌人位置是否在5范围内,默认的话会打印“LiuBei 释放了 飞石击将,将 敌人1 眩晕了 2 秒!”;如果把敌人1拖到Position(6,0)再按3,会打印超出范围
- 连续按1键:第二次会等2秒冷却后才生效
五、快速扩展新技能(5分钟学会)
- 在SkillType枚举里加新类型,比如“HealSelf”(治疗自己)
- 新建HealSelfSO.cs,继承SkillBaseSO,加专属数据(比如healAmount),实现Execute方法
- 新建对应的SO资源,挂在武将的Equipped Skills里即可
版权保护: 本文由 741卡盟 原创,转载请保留链接: http://741ka.com/gamenews/21672.html
- 上一篇:ff12官方职业搭配是什么
- 下一篇:夜兰武器哪个好
