IEnumerator LoadSnapshot()
    {
        // Make a backup clone of the snapshot's position cache
        positionCache = (Vector3[])particles.snapshots[snapshotToLoad].settings.snapshotData.position.Clone();

        // Alter the positions in the live snapshot's position data
        for (int i = 0; i < particles.snapshots[snapshotToLoad].settings.snapshotData.position.Length; i++)
        {
            particles.snapshots[snapshotToLoad].settings.snapshotData.position[i] = transformPoint.TransformPoint(particles.snapshots[snapshotToLoad].settings.snapshotData.position[i]);
        }

        // Make sure that you're not using the stored Transform (otherwise it will pop into place)
        particles.snapshots[snapshotToLoad].loadTransform = false;

        // Load the snapshot (this is where the transition kicks in)
        if (mask < 0)
        {
            // Load regularly
            particles.Load(snapshotToLoad);
        }
        else
        {
            // Load and alter particle mask during transition
            particles.LoadAndApplyMask(snapshotToLoad, mask);
        }

        // Wait till loading is done (will return false once the transition is finished)
        while (particles.IsLoading())
        {
            yield return(null);
        }

        // Put the position cache backup back so it will appear untouched till next load, otherwise we may get positions warped additionally next load
        particles.snapshots[snapshotToLoad].settings.snapshotData.position = (Vector3[])positionCache.Clone();

        // Increment the snapshot to load for next call (just for this example)
        snapshotToLoad = (snapshotToLoad + 1) % particles.snapshots.Count;
    }