【Unity】resourcesフォルダーの使い方と非推奨の理由

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと次のようなプログラミングができるようになります

クリックすると、テキストと立ち絵とボイスが出ます。

テキストや画像、音声、さらにゲームオブジェクトはゲーム作りにおいて必要不可欠です。

UnityのResourcesフォルダーは、アセットをランタイムでロードするために使用される特殊なフォルダーです。
フォルダーに置かれたアセット(素材)は、ビルド時に自動的にパッケージ化され、ゲームが実行されている間に動的にロードすることができます。

Resourcesフォルダーは非常に取り扱いやすいので、素材管理や出力に便利ですが、
Resourcesは注意点もあるので、現在は非推奨とされています。

本記事では、Resourcesフォルダーにどのような問題点があるかを説明し、
どの場面で使うのが良いか解説します。

本記事は次の人におすすめ
  • resources.loadについて知りたい。
  • resources パス 取得を知りたい。
  • resourcesが非推奨な理由を知りたい。
スポンサーリンク

Resourcesフォルダーの作成

Resourcesフォルダーは、Assetウィンドウ内にファイルを配置するだけで作成できます。
ただし、名前は「Resources」ではないと処理されません。
大文字・小文字も統一する必要があります。

Resourcesの基本文法

Resourcesで素材をロードする場合は、パス(path)を設定します。

パスの取得する方法は2つあります。
素材をクリックすると、Projectウィンドウ内の下部にパスが表示されます。

或いは、素材を右クリックして「Copy path」をする。(「Alt+Ctrl+C」)

取得したパスを引数とすることでロードができます。

//文字をロードする例
Texture2D texture = Resources.Load<Texture2D>("Textures/MyTexture");

// オーディオクリップをロードする例
AudioClip audioClip = Resources.Load<AudioClip>("Audio/MyAudioClip");

// 画像をロードする例
Image.sprite = Resources.Load<Sprite>(Images/MyImage);

// プレハブをロードする例
GameObject prefab = Resources.Load<GameObject>("Prefabs/MyPrefab");

CSVファイルのロード

文字や画像、音楽以外にもResourcesはcsvを読み込むことができます。
フォルダーの中にCSVファイルをドラッグ&ドロップして、スプリプトで処理します。

CSVファイルの読み込み、作成方法を紹介しています。
using UnityEngine;

public class csvReader : MonoBehaviour
{
    void Start()
    {
        // CSVファイルをロードする
        TextAsset csvFile = Resources.Load<TextAsset>("Mycsv");
        if (csvFile != null)
        {
            // CSVファイルの内容を解析する
            string[] data = csvFile.text.Split(new char[] { '\n' });
            foreach (string line in data)
            {
                string[] fields = line.Split(new char[] { ',' });
                // 各フィールドのデータを処理する
                foreach (string field in fields)
                {
                    Debug.Log(field);
                }
            }
        }
        else
        {
            Debug.LogError("CSVファイルが見つかりません。");
        }
    }
}

//CSVをロードする
Texture2D texture = Resources.Load<Texture2D>("csvData[1][i]");

Resourcesはなぜ非推奨?

Resourceは素材を扱う上で非常に便利な機能です。
しかしUnity公式は、Resourceをあまり使うことを薦めていません。

Resourcesのデメリット
  • ビルドサイズの増加:ビルド時にアセットが含まれるため、プロジェクトの規模が大きくなるほどサイズが大きくなります。アプリ起動にも影響します。
  • メモリ管理の難しさ:Resources.Loadでロードしたアセットは、明示的にアンロードしない限りメモリに残ってしまいます。Resources.UnloadAssets()があります。

2つの観点から規模があまり大きくなくて、
メモリの消費が激しくないプロジェクトであれば使っても問題ないでしょう。

Addressables

Addressable Asset Systemは、アセットのロードと管理ができるツールです。
アセットを動的にロードし、メモリ管理やアセットの依存関係も自動的に処理します。

Resources.Load<Sprite>();

Resources.Load<Sprite>()は、スプライト(画像)を読み込むためのコードです。

読み込みたいスプライト「img.png」をResourcesのImagesに保管します。
スプライトのパスは「Resources/Images/img.png」というパスになるので、
csvにはResourcesと.pngを除外した「Images/img」すれば、読み込みができます。

「csvData[i][2]」は表計算ソフトでは、A列を0から数えるため、2はC列を示します。

public Image img;
img.sprite = Resources.Load<Sprite>(csvData[i][2]);

(AudioClip)Resources.Load();

(AudioClip)Resources.Load()は指定されたパスのオーディオクリップを読み込むためのコードです。

読み込みたいボイス「voice.mp3」をResourcesのVoicesに保管します。
ボイスのパスは「Resources/Voices/voice.mp3」というパスになります。
csvにはResourcesと.mp3を除外した「Voices/voice」すれば、読み込みができます。

private AudioSource audio;
private AudioClip Sound;

