You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:06:04