class in Unity.Scripting.LifecycleManagement
Resets static variables automatically on entering or exiting Play mode with domain reload disabled.
This attribute can be applied to classes, structs, fields, properties, and events. Applying it to a class or struct ensures all static members of the class or struct are automatically reset.
Any class or struct that has this attribute, or that has a member with this attribute, must be declared partial, along with all its containing types, to allow the source generator to inject clean-up code. Otherwise the analyzer reports UAL0012 and the source generator generates no clean-up code for that type. If the analyzer is disabled, the compiler reports CS0260 instead.[AutoStaticsCleanup] resets state as follows:
static int myInt = 5; resets to 5.new, the initializer is evaluated again, so a new instance is created. For example, static MyObj obj = null; resets to null and static MyObj obj = new(); creates a fresh MyObj when Play mode starts.readonly static collection fields (such as List<T>, Dictionary<TKey,TValue>, HashSet<T>, and any type with a parameterless Clear method) are a special case: instead of replacing the instance, the existing collection is preserved and Clear is called. Non-readonly static collections are reset normally by reapplying their initializer. For readonly fields, the initializer must either be omitted, use new(), or use the exact declared type — for example, = new List<string>().Dispose method are disposed before they're reset. The generator calls Dispose on the current value, then applies the reset described previously. Only non-readonly fields are disposed, because readonly collection fields use Clear instead. A Dispose method counts as accessible when the class that declares the field can call it, so a private Dispose on that same class is used, and so is a protected Dispose inherited from a base class. A private or protected Dispose on an unrelated type is ignored, and the field is only reset. A struct field is disposed even when it still holds its default value, so write its Dispose method to be safe to call on a default instance.For more information, refer to Enter Play mode with domain reload disabled in the manual.
using Unity.Scripting.LifecycleManagement; using UnityEngine; public partial class MyCounterClass : MonoBehaviour { [AutoStaticsCleanup] public static int cleanedUpCounter = 0;
void Start() { Debug.Log(cleanedUpCounter); // Counter value is reset each time entering Play Mode cleanedUpCounter++; } }