






















在 Unity 中,public 和 [SerializeField] 都用于在 Inspector 中显示字段,但它们的核心区别在于访问权限和封装性。
| 特性 | public | [SerializeField] |
|---|---|---|
| Inspector 可见性 | ✅ 可见 | ✅ 可见 |
| 外部访问权限 | ✅ 任何类都可访问 | ❌ 只有本类可访问 |
| 封装性 | ❌ 破坏封装 | ✅ 保持封装 |
| 使用场景 | 需要外部访问 | 仅需 Inspector 编辑 |
public 字段public class Player : MonoBehaviour { public float speed = 5f; // 其他类可以直接修改 }
player.speed 访问和修改[SerializeField] 私有字段public class Player : MonoBehaviour { [SerializeField] private float speed = 5f; // 只有本类可修改 }
[SerializeField] 的场景public class Player : MonoBehaviour { [SerializeField] private float moveSpeed = 5f; [SerializeField] private GameObject bulletPrefab; [SerializeField] private int maxHealth = 100; // 如果需要外部访问,提供公共属性 public float MoveSpeed => moveSpeed; public int MaxHealth => maxHealth; }
public 的场景public class GameManager : MonoBehaviour { // 其他类需要频繁修改 public static GameManager Instance; // 需要被其他系统直接调用 public void StartGame() { } }
public class Player : MonoBehaviour { [SerializeField] private int health = 100; public int Health { get => health; set { health = Mathf.Clamp(value, 0, maxHealth); OnHealthChanged?.Invoke(health); } } public event System.Action<int> OnHealthChanged; }
[SerializeField] 的扩展public class Weapon : MonoBehaviour { [SerializeField] private int damage = 10; [SerializeField] [Range(0, 100)] private int accuracy = 80; [SerializeField] [Tooltip("子弹速度,单位:米/秒")] private float bulletSpeed = 100f; [SerializeField] [HideInInspector] private int serialNumber; // 序列号不在Inspector显示 }
[SerializeField] private:保持封装性,只暴露必要的 Inspector 接口public:如静态单例、公共方法等这样做既能保持代码的健壮性,又能充分利用 Unity Inspector 的可视化编辑优势。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。