I have not included source code in this distribution, but you're encouraged to decompile the assembly if you're curious about how it works.

The general approach that I'm taking is to create a Unity GameObject/MonoBehavior to initialize my user interface objects.  I implement its OnLevelWasLoaded() method.  This method gets called automatically by the Unity engine whenever the game switches between its main menu and its gameplay mode (each is considered a Unity engine "level").  Whenever the game switches into gameplay mode, I replace the default user interface with mine.

My custom user interface mostly consists of classes that inherit from the default user interface classes.  I often needed to copy large chunks of code from the original implementation into my derived classes before making my modifications.  The existing classes are not necessarily set up with the intent of being derived, so there are a handful of workarounds that I use to deal with limitations like private members and methods, non-virtual methods, static accessors, etc.  For example, if I need to interact with a private member or method, I use reflection to sidestep the restriction.
