Another alternative to allocating and returning a collection, for some API methods, is to support the visitor pattern. For example, RaycastAll's signature is presently: Code (csharp): RaycastHit RaycastAll (Ray ray, float distance, int layerMask); The idea is that you perform the raycast and then process the results that come back. But with the visitor pattern, you'd pass in a callback to be executed on each result: Code (csharp): void RaycastAll(Ray ray, float distance, int layerMask, Func<RaycastHit, bool> callback); The callback would return 'true' to continue processing further hits, or 'false' to halt the raycast (because maybe we found what we were looking for). In the specific case of RaycastAll you'd have to put a big note on the docs page warning people that the hits aren't processed in any particular order though. This would allow us not only to avoid the function allocating an array for the results, but even to avoid allocating upfront storage for results we're not interested in. Like even with the preallocated-array approach we'd have to allocate sizeof(RaycastHit)*MaxResults bytes for storage, but if we're only interested in the GameObjects involved then this approach would allow us to preallocate collections that just store sizeof(reference to GameObject)*MaxResults bytes instead. Edit: I forgot to note that this wouldn't be suitable for situations where the visitor is doing something very fast (like adding the result to a list) because of the overhead from the engine calling back into managed code. Still, for plenty of other situations it'd be the best approach.