설명용으로 재현한 Inspector 화면입니다. private 필드에 SerializeField를 붙인 값은 보입니다.
설명용으로 재현한 Inspector 화면입니다. private 필드에 SerializeField를 붙인 값은 보입니다.

Inspector는 프로퍼티가 아니라 필드를 읽습니다

Unity 직렬화는 C# 프로퍼티보다 필드를 기준으로 움직입니다. private 필드를 Inspector에 노출하려면 [SerializeField]를 붙이면 됩니다. public으로 열어 두는 것보다 코드에서 쓰는 범위를 좁힐 수 있어 실수도 줄어듭니다.

using UnityEngine;

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

    public float MoveSpeed => moveSpeed;
}

안 보이는 코드부터 지웁니다

[SerializeField]가 있어도 static, const, readonly 필드는 Inspector에 나타나지 않습니다. Dictionary, 다차원 배열처럼 Unity가 기본으로 직렬화하지 않는 타입도 마찬가지입니다. Console에 컴파일 오류가 하나라도 남아 있으면 Inspector가 예전 스크립트를 들고 있을 수 있으니 오류부터 0개로 만드세요.

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>();
}

값을 바꿨는데 다시 돌아오면

필드 이름을 바꾼 뒤 기존 값이 사라졌다면 FormerlySerializedAs로 예전 이름을 알려 주세요. Prefab 인스턴스에서만 값이 달라지는지도 같이 봐야 합니다. 그 값은 스크립트 문제가 아니라 인스턴스 override일 수 있습니다.

using UnityEngine;
using UnityEngine.Serialization;

public class EnemyTuning : MonoBehaviour
{
    [FormerlySerializedAs("speed")]
    [SerializeField] private float moveSpeed = 3.5f;
}
확인한 공식 문서Unity 직렬화 규칙 ↗