見出し画像

UnityのResources.Load①|画像・音・Prefabなどの素材をスクリプトから読み込む方法

Unityでは、画像・音・Prefabなどの素材を、あらかじめ Inspector にセットして使うことが多いです。

例えば、UIの画像を表示したい場合は Image に画像を設定したり、音を鳴らしたい場合は AudioSource に音源を設定したりします。

ただ、ゲームを作っていると、

  • ボタンを押したら画像を切り替えたい

  • ステージごとにBGMを変えたい

  • アイテム名に応じてPrefabを生成したい

  • 3Dオブジェクトの色や見た目を変更したい

という場面があります。

このように、ゲーム中に必要な素材をスクリプトから読み込みたいときに使えるのが、

Resources.Load

です。

今回は、Resources.Load を使って、画像・音・Prefab・Materialなどを読み込む基本をまとめます。



Resources.Loadとは?

Resources.Load は、Unityの Resources フォルダの中に入れた素材を、スクリプトから読み込むための命令です。

例えば、画像を読み込む場合は次のように書きます。

Sprite sprite = Resources.Load<Sprite>("Images/player");

このコードでは、Resources フォルダの中にある Images/player という画像を、Sprite として読み込んでいます。

ポイントは、次の形です。

Resources.Load<読み込む型>("Resourcesフォルダ内のパス");

画像なら Sprite、音なら AudioClip、Prefabなら GameObject のように、何の素材として読み込むのかを指定します。


Resources.Load の準備

Resourcesフォルダを作る

Resources.Load を使うには、読み込みたい素材を必ず Resources フォルダの中に入れておく必要があります。

例えば、次のようなフォルダ構成にします。

Assets
 └ Resources
    ├ Images
    │  └ player.png
    ├ Sounds
    │  └ bgm.mp3
    ├ Prefabs
    │  └ Enemy.prefab
    └ Materials
       └ RedMaterial.mat

Resources フォルダは、Assets の中に作ります。

Resourcesフォルダのサンプル

フォルダ名は必ず、

Resources

にします。大文字・小文字も含めて、この名前にしておくのが安全です。


パスの書き方

例えば、次の場所に画像があるとします。

Assets/Resources/Images/player.png

この場合、コードでは次のように書きます。

Resources.Load<Sprite>("Images/player");

つまり、Resources フォルダの中から見た場所を書きます。
また、拡張子も書きません。

次のように .png を書くと、うまく読み込めません。

Resources.Load<Sprite>("Images/player.png");  //これはNG!

1,画像を読み込む

まずは、画像を読み込む例です。

UIの Image に画像を表示したい場合は、Sprite として読み込みます。

using UnityEngine;
using UnityEngine.UI;

public class ImageLoader : MonoBehaviour
{
    public Image targetImage;

    void Start()
    {
        Sprite sprite = Resources.Load<Sprite>("Images/player");

        targetImage.sprite = sprite;
    }
}

この例では、次の画像を読み込んでいます。

Assets/Resources/Images/player.png

そして、読み込んだ画像をUIの Image に設定しています。

targetImage.sprite = sprite;

このようにすると、スクリプトから画像を差し替えることができます。


画像を読み込む活用シーン

画像の読み込みは、次のような場面で使えます。

  • キャラクター選択画面で、選んだキャラの画像を表示する

  • カードゲームで、カード名に応じて画像を表示する

  • クイズゲームで、問題に応じた画像を表示する

  • アイテム一覧で、アイテム画像を切り替える

  • ステージ選択画面で、ステージのサムネイルを表示する

例えば、キャラクター名に応じて画像を切り替えたい場合は、次のように書けます。

using UnityEngine;
using UnityEngine.UI;

public class CharacterImageLoader : MonoBehaviour
{
    public Image characterImage;

    public void ChangeCharacterImage(string characterName)
    {
        Sprite sprite = Resources.Load<Sprite>("Images/Characters/" + characterName);

        characterImage.sprite = sprite;
    }
}

例えば、

ChangeCharacterImage("cat");

と呼び出すと、

Assets/Resources/Images/Characters/cat.png

を読み込むイメージです。


2,音源を読み込む

次に、音源を読み込む例です。

BGMや効果音は、AudioClip として読み込みます。

using UnityEngine;

public class SoundLoader : MonoBehaviour
{
    public AudioSource audioSource;

    void Start()
    {
        AudioClip clip = Resources.Load<AudioClip>("Sounds/bgm");

        audioSource.clip = clip;
        audioSource.Play();
    }
}

