readonly Queue <Matrix4x4> mtxQueue = new Queue <Matrix4x4>(); // queue of pending branches to draw // Draws a line, moves forward, and then queues up new postions to draw from per new branch void BranchFrom(Matrix4x4 mtx) { if (currentLineCount++ >= lineCount) { return; // stop recursion if we hit our limit } Draw.Matrix = mtx; float lineLength = Mathf.Lerp(branchLengthMin, branchLengthMax, Random.value); // random branch length Vector3 offset = new Vector3(0, lineLength, 0); // offset along the local Y axis Draw.Line(Vector3.zero, offset); Draw.Translate(offset); // moves the drawing matrix in its local space // create a random number of branches from the current position int branchCount = Random.Range(branchesMin, branchesMax + 1); for (int i = 0; i < branchCount; i++) { using (Draw.MatrixScope) { // saves the current matrix state, and restores it at the end of this scope float angDeviation = Mathf.Lerp(-maxAngDeviation, maxAngDeviation, ShapesMath.RandomGaussian()); // random angular deviation if (use3D) { Draw.Rotate(angDeviation, ShapesMath.GetRandomPerpendicularVector(Vector3.up)); // rotates the current drawing matrix on a random axis } else { Draw.Rotate(angDeviation); // rotates the current drawing matrix on the Z axis } mtxQueue.Enqueue(Draw.Matrix); // save the drawing matrix to draw a branch with later } } while (mtxQueue.Count > 0) // process all positions in the queue { BranchFrom(mtxQueue.Dequeue()); // draw new branches at the positions saved in the queue } }