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

Unity接口要求的带{get;set;}的public float无法在Inspector显示

Unity接口自动属性无法在Inspector显示的解决办法

Unity Inspector默认不会序列化显示带{get; set;}的自动属性,哪怕添加[SerializeField]标签也无效——因为Unity的序列化系统针对的是字段,而非属性。要同时满足接口的访问器要求和Inspector可编辑的需求,有两种可行方案:

方案一:私有字段+显式接口实现

通过私有可序列化字段承载数值,再用显式接口实现对接接口的属性要求:

public interface IValueInterface
{
    float value { get; set; }
}

using UnityEngine;

public class MyClass : MonoBehaviour, IValueInterface
{
    [SerializeField] private float _nourishmentValue = 0.1f;

    // 显式实现接口,将接口的value映射到私有字段
    float IValueInterface.value
    {
        get => _nourishmentValue;
        set => _nourishmentValue = value;
    }

    // 可选:添加类自身的公共属性,方便代码内直接访问
    public float NourishmentValue
    {
        get => _nourishmentValue;
        set => _nourishmentValue = value;
    }
}

这样私有字段_nourishmentValue会在Inspector中显示并可编辑,接口的value属性则通过字段完成读写,完全符合接口契约。

方案二:使用[field: SerializeField]特性(Unity 2020.1+)

如果你的Unity版本在2020.1及以上,可以直接用字段级序列化特性让自动属性被Inspector识别:

public interface IValueInterface
{
    float value { get; set; }
}

using UnityEngine;

public class MyClass : MonoBehaviour, IValueInterface
{
    [field: SerializeField] public float nourishmentValue { get; set; } = 0.1f;

    // 显式实现接口,指向自动属性
    float IValueInterface.value
    {
        get => nourishmentValue;
        set => nourishmentValue = value;
    }
}

[field: SerializeField]会告诉Unity序列化自动属性背后生成的私有字段,这样nourishmentValue就能直接在Inspector中显示编辑,同时保留接口要求的访问器结构。

注意事项

  • 方案二仅支持Unity 2020.1及更高版本,低版本请使用方案一
  • 显式接口实现可以避免接口属性与类自身成员的命名冲突,也更贴合接口的契约设计

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:22:52