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
相关产品推荐
相关产品推荐

