This is a port of Erin Catto/box2d's b2_dynamic_tree from C++ to C# (doc here), intended for use in Unity. It's a very faithful translation with a couple of additional C# creature comforts for usability.
The code has also been adapted to work in 3D. The main difference in that regard is that I use surface area rather than perimeter as a heuristic to minimize the internal nodes.
The object to be stored in your tree must implement the interface IBVHClientObject:
The bounds should be a tight fit around your object. For previous position, I recommend just caching the object's position every frame.
Next, create an instance of BoundingVolumeHierarchy with the appropriate type parameter. Your main forms of interaction with the tree are fairly self explanatory:
Call 'update' whenever an object's position/rotation/scale/bounds changes.
The simplest form of querying the tree involves just enumerating all nodes:
Naturally there is also a raycast method: