Unity继承中子类Inspector隐藏父类字段及currentState修改咨询
问题解答
关于父类字段隐藏的问题
没错,不使用自定义Inspector(Editor脚本)的前提下,你没办法在EnemyBattleLogic的Inspector面板中隐藏父类EnemyMoveLogic里标记为[SerializeField]的movingSpeed和detectionDistance字段。Unity的默认Inspector会自动展示所有继承自父类的序列化字段,不管子类是否需要,只要父类用[SerializeField]标记了,就会显示出来。
修改currentState的最佳方式
虽然currentState是internal修饰的,子类可以直接修改,但更符合面向对象设计的做法是在父类中封装状态变更的逻辑:
在父类添加状态设置方法
在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); } }直接修改(仅适用于无额外逻辑场景)
如果状态切换不需要任何校验或附加逻辑,也可以直接在子类中修改currentState,因为它是internal修饰的,子类有权限访问:public class EnemyBattleLogic : EnemyMoveLogic { void SomeBattleMethod() { currentState = CurrentState.Chase; } }但这种方式可维护性较差,后续如果需要在状态切换时添加逻辑,就得修改所有直接赋值的地方,因此优先推荐第一种封装方法。
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