この例では、次の音源を読み込んでいます。

Assets/Resources/Sounds/bgm.mp3

読み込んだ音源を AudioSource に設定して、

audioSource.Play();

で再生しています。


音源を読み込む活用シーン

音源の読み込みは、次のような場面で使えます。

  • ステージごとにBGMを変える

  • ボス戦になったら音楽を切り替える

  • ボタンを押したときに効果音を鳴らす

  • キャラクターごとに違うボイスを再生する

  • イベントシーンごとにBGMを変更する

例えば、ステージ番号に応じてBGMを切り替える場合は、次のようにできます。

using UnityEngine;

public class StageBgmLoader : MonoBehaviour
{
    public AudioSource audioSource;

    public void PlayStageBgm(int stageNumber)
    {
        AudioClip clip = Resources.Load<AudioClip>("Sounds/BGM/stage" + stageNumber);

        audioSource.clip = clip;
        audioSource.Play();
    }
}

例えば、

PlayStageBgm(1);

と呼び出すと、

Assets/Resources/Sounds/BGM/stage1.mp3

を読み込むイメージです。
ステージ2なら stage2、ステージ3なら stage3 のように切り替えられます。


3,Prefabを読み込む

Prefabを読み込む場合は、GameObject として読み込みます。

using UnityEngine;

public class PrefabLoader : MonoBehaviour
{
    void Start()
    {
        GameObject prefab = Resources.Load<GameObject>("Prefabs/Enemy");

        Instantiate(prefab, new Vector3(0, 0, 0), Quaternion.identity);
    }
}

この例では、次のPrefabを読み込んでいます。

Assets/Resources/Prefabs/Enemy.prefab

ここで重要なのは、Prefabは読み込んだだけでは画面に出ないということです。

GameObject prefab = Resources.Load<GameObject>("Prefabs/Enemy");

これは、あくまでPrefabのデータを読み込んでいるだけです。

実際に画面に出すには、

Instantiate(prefab, new Vector3(0, 0, 0), Quaternion.identity);

のように Instantiate() を使って生成する必要があります。


Prefabを読み込む活用シーン

Prefabの読み込みは、ゲーム制作でとてもよく使えます。

  • 敵キャラクターを生成する

  • アイテムを出現させる

  • 弾を発射する

  • エフェクトを表示する

  • 選択したキャラクターを生成する

  • ステージパーツを配置する

例えば、敵の種類に応じてPrefabを生成したい場合は、次のようにできます。

using UnityEngine;

public class EnemySpawner : MonoBehaviour
{
    public void SpawnEnemy(string enemyName, Vector3 position)
    {
        GameObject prefab = Resources.Load<GameObject>("Prefabs/Enemies/" + enemyName);

        Instantiate(prefab, position, Quaternion.identity);
    }
}

例えば、

SpawnEnemy("Slime", new Vector3(0, 0, 0));

と呼び出すと、

Assets/Resources/Prefabs/Enemies/Slime.prefab

を読み込んで生成します。

このように、名前に応じてPrefabを切り替えられるので、敵やアイテムの種類が増えたときにも便利です。


4,Materialを読み込む

Resources.Load では、画像・音・Prefabだけでなく、Material も読み込めます。

Material は、3Dオブジェクトの色や質感を決める素材です。

例えば、次のように読み込みます。

using UnityEngine;

public class MaterialLoader : MonoBehaviour
{
    public Renderer targetRenderer;

    void Start()
    {
        Material material = Resources.Load<Material>("Materials/RedMaterial");

        targetRenderer.material = material;
    }
}

この例では、次のMaterialを読み込んでいます。

Assets/Resources/Materials/RedMaterial.mat

そして、読み込んだMaterialをオブジェクトの Renderer に設定しています。

targetRenderer.material = material;

これで、オブジェクトの見た目をスクリプトから変更できます。


Materialを読み込む活用シーン

Materialの読み込みは、次のような場面で使えます。

  • 選択したキャラクターの色を変更する

  • ダメージを受けたときに赤くする

  • ステージの雰囲気に合わせて床や壁の見た目を変える

  • アイテムのレア度によって色を変える

  • 昼と夜でオブジェクトの見た目を変える

例えば、アイテムのレア度に応じてMaterialを変える場合は、次のように書けます。

using UnityEngine;

public class ItemMaterialChanger : MonoBehaviour
{
    public Renderer itemRenderer;

    public void ChangeMaterial(string rarity)
    {
        Material material = Resources.Load<Material>("Materials/Items/" + rarity);

        itemRenderer.material = material;
    }
}

