I understand the basics of OnCollisionEnter(), OnCollisionExit(), OnCollisionStay() functions. But from what I know, you’re required to use that function within a script component attached to one of the colliding objects, in my case a ball. I would like to keep my scripts all on a separate “Game Controller” object, separate from the objects actually used and manipulated in game, so all my main variables, functions, etc. can be together in a single location. Is there a way to do this?

Yes there is a way to do this.

You use events.

For example, in the script attached to your ball, you would create an event, lets call it CollisionEvent, and then you “fire” off this event when ever the ball collides with something.

Then in your “Game Controller” script, you would “subscribe” to that event, and then respond with what ever you wanted to do in response to that event.

For a good explanation of events, see http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

If that is a bit much, start by trying to understand delegates. a good link about delegates here http://forum.unity3d.com/threads/150321-C-delegates-I-love-you

BUT…

from what you wrote in your question, it seems like you almost wish you didn’t have to put scripts on all the objects, and only have one script that does EVERYTHING in your game.

this sort of thinking may seem like the simpler way to do things, but it really goes against everything object oriented programming is about.

I’m not going to lecture you about OOP, but just be careful about centralizing your functionality. use events when they are needed, but try to let the different elements of your game take care of themselves. try to write small modules of code the interact together, instead of a single procedure which does everything.