まず、用語ですが「Script」というより「Component」ですかね(個人的な意見なので、あまり気にしなくていいです)。
取得したコンポーネントを使って何がしたいかによってアプローチは変わってくると思われます。
たとえば、取得したコンポーネントに共通するインターフェースがあって、そのインターフェースに属するメソッドがあるとするなら、Interfaceを返すということが考えられます。
例:
csharp
1public Interface SomeInterface {
2 void RunAction();
3}
4
5public class ObjectA : MonoBehaviour, SomeInterface {
6 public void RunAction(){
7 // 何かの処理
8 }
9}
10
11public class ObjectB : MonoBehaviour, SomeInterface {
12 public void RunAction(){
13 // 何かの処理
14 }
15}
16
17public class ObjectC : MonoBehaviour, SomeInterface {
18 public void RunAction(){
19 // 何かの処理
20 }
21}
というふうに同じインターフェースを実装していれば、
csharp
1public class GameStateHolder : MonoBehaviour {
2 public GameObject objectA;
3 public GameObject objectB;
4 public GameObject objectC;
5
6 //この関数の型名について
7 SomeInterface getObjectScript(string name){
8 switch(name){
9 case "A" : return objectA.GetComponent<ObjectA>();
10 case "B" : return objectA.GetComponent<ObjectB>();
11 case "C" : return objectA.GetComponent<ObjectC>();
12 }
13 }
14}
のようにインターフェースを返せます。
getObjectScriptを呼び出した側では、
csharp
1SomeInterface someInterface = gameStateHolder.getObjectScript("A");
2A.RunAction()
のようにインターフェースを通して処理を実行するようになります。
いずれにせよ、「getObjectScriptを呼び出した側で、受け取った値をどう使いたいか」をきちんと考えて、そこからどのように実装するかを考えるべきだと思います。
というか、「getObjectScriptを呼び出した側で、受け取った値をどう使いたいか」を考えれば、おのずと実装方法は見えてくるはずです。