例えば、

ChangeMaterial("Normal");

と呼び出すと、

Assets/Resources/Materials/Items/Normal.mat

を読み込みます。


その他に読み込めるもの

Resources.Load では、他にもさまざまなUnityアセットを読み込むことができます。

代表的なものには、次のようなものがあります。

Sprite          画像
Texture2D       画像データ
AudioClip       音源
GameObject      Prefab
Material        マテリアル
AnimationClip   アニメーション
ScriptableObject データ用アセット

よく使用するものとして、上で紹介した4つを覚えておけば十分でしょう。

画像      → Sprite
音源      → AudioClip
Prefab    → GameObject
Material  → Material

Resources.Loadを使うと便利なゲーム例

Resources.Load は、特に次のようなゲームやアプリで使いやすいです。

クイズゲーム

問題に応じて画像を変えたい場合に使えます。

問題:この国旗はどこの国?
画像:japan.png
答え:日本

このようなデータがある場合、画像名に応じて国旗画像を読み込むことができます。

Sprite flag = Resources.Load<Sprite>("Images/Flags/japan");

国旗クイズや地理クイズのようなアプリでは、とても使いやすい方法です。


カードゲーム

カード名に応じて画像を表示できます。

Sprite cardImage = Resources.Load<Sprite>("Images/Cards/" + cardName);

例えば、cardName が "Fire" なら、

Assets/Resources/Images/Cards/Fire.png

を読み込むイメージです。

カードの種類が多いゲームでは、名前で画像を管理できるので便利です。


ステージ制ゲーム

ステージ番号に応じてBGMや背景画像を切り替えることができます。

AudioClip bgm = Resources.Load<AudioClip>("Sounds/BGM/stage" + stageNumber);
Sprite background = Resources.Load<Sprite>("Images/Backgrounds/stage" + stageNumber);

例えば、ステージ1なら stage1、ステージ2なら stage2 のように読み込めます。


キャラクター選択

選んだキャラクターに応じて、画像やPrefabを読み込むことができます。

Sprite characterImage = Resources.Load<Sprite>("Images/Characters/" + characterName);
GameObject characterPrefab = Resources.Load<GameObject>("Prefabs/Characters/" + characterName);

キャラクター選択画面や、着せ替え機能にも使えます。


アイテム生成

アイテム名に応じてPrefabを生成できます。

GameObject itemPrefab = Resources.Load<GameObject>("Prefabs/Items/" + itemName);

Instantiate(itemPrefab, transform.position, Quaternion.identity);

宝箱からランダムにアイテムを出すような処理にも使えます。


Resources.Loadを使いすぎないように注意

Resources.Load は便利ですが、使いすぎには注意が必要です。

Resources フォルダに入れた素材は、ゲーム内で実際に使うかどうかに関係なく、ビルドに含まれます。

そのため、大量の素材を何でもかんでも Resources フォルダに入れてしまうと、

  • アプリの容量が大きくなる

  • 不要な素材までビルドに含まれる

  • フォルダ管理が複雑になる

  • どこで使っている素材なのか分かりにくくなる

といった問題が起こることがあります。

大規模なゲームや大量の素材を扱う場合は、Addressablesなど別の仕組みを使うこともあります。

まずは Resources.Load で、スクリプトから素材を読み込む基本を理解しておくとよいでしょう。


まとめ

Resources.Load を使うと、Resources フォルダの中に入れた素材を、スクリプトから読み込むことができます。

今回紹介した主な型は、次の通りです。

画像      → Sprite
音源      → AudioClip
Prefab    → GameObject
Material  → Material

読み込むときの基本形は、次のようになります。

Resources.Load<型名>("Resourcesフォルダの中のパス");

例えば、

Resources.Load<Sprite>("Images/player");
Resources.Load<AudioClip>("Sounds/bgm");
Resources.Load<GameObject>("Prefabs/Enemy");
Resources.Load<Material>("Materials/RedMaterial");

のように使います。

Resources.Load を使えるようになると、画像・音・Prefabなどをスクリプトから自由に切り替えられるようになります。

クイズゲーム、カードゲーム、ステージ制ゲーム、キャラクター選択、アイテム生成など、さまざまな場面で活用できます。

まずは、画像やPrefabなど、分かりやすい素材から試してみるのがおすすめです。


▼ Unity初心者向け記事まとめはこちら


こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

さらにステップアップの「スマホで遊ぶジャンプゲーム 8回セット」のマガジンもぜひご活用ください。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!