# Initialization

## How to use

add **`using Game.Core;`**

If your script needs to be initialized you need to implement IInitializable interface. This interface declares float GetInitProgress() to count initialization progress of all objects that being initialized

here is Example:

{% code lineNumbers="true" %}

```csharp
                                                  // Inherit from interface here
public class InitializationExample : MonoBehaviour, IInitializable {
    [SerializeField] private GameObject[] _cubes;
    private float _replacedCubesCount = 0f;

    private void Awake() {
        // tell initialization manager that we will init this script now
        Initialization.CreateOrGetCurrent().AddInitProc(this);
        
        // start coroutine that activates cubes
        StartCoroutine(ReplaceCubesInitialization());
    }

    // this is IInitializable interface function
    // it takes progress of current initializable object 
    // (cubes activation in this example)
    public float GetInitProgress() {
        // if you can't count progress then simply return 1f;
        
        // progress needs to be [0..1] range
        return _replacedCubesCount / _cubes.Length;
    }

    IEnumerator ReplaceCubesInitialization() {
        // each cube will spawn with delay 0.2f
        var cubeActivateDelay = new WaitForSeconds(0.2f);

        for (int i = 0; i < _cubes.Length; i++) {
            _cubes[i].SetActive(true);
            _replacedCubesCount++; // increment for progress
            yield return cubeActivateDelay;
        }

        // at the end we tell that we done with initialization
        Initialization.current.RemoveInitProc(this);
    }
}
```

{% endcode %}

## API

{% code lineNumbers="true" %}

```csharp
// use it when you know that Initialization manager instance exists
public static Initialization current;
// use this to get Initialization manager instance even if it's null
public static Initialization CreateOrGetCurrent();

// Is initialization process is done
public bool IsDone;

/// Adds script initialization proc
/// Must be called at the start of script initialization
public void AddInitProc(IInitializable script);

/// Removes script initialization proc<br>
/// Must be called at the end of script initialization</br>
/// </summary>
public void RemoveInitProc(IInitializable script);

/// Returns total progress of initialization
/// It uses information from all scripts that was added by AddInitProc func
/// Script that is using IInitializable interface must return progress from 0f to 1f!
/// returns total progress [0..1], if all scripts returns progress in range [0..1]
public float GetInitProgress();
```

{% endcode %}

Example on scene load initialization in **Assets\\\_Examples\SceneSystem\\** when game scene loads.
