You can have a script, that is singleton instead of static, and this way, it’s much easier for other scripts to talk to it, and the other way around.
A singleton implemntation is avaiable widely and I highly suggest you read about.
Here is what I do, I have lots of scripts that are singleton (Means, they’re available only one, not more) and some of them, I use the DoNotDestroyOnLoad methode, which does make this script not get destroyed when even loading any new level …
Let’s say a GameController (I have also SoundEffectsController, … etc and properly lots of conrtoller)
The player code can talk to GameController script without using the find methode at all
in my player start methode for example I do this
//Singleton have a variable called instance, which can call that sinleton and access the controller
GameController.Instace.player = this.gameObject;
//now on other scripts, they can access the player without doing any GameObject.Find at all
GameController.Instance.player.GetComponenet<Example>().DoThis();
as well, in my game controller, I tent to save lists of other objects, so I can access them easily, like a list of enemies, a list of NPCs or just anything!
I barely have to use GameObject.Find
and if I ever use the find methode, I usually find myself using transform.FindChild() which finds the child of that transform, not searching through all GameObjects!
Hope this helps.
Singleton for Unity3D C#: http://wiki.unity3d.com/index.php/Singleton
Best of luck!