A recreated Inspector view. A private field with SerializeField is visible.
A recreated Inspector view. A private field with SerializeField is visible.

The Inspector reads fields, not ordinary properties

Unity serialization works on fields in your C# types. Add [SerializeField] to expose a private field without making every caller write to it. A public property can then expose a read-only view.

using UnityEngine;

public class EnemyTuning : MonoBehaviour
{
    [SerializeField] private float moveSpeed = 3.5f;

    public float MoveSpeed => moveSpeed;
}

Remove the common blockers

A SerializeField does not make static, const, or readonly fields appear. Dictionaries and multidimensional arrays are also outside Unity's default serialization support. Clear every compile error in the Console before judging the Inspector; an old script can make the panel look stale.

using System;
using System.Collections.Generic;
using UnityEngine;

[Serializable]
public class Wave
{
    public int count = 4;
    public float interval = 1.5f;
}

public class SpawnConfig : MonoBehaviour
{
    [SerializeField] private Wave firstWave;
    [SerializeField] private List<Wave> waves = new List<Wave>();
}

If a renamed value resets

When a field is renamed, FormerlySerializedAs can keep the old serialized value. Also check whether only a Prefab instance differs. That is an instance override, not a missing field.

using UnityEngine;
using UnityEngine.Serialization;

public class EnemyTuning : MonoBehaviour
{
    [FormerlySerializedAs("speed")]
    [SerializeField] private float moveSpeed = 3.5f;
}
Official documentation checkedUnity serialization rules ↗