Wie die meisten bestimmt wissen, werden öffentliche Felder in Unity-Scripts (MonoBehaviour) automatisch von Unity im Editor angezeigt und auch deren Werte innerhalb der Szene gespeichert. Geschützte und private Felder werden hingegen nicht angezeigt oder gespeichert.

Interessant ist, dass man dieses Verhalten mit bestimmten Attributen beeinflussen kann:

public class EditorVisibility : MonoBehaviour
{
	// Fields decorated with the HideInInspector-attribute do
	// not show up in the editor but will be serialized
	[HideInInspector] public int invisible = 5;

	// Fields decorated with the SerializeField-attribute are
	// visible in the editor and will be serialized
	[SerializeField] private int visible = 5;

	// Properties can't be serialized
	// (You can serialize the backing field of a property, however)
	[SerializeField] public int MyProperty { get; set; } // does not work

	// Fields decorated with the NonSerialized-attribute do
	// not show up in the editor and won't be serialized
	[System.NonSerialized] public int invisibleNotSerialized = 5;
}

Aber in welchem Fall ist was sinnvoll?

HideInInspector ist vor allem dann sinnvoll, wenn es ein aussenstehendes Editor-Script gibt, das dieses Feld bearbeitet. Das Feld kann so vor dem Benutzer versteckt werden, während das Editor-Script weiterhin Zugriff darauf hat. Da es immer noch serialisiert wird, werden die Werte auch in der Szene gespeichert, was im Falle eines Editor-Scripts wünschenswert ist.

SerializeField hingegen, sollte möglichst oft anstelle von öffentlichen Feldern benutzt werden. In den meisten Fällen macht es nämlich keinen Sinn, dass ein Feld öffentlich sichtbar ist und jedes externe Script nach belieben die Werte verändern kann. Mit SerializeField bleiben die Felder vor externen Zugriffen geschützt und doch kann der Benutzer die Werte im Editor anpassen. Die Werte werden natürlich auch in der Szene gespeichert.

System.NonSerialized verhält sich ähnlich wie HideInInspector, allerdings werden die Werte nicht in der Szene gespeichert. Das macht dann Sinn, wenn Felder für andere Scripts zugänglich sein sollen, während sie für den Benutzer nicht relevant sind. Andererseits eignen sich für diesen Fall Properties meistens besser.