みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Unityでprefabをスクリプトから読み込む

Unityで,AssetsにあるprefabをBooスクリプトからロードしてGameObjectを作成する方法をメモしておきます.

Resources.Load(path)

を使います.このメソッドはResourcesフォルダにあるオブジェクトをロードします.詳細はこちらに書いてありますが,このメソッドがロードできるのは,Resourcesという名前のフォルダにあるファイルだけなので,Assets内にResourcesという名前のフォルダを作成し,その中に使いたいprefabを入れます.

なお,ResourcesフォルダはAssets内の任意のディレクトリに設置可能なので,Assets/Resourcesでもよいですし,Assets/Trees/Resourcesなどのようでもよいみたいです.

それでは実際にロードしてみましょう.例えば,Assets/Resources/Tree.prefab を読み込んでシーンにロードする場合は.以下のようなBoo スクリプトを実行します.

    def Awake():
        prefab = Resources.Load[of GameObject]("Tree")
        Instantiate(prefab, Vector3.zero, Quaternion.identity)

Resources.Loadの引数には,拡張子とディレクトリを除いたファイル名を指定します.[of GameObject]は,GameObjectの型を指定したGeneric Methodsを意味します.prefabの型はGameObjectです.したがって,Object.Instantiate(original as Object, position as Vector3, rotation as Quaternion) as Object を使ってGameObjectをシーンにロードすることができます.

もしも指定したprefabが見つからなければNullが返されます.なので,Instantiateする前に必ずprefabの値をチェックしましょう.

以上で完了です.

Tips

Assets/Resources/Trees/Apple.prefabのように,Resources以下のサブディレクトリにあるprefabをロードするには,

    def Awake():
        prefab = Resources.Load[of GameObject]("Trees/Apple")
        Instantiate(prefab, Vector3.zero, Quaternion.identity)

とすればオッケーです.

Assets/stage01/Resources/Tree.prefabのように,別のフォルダの中にResourcesフォルダが入っている場合,

    def Awake():
        prefab = Resources.Load[of GameObject]("Tree")
        Instantiate(prefab, Vector3.zero, Quaternion.identity)

とすればオッケーです.上位のフォルダの名前を考慮する必要はありません.