【Unity入門】動的生成の基本!Resources.Loadを覚えよう!

「最初からオブジェクトを全部配置するんじゃなくて、後から生成して登場させたいな…」

Unityで開発を進めていると、そんな考えに至る人も多いと思います。

例えばシューティングゲームを作るとしたら「ステージ中盤で中ボスを登場させたい」などでしょうか?

実はResourcesクラスLoad関数を使えば、これを簡単に実現することができます。

というわけで、今回はResourcesクラスのLoad関数について見てきましょう!

これを理解し使えるようになると、例えばプロジェクトのRresourcesフォルダからプレハブを取得し動的にオブジェクト生成する!

なんてことが行えるようになりますよ!

Unityで作品を作る上で避けては通れない項目です。

ぜひマスターしてしまいましょう!

目次

Resourcesクラスとは?

Resourcesクラスとは一言でいえば「resourcesフォルダの中にあるプレハブなどを取得するためのクラス」と言えます。

プロジェクトに存在する「Resourcesという名前のフォルダーの中身」から色々と取得できるわけですね!

非常に便利そうです。

早速試してみましょう!

Resourcesクラスを使う下準備をしよう!

まずは試すための下準備をしましょう。

とはいえやっていることとしては、以下のような内容です。

①Resourcesフォルダの作成
②取得してくるプレハブの作成
③スクリプト実行用のオブジェクト作成

理解できる人は、飛ばしてしまっても構いません。

まずはフォルダを作ろう!

まずはフォルダを作成しましょう。

unity-resources-1

Projectウィンドウ上で右クリック→Create→Folderでフォルダを新規に作成しましょう。

またフォルダの名前は、Resourcesに変更しましょう。

unity-resources-2

テスト用にprefabを作ろう!

テスト用に、Resourcesフォルダの中にCubeプレハブを作っておきましょうか。

unity-resources-3

プレハブの作り方がわからない人は、以下のリンクからプレハブについておさらいしておきましょう。

プログラムを準備しよう

今回は以下の画像のように、CreateManagerオブジェクトを用意し、CreateManagerスクリプトを紐付けています。

unity-resources-4

Resources.Loadで動的に取得をしよう!

では実際に利用してみましょう。

ここからはプログラムに入ってきます。

プログラムでResourcesクラスを使おう!

Resourcesクラスを使うだけならば非常に簡単です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreateManager : MonoBehaviour {

    // 初期化
    void Start () {
        // ResourcesフォルダからCubeプレハブのオブジェクトを取得
        GameObject obj = (GameObject)Resources.Load ("Cube");
    }
}

上記のようなプログラムを記述すればそれだけでCubeプレハブを取得できます。

重要なのは以下の一文だけです。

GameObject obj = (GameObject)Resources.Load ("Cube");

引数にプレハブ名を指定すれば、それだけで取得が可能なわけですね!

しかし取得しただけでは、あまり利用価値はありません。

生成まで行って、初めてゲーム中のオブジェクトとして使用可能になるからです。

基本的に、次に紹介するInstantiateとペアで使うことになるでしょう。

Instantiateと組み合わせて動的生成

では取得したプレハブで、オブジェクトを生成してみましょうか。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreateManager : MonoBehaviour {

    // 初期化
    void Start () {
        GameObject obj = (GameObject)Resources.Load ("Cube");

        // プレハブを元にオブジェクトを生成する
        GameObject instance = (GameObject)Instantiate(obj,
                                                      new Vector3(0.0f,0.0f,0.0f),
                                                      Quaternion.identity);
    }
}

実行結果は以下となります。

unity-resources-5

実行前はなかったCubeオブジェクトが生成されました!

ちゃんとプレハブを元にCubeオブジェクトが作成されていますね!

またInstantiate関数の詳細は以下のリンクの記事をご確認ください。

もっと詳しくなろう!

※この辺りは初心者の方はスルーしても構いません。いつか必要になったらその時学びましょう。

Resourcesクラスにはまだ機能があります。

その一部をついでに見ていきましょう!

メモリ解放

ResourcesクラスのLoad関数は先ほど見ましたが、他にもいくつか関数が用意されています。

その一つがメモリ解放の関数です。

プログラムは実行されるとメモリ上に展開されます。

いろいろなものをどんどん読み込んでいくとその使用量も増えていき、圧迫し処理が遅くなってしまいます。

そんな時、使っていない情報を破棄することでメモリ上に空きを作る。

これをメモリ解放と言います。

ここで説明するのは以下の関数です。

Resources.UnloadUnusedAssets();

この関数は「使用していないアセットをアンロードする」関数です。

Resources.Load関数で大量に読み込んだりして、メモリを圧迫してしまった場合は、手動での定期解放を検討してもよいかもしれません。

非同期読み込み

ここでは詳細までは触れませんがResources.LoadAsync関数を利用することで非同期読み込みも可能です。

非同期読み込みを実装できれば、例えば「NowLoading」のような演出なども行えるようになります。

そういったことに着手するタイミングでは、再度この辺りについて学んでみましょう。

逆に言えばその時までは、こういうことも出来るんだと覚えておくレベルで問題ないでしょう。

まとめ

今回は、リソースの読み込み周りについて非常に簡単に見てきました。

まだまだ奥の深い項目ですが、とりあえず使用できるまで、学んでいただけていれば幸いです。

まずはResourcesクラスで動的生成を使いこなし作品の質を高めましょう。

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次