在 Unity 中,[SerializeField]
属性用于让私有字段在 Unity 编辑器的 Inspector 面板中可见并可编辑。借助这一特性,开发者可以在保持变量封装性的同时,在编辑器中对其进行配置和调优。
🧠 为什么使用 [SerializeField]
?
- 封装性:变量保持私有,这是良好的编码实践。
- 编辑器访问:依然可以在 Unity Inspector 中设定和调整变量值。
- 更清晰的 API:避免其他脚本访问这些字段,从而减少意外修改的风险。
🆚 与 public
的对比:
方式 | Inspector 是否可见 | 是否可被其他脚本访问 |
---|---|---|
public | ✅ 是 | ✅ 是 |
private | ❌ 否 | ❌ 否 |
[SerializeField] private | ✅ 是 | ❌ 否 |
🧪 代码示例:
以下代码改编自 Unity 2D 小球移动与跳跃教程:第一个 C# 脚本项目实战:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BallScript : MonoBehaviour
{
private Rigidbody2D rb;
// 将之前的 public 属性使用 [SerializeField] 重构为 private
[SerializeField] private float moveSpeed;
[SerializeField] private float jumpForce;
private float xInput;
void Start()
{
// 保持 rb 私有,并无需通过 [SerializeField] 暴露到 Inspector
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
xInput = Input.GetAxis("Horizontal");
rb.velocity = new Vector2(xInput * moveSpeed, rb.velocity.y);
if (Input.GetKeyDown(KeyCode.Space))
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}
}
}