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