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

Unity继承中子类Inspector隐藏父类字段及currentState修改咨询

问题解答

关于父类字段隐藏的问题

没错,不使用自定义Inspector(Editor脚本)的前提下,你没办法在EnemyBattleLogic的Inspector面板中隐藏父类EnemyMoveLogic里标记为[SerializeField]的movingSpeed和detectionDistance字段。Unity的默认Inspector会自动展示所有继承自父类的序列化字段,不管子类是否需要,只要父类用[SerializeField]标记了,就会显示出来。

修改currentState的最佳方式

虽然currentState是internal修饰的,子类可以直接修改,但更符合面向对象设计的做法是在父类中封装状态变更的逻辑:

  1. 在父类添加状态设置方法
    在EnemyMoveLogic里新增一个方法,用来统一控制currentState的修改,这样可以在父类层面处理状态切换的校验、触发回调等逻辑,避免子类随意修改导致的逻辑混乱:

    public class EnemyMoveLogic : MonoBehaviour
    {
        // 原有代码...
    
        internal void SetCurrentState(CurrentState newState)
        {
            // 可添加状态切换校验,比如跳过重复状态设置
            if (currentState == newState) return;
    
            currentState = newState;
            // 还可在这里触发状态变更事件,通知其他组件状态变化
            // OnStateChanged?.Invoke(newState);
        }
    }
    

    然后在EnemyBattleLogic中调用这个方法来修改状态:

    public class EnemyBattleLogic : EnemyMoveLogic
    {
        // 原有代码...
    
        void SomeBattleMethod()
        {
            // 通过封装方法修改状态
            SetCurrentState(CurrentState.Chase);
        }
    }
    
  2. 直接修改(仅适用于无额外逻辑场景)
    如果状态切换不需要任何校验或附加逻辑,也可以直接在子类中修改currentState,因为它是internal修饰的,子类有权限访问:

    public class EnemyBattleLogic : EnemyMoveLogic
    {
        void SomeBattleMethod()
        {
            currentState = CurrentState.Chase;
        }
    }
    

    但这种方式可维护性较差,后续如果需要在状态切换时添加逻辑,就得修改所有直接赋值的地方,因此优先推荐第一种封装方法。

内容的提问来源于stack exchange,提问作者Ilya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:15:05