三角洲辅助卡盟新版上线,应有尽有
当前位置:首页 > 游戏攻略> 正文

《霸三国》百变武将技能

发布时间:06/21 10:50:30
从零落地Unity引擎《霸三国》百变武将技能纯干货实操指南

一、准备工作(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(); 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; } } } ```

四、配置资源与测试(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