继承Unity UI Button后变量无法在Inspector正常显示
问题原因
Unity内置的Button组件使用官方自定义的ButtonEditor渲染Inspector面板,默认情况下该编辑器只会绘制Button基类的属性,不会自动识别并显示子类新增的序列化字段——这就是为什么你给私有字段加了[SerializeField],却只能在调试模式下看到它们的原因。
解决方案
方法1:编写自定义编辑器(推荐)
创建继承自ButtonEditor的自定义编辑器类,手动添加新增字段的渲染逻辑,同时保留原Button的Inspector内容。
- 自定义Button类代码
using UnityEngine; using UnityEngine.UI; public class PlayPauseButton : Button { [SerializeField] private Image _playIcon; [SerializeField] private Image _pauseIcon; // 示例自定义功能 public void TogglePlayPauseState() { _playIcon.gameObject.SetActive(!_playIcon.isActiveAndEnabled); _pauseIcon.gameObject.SetActive(!_pauseIcon.isActiveAndEnabled); } }
- 自定义编辑器代码
在项目中创建Editor文件夹(无则新建),在该文件夹下创建如下脚本:
using UnityEditor; using UnityEditor.UI; [CustomEditor(typeof(PlayPauseButton))] public class PlayPauseButtonEditor : ButtonEditor { private SerializedProperty _playIcon; private SerializedProperty _pauseIcon; protected override void OnEnable() { base.OnEnable(); // 获取自定义字段的序列化引用 _playIcon = serializedObject.FindProperty("_playIcon"); _pauseIcon = serializedObject.FindProperty("_pauseIcon"); } public override void OnInspectorGUI() { // 先绘制自定义字段 serializedObject.Update(); EditorGUILayout.PropertyField(_playIcon); EditorGUILayout.PropertyField(_pauseIcon); serializedObject.ApplyModifiedProperties(); // 绘制原Button组件的Inspector内容 base.OnInspectorGUI(); } }
完成后回到Unity编辑器,选中挂载PlayPauseButton的对象,就能在正常模式的Inspector里看到_playIcon和_pauseIcon字段了。
方法2:改用public字段(不推荐)
如果不想编写编辑器脚本,可将私有字段改为public,Unity会自动在Inspector中显示它们。但这种方法会破坏封装性,不建议在正式项目中使用:
public Image playIcon; public Image pauseIcon;
内容的提问来源于stack exchange,提问作者Indrit Vaka
相关产品推荐
相关产品推荐

