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)
とすればオッケーです.上位のフォルダの名前を考慮する必要はありません.