Switch branches/tags
Nothing to show
Find file History
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
..
Failed to load latest commit information.
README.md
README.md.meta
RollingArray.cs
RollingArray.cs.meta

README.md

RollingArray

RollingArray is a container that always stores the last arraySize elements added. New elements are added via Append(), which automatically rolls over once the maximum number of elements is reached, overwriting the oldest element. array[i] always returns the oldest element that still exists + i. That way, this container always stores the last arraySize elements added.

Adding is O(1), retrieving is O(1) and (with the exception of GetEnumerator()) no new memory is allocated after the initial creation.

You can read more about the GetEnumerator() memory problem (and Unity's dreadful memory allocation troubles) here under "Should you avoid foreach loops?": http://www.gamasutra.com/blogs/WendelinReich/20131109/203841/C_Memory_Management_for_Unity_Developers_part_1_of_3.php

Example

public class RollingArrayExample : MonoBehaviour
{
	[SerializeField] Transform indicatorObject;

	RollingArray<Vector2> mousePositions;
	Camera mainCamera;

	void Awake()
	{
		// Save the last 50 elements
		mousePositions = new RollingArray<Vector2>(50);

		// Cache a reference to the main camera
		mainCamera = Camera.main;
	}

	void FixedUpdate()
	{
		// Get the mouse position in a fixed interval
		// If we get to 50 positions, the oldest position will be replaced
		mousePositions.Append(mainCamera.ScreenToWorldPoint(Input.mousePosition));
	}

	void Update()
	{
		// Only continue if we have at least one mouse position
		if (mousePositions.IsEmpty)
			return;

		// Go through all the saved mouse positions from oldest to newest to get the average
		Vector2 averagePosition = new Vector2();
		for (var i = 0; i < mousePositions.Count; i++)
		{
			averagePosition += mousePositions[i];
		}
		averagePosition /= mousePositions.Count;

		// Set the indicator object to the average position
		indicatorObject.position = averagePosition;
	}
}

Dependencies

None.