void Start()
{
 //音声を取得
 audio = GetComponent<AudioSource>();
}

void Update()
{
 //音声データ
 Sound = (AudioClip)Resources.Load(csvData[i][4]);
 audio.PlayOneShot(Sound);
}

参考ページ:「Resources-Load – Unity スクリプトリファレンス

CSVで立ち絵、ボイスを読み込む

CSVと「Resources.Load()」を組み合わせて、立ち絵、ボイスを読み込むことができます。
初めに下準備として、立ち絵とボイスを用意します。

お借りしている素材

これらの素材を読み込むにはUnityに追加しなければいけません。

Resoucesフォルダーにフォルダーごと追加すると

次にCSVを編集します。

前回までは、名前とセリフしかなかったかと思いますが、今回は、立ち絵とボイスを追加します。

本記事では立ち絵1が左、立ち絵2が右とします。

今回は、太郎と花子の画像それぞれ2枚とボイスがそれぞれ1回ずつあります。

ソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;         //UIを使えるように
using System.IO;            //Fileを読み込む
using UnityEngine.EventSystems;   //ボタンがクリックで反応する


public class csvcontroler : MonoBehaviour
{
    public TextAsset csvFile; //CSVファイル
    public static List<string[]> csvData = new List<string[]>(); //csvファイルの中身を入れるリスト
    public static int i = 0;  //現在地
    public Text Nametext;     //名前を表示
    public Text Logtext;     //地の文・セリフ表示
    public Image LeftImg;  //左の立ち絵
    public Image RightImg;  //右の立ち絵
    private AudioSource audio;  //ボイス取得
    private AudioClip Sound;  //ボイス出力

    void Start()
    {
        //csvファイル
        csvFile = Resources.Load("Data") as TextAsset; //Resourcesにあるcsvファイルを格納
        StringReader reader = new StringReader(csvFile.text); //TextAssetをStringReaderに変換

        while (reader.Peek() != -1)
        {
            string line = reader.ReadLine();   //1行ずつ読み込み 
            csvData.Add(line.Split(','));    //csvDataリストに追加
        }

        audio = GetComponent<AudioSource>();        //音声を取得

    }

    void Update()
    {
        //ボタンを押したときは画面クリック無効
        if (EventSystem.current.IsPointerOverGameObject())  return;

        if (Input.GetMouseButtonDown(0))   //マウス左押下
        {
            NameText.text = csvData[i][0];  //名前を表示
            LogText.text = csvData[i][1];   //セリフ・地の文を表示
            LeftImg.sprite = Resources.Load<Sprite>(csvData[i][2]);  //太郎の立ち絵に相当
            RightImg.sprite = Resources.Load<Sprite>(csvData[i][3]);  //花子の立ち絵に相当
            //音声データ
            Sound = (AudioClip)Resources.Load(csvData[i][4]);
            audio.PlayOneShot(Sound);

       if (i <= csvData.Count)  i++;  //csvDataを全て読み込むまで1ずつ追加する。
        }
    }
}

思い通りのゲームが作れない

Unityでゲーム開発しているけど完成しない。
技術的な壁や知識不足が原因で、思い描いたゲームを実現するのは難しいです。

しかし、Udemyは動画で実践的なゲーム開発を解説していて、
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで学習できます。

Udemyの特徴
  • プロのエンジニアによる講習が受けられる
  • 自分のペースで学習を進められる
  • オンデマンド形式だから何度でも視聴可能
  • 不満足なコースは視聴していても返金可能返金ポリシー

Unityの機能を網羅したいや作りたいゲームがある人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を3つ紹介します。

Unityのはじめの一歩としておすすめ。開発例に物理挙動やアニメーションを使用しているので、今後の開発が円滑になる。

トランプを題材にした講座。カードゲームやボードゲーム開発に応用可能

UnityエンジンのインストールやC#の文法に加えて、App StoreとGoogle Playにゲームをリリース方法を解説。

容量不足を解消

Unityのプロジェクトは1.5GB~3.5GBと大きく、クリエイターはHDD・SSD増設が必要です。

価格耐久性静音性読み書きサイズ
HDD
SSD

注目点は、HDDは安価だけど壊れやすい。SSDは丈夫だけど高価。
したがって、データの持ち運びをしない場合はHDD、持ち運びする場合はSSDがおすすめです。

  • 据え置きHDD
  • 外付けSDD
  • 内蔵SSD

ぜひ、あなたのクリエイティブな作業環境に兼ね備えたストレージをお役立てください。

解説

初めに名前空間を定義します。

UIを使うための「using UnityEngine.UI;」、CSVを読み込むために「using System.IO;」、UnityのUIイベントシステムを操作する「using UnityEngine.EventSystems;」等々の名前空間が必要です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;         //UIを使えるように
using System.IO;            //Fileを読み込む
using UnityEngine.EventSystems;   //ボタンがクリックで反応する

つづいて、変数を定義します。

csvFileはCSVファイルを格納するための変数です。
csvDataはCSVファイルの内容を格納するためのリストです。
iはint型の変数でCSVファイル内の行を追跡します。
NametextとLogtextはUnityのUIテキストで、それぞれ話者の名前とセリフ・地の文を表示します。LeftImgとRightImgはUnityのUIイメージで、登場人物の立ち絵を表示します。
audioはAudioSourceコンポーネントへの参照します。
Soundは再生する音声ファイルを格納するための変数です。

public class csvcontroler : MonoBehaviour
{
    public TextAsset csvFile; //CSVファイル
    public static List<string[]> csvData = new List<string[]>(); //csvファイルの中身を入れるリスト
    public static int i = 0;  //現在地
    public Text Nametext;     //名前を表示
    public Text Logtext;     //地の文・セリフ表示
    public Image LeftImg;  //左の立ち絵
    public Image RightImg;  //右の立ち絵
    private AudioSource audio;  //ボイス取得
    private AudioClip Sound;  //ボイス出力
}

Start関数では、CSVファイルを読み込んでcsvDataリストにデータを追加します。Resources.Loadメソッドを使用して、Resoucesに保管してあるCSVファイル「Data」を読み込みます。

読み込んだCSVファイルはTextAsset型としてcsvFile変数に格納されます。StringReaderを使用してcsvFileを行単位で読み込み、各行をカンマで分割してcsvDataリストに追加します。

また、GetComponent()を使用してオブジェクトにアタッチされたAudioSourceコンポーネントへの参照を取得します。

void Start()
{
//csvファイル
csvFile = Resources.Load("Data") as TextAsset; //Resourcesにあるcsvファイルを格納
StringReader reader = new StringReader(csvFile.text); //TextAssetをStringReaderに変換

 while (reader.Peek() != -1)
 {
   string line = reader.ReadLine();   //1行ずつ読み込み 
   csvData.Add(line.Split(','));    //csvDataリストに追加
 }

//音声を取得
audio = GetComponent<AudioSource>();
}

最後にUpdate関数では、マウスの左ボタンが押されたときに実行されます。

NameText.text = csvData[i][0]; は、UIテキスト「NameText」にCSVファイルのi行目の0番目(A列)の要素を表示します。
LogText.text = csvData[i][1]; は、UIテキスト「LogText」にCSVファイルのi行目の1番目(B列)の要素を表示します。
LeftImg.sprite = Resources.Load(csvData[i][2]); は、UI画像の「LeftImg」にCSVファイルのi行目の2番目(C列)の要素に対応する画像を表示します。
RightImg.sprite = Resources.Load(csvData[i][3]); は、UI画像の「RightImg」にCSVファイルのi行目の3番目(D列)の要素に対応する画像を表示します。
Sound = (AudioClip)Resources.Load(csvData[i][4]); は、CSVファイルのi行目の4番目(E列)の要素に対応する音声ファイルを読み込んでSound変数に格納します。
audio.PlayOneShot(Sound); は、Sound変数に格納された音声を再生します。
if (i <= csvData.Count) i++; は、iがcsvDataの要素数と同じになるまで続けます。

※格納では、0から始まるので、A列は1番ではなく0番目となります。

void Update()
{
  //ボタンを押したときは画面クリック無効
  if (EventSystem.current.IsPointerOverGameObject())  return;
        
  if (Input.GetMouseButtonDown(0)) //マウス左押下
  {
    NameText.text = csvData[i][0];    //名前を表示
      LogText.text = csvData[i][1];    //セリフ・地の文を表示
      LeftImg.sprite = Resources.Load<Sprite>(csvData[i][2]);    //太郎の立ち絵に相当
      RightImg.sprite = Resources.Load<Sprite>(csvData[i][3]);    //花子の立ち絵に相当
      //音声データ
      Sound = (AudioClip)Resources.Load(csvData[i][4]);
      audio.PlayOneShot(Sound);
      if (i <= csvData.Count) i++;     //csvDataを全て読み込むまで1ずつ追加する。
  }
}

実演

では、実際に動作を確認します。

今回のスクリプト「csvcontroler.cs」をHierarchyウィンドウにアタッチをして、InspectorウィンドウにUIを対応させて下さい。

UIのアタッチまでが完了しましたら、再生ボタンを押して実行してください。

以下の動画の通りに動作すれば、成功です。

※今回は音声の出力を確認するため動画で実演しています。動画を再生する際は音に気を付けてからご覧ください。

まとめ

今回は、テキスト以外も画像と音声をCSVを使って画面上に表示しました。

スプライト(画像)を認識するには、「Resources.Load<Sprite>();」を使います。
オーディオクリップ(音)を認識するには、「(AudioClip)Resources.Load();」を使います。

これらを使うことで、「Resouces/Images/…」というようなパスを使って素材の所在を特定し、画面に表示させることができます。

タイトルとURLをコピーしました