Unity回合制战斗系统能否将State类作为变量存储在Unit类中
你的思路完全可行,使用Unity原生的ScriptableObject封装状态创建逻辑是当前场景下的最优实现,可完全消除冗长的switch分支,具体实现如下:
步骤1:创建状态工厂基类
所有状态的创建逻辑都通过该基类的子类实现,对应资产可以直接挂载到单位prefab上序列化存储:
using UnityEngine; [CreateAssetMenu(fileName = "NewStateFactory", menuName = "战斗系统/状态工厂")] public abstract class StateFactory : ScriptableObject { public abstract State CreateState(FightSystem fightSystem); }
步骤2:为每个状态实现对应的工厂子类
每个自定义State对应一个工厂子类,仅需重写创建逻辑:
// 幽魂攻击状态工厂 public class GhostAttackStateFactory : StateFactory { public override State CreateState(FightSystem fightSystem) { return new GhostAttack(fightSystem); } } // 幽魂防御状态工厂 public class GhostDefendStateFactory : StateFactory { public override State CreateState(FightSystem fightSystem) { return new GhostDefend(fightSystem); } }
新增状态时仅需新增对应State类和工厂子类即可,无需修改现有逻辑,符合开闭原则。
步骤3:修改单位类的状态存储字段
将原来存储枚举的列表替换为存储状态工厂的引用:
// 敌方单位类上的可用状态列表,可直接在Inspector中为不同prefab配置不同的可用状态 public List<StateFactory> availableStates;
步骤4:替换状态选择逻辑
删除原有SelectState方法中的switch分支,敌方回合选状态时直接从列表中随机取值调用即可:
// 敌方回合触发时的状态选择逻辑 var randomIndex = Random.Range(0, enemyUnit.availableStates.Count); var targetState = enemyUnit.availableStates[randomIndex].CreateState(FightSystem); FightSystem.SetState(targetState);
该方案的优势:
- 彻底消除switch分支,状态数量不受限制
- 不同单位的可用状态直接在Inspector中可视化配置,无需修改代码,支持策划直接调整
- 扩展成本极低,新增状态不需要修改任何公共逻辑代码
内容的提问来源于stack exchange,提问作者user16602651
相关产品推荐
相关产品推荐

