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

继承Unity UI Button后变量无法在Inspector正常显示

解决Unity继承Button的自定义类字段无法在正常Inspector显示的问题

问题原因

Unity内置的Button组件使用官方自定义的ButtonEditor渲染Inspector面板,默认情况下该编辑器只会绘制Button基类的属性,不会自动识别并显示子类新增的序列化字段——这就是为什么你给私有字段加了[SerializeField],却只能在调试模式下看到它们的原因。

解决方案

方法1:编写自定义编辑器(推荐)

创建继承自ButtonEditor的自定义编辑器类,手动添加新增字段的渲染逻辑,同时保留原Button的Inspector内容。

  1. 自定义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);
    }
}
  1. 自定义编辑器代码
    在项目中创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:42:13