
クラスが何種類もあるんだけど、そのインスタンスを作成する時に、クラス名を文字列で指定したいな。
いでよ! “Hello” クラス!とか
いでよ! “FuckYou” クラス!とか
そんなん出来たら良いと思いませんか?
作成するインスタンスを文字列(string)で指定する方法を見つけましたので、備忘的に記事にしていきます。
参考にさせて頂いたサイト
クラスのインスタンスは通常「new キーワード」から作成します。
しかし今回は少し違います。
参考にさせて頂いたサイトがこちら
文字列で指定したクラスのインスタンスを作成する
こちらの内容を参考に Unity で実装していきます。
Unityで実装してみる
まずUnityの画面はこんな感じです。

- SayHello ボタンを押すとコンソールに「Hello」と表示します
- FuckYou ボタンを押すとコンソールに「FuckYou」と表示します
ボタンとクラスなど、全体像はこんな感じです。

ポイントとしてはインターフェースを経由する事で、後々の使い勝手が良くなると思います。
具体的には、Classが今後増えていってもコードの変更はありません。
引数の文字列を変える事で、作成するインスタンスを指定出来ます。
コードを書いて実装していきます
- ボタンオブジェクトを2つ作成する
- それぞれのTextを「Say Hello」と「Say FuckYou」にしました。
- 空のオブジェクトに下に記載したスクリプト(StringMakeClass)をアタッチ
- Say Hello ボタンのインスペクターで、クリック時にButtonHelloメソッドを呼び出すように設定

- Say FuckYou ボタンのインスペクターで、クリック時にButtonFuckYouメソッドを呼び出すように設定

これで設定完了!コードは↓です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System; // <- これ必要
public class StringMakeClass : MonoBehaviour
{
// Helloボタンから呼び出し
public void ButtonHello()
{
MakeClass("HelloButton");
}
// FuckYouボタンから呼び出し
public void ButtonFuckYou()
{
MakeClass("FuckYouButton");
}
// 引数で指定した文字列のインスタンスを作成する
public void MakeClass(string className)
{
// Typeオブジェクトは特定のクラスに関する情報を含んだオブジェクト(System名前空間)
// このType型を使うと引数で指定した文字列のクラス名のインスタンスを作成可能
Type type = Type.GetType(className);
// CreateInstanceはobjyect型を返すが、インスタンスを明示的にキャストしてあげる必要がある
// そのためインターフェイスをキャストする事で、そのインターフェイスを承継したインスタンスが作成可能となる
ITestButton hoge = (ITestButton)Activator.CreateInstance(type);
hoge.Say();
}
}
// キャスト用にインターフェイスを作成する
public interface ITestButton
{
void Say();
}
// ハローと表示するクラス(インターフェースを承継)
public class HelloButton : ITestButton
{
public void Say()
{
Debug.Log("Hello");
}
}
// ファックユーと表示するクラス(インターフェースを承継)
public class FuckYouButton : ITestButton
{
public void Say()
{
Debug.Log("FuckYou");
}
}
実行して各ボタンを押すとうまくコンソールに表示されました!

コメント