Quick answer: The field's type is likely not serializable. Unity only serializes primitives, strings, enums, arrays/lists of serializable types, UnityEngine.Object references, and classes with [System.Serializable]. Interfaces and dictionaries will not appear.

Here is how to fix Unity serializedfield not showing inspector. You add [SerializeField] to a private field, but it does not appear in the Inspector. No errors, no warnings — just a missing field. The attribute is correct and the code compiles, but Unity's serialization system has strict rules about what it will display.

The Symptom

A private field with [SerializeField] on a MonoBehaviour or ScriptableObject is invisible in the Inspector. The component is there, other fields show up, but the new one is missing. Sometimes a field was visible before and disappeared after a code change.

What Causes This

1. Non-serializable field type. Unity serializes: primitives, strings, enums, arrays and Lists of serializable types, UnityEngine.Object subclasses, and custom classes marked [System.Serializable]. Interfaces, dictionaries, multidimensional arrays, and unmarked classes are invisible.

2. Compilation error elsewhere. Any compile error in any script prevents recompilation. The Inspector shows the last compiled version, which does not include your new field.

3. [HideInInspector] attribute. If both [SerializeField] and [HideInInspector] are present, the field is serialized but hidden. This sometimes happens when attributes are applied to a block of fields.

4. Custom property drawer hiding the field. A custom Editor or PropertyDrawer for the component can override what the Inspector displays. Your new field may not be included in its layout.

5. Wrong script attached. If the script reference is broken or you have two scripts with similar names, the Inspector will not show the expected fields. Check for "Missing Script" warnings.

The Fix

Step 1: Use only serializable types.

using UnityEngine;

public class PlayerConfig : MonoBehaviour
{
    // These WILL show in the Inspector
    [SerializeField] private int _health = 100;
    [SerializeField] private string _name;
    [SerializeField] private GameObject _prefab;
    [SerializeField] private AttackData _attack;

    // Will NOT show - Dictionary not serializable
    // [SerializeField] private Dictionary<string, int> _inv;

    // Will NOT show - interface not serializable
    // [SerializeField] private IDamageable _target;
}

// Custom classes MUST have this attribute
[System.Serializable]
public class AttackData
{
    public float damage = 10f;
    public float cooldown = 0.5f;
}

Step 2: Check for conflicting attributes.

// Visible: SerializeField alone
[SerializeField] private float _speed = 5f;

// HIDDEN: HideInInspector wins over SerializeField
[SerializeField, HideInInspector]
private float _hidden;

// For polymorphic fields, use SerializeReference
[SerializeReference] private IAbility _ability;

Step 3: Validate serialized fields via editor script.

#if UNITY_EDITOR
[ContextMenu("List Serialized Fields")]
void ListFields()
{
    var so = new UnityEditor.SerializedObject(this);
    var prop = so.GetIterator();
    while (prop.NextVisible(true))
        Debug.Log($"{prop.name} ({prop.propertyType})");
}
#endif

Related Issues

If fields show up but lose values when loading via Addressables, see Addressables failed to load asset. If shadows render incorrectly on objects with serialized material references, check shadow flickering and z-fighting.

No [System.Serializable] on the class? Unity pretends the field does not exist.