【Unity】csvファイルから画像と音声をパスで読み込み

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

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

csvで画像、音声の読み込み

Unityで音声や画像を読み込みたいとき、”Add component”やImageを使いますが、
画像を変化させたい場面は多々あります。

そんな時は、Resourcesフォルダーとcsvファイルを使用することで簡単に実装することができます。

UnityのResourcesフォルダーは、アセット(素材)をランタイムでロードするために使用される特殊なフォルダーです。

フォルダー内のアセットは、ビルド時に自動的にパッケージ化され、
ゲームが実行されている間に動的にロードすることができます。

本記事はcsvから画像と音声を読み込む方法を紹介します。

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

Resourcesフォルダーの作成

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

Resourcesフォルダー作成

Resourcesの基本文法

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

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

Resourcesフォルダー素材

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

Resourcesフォルダー、copy path

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

//文字をロードする例
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()があります。
Resourcesが非推奨な理由を解説しています。

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を編集します。
テキストは、UIテキストを設置するだけでよいです。

a

本記事では立ち絵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ずつ追加する。
        }
    }
}

UdemyでUnityを学習

Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。

\Unityの学習から収益化の方法はこちらから!/

ビックセール開催中(12月19日まで)
対象のコースが1500円から(最大95%OFF)

多彩な講座から自分に合った講座を探そう!

最大95%OFF

終了まで

時間




解説

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

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/…」というようなパスを使って素材の所在を特定し、画面に表示させることができます。

Udemyで学習する

この記事を書いた人

プロフィール

アリッシア

                 

大学4年間で何か胸を張れるスキルを身に着けたくて当サイト運営を始めました。
現在、大学院に進学するか就職するか迷いながら勉強しています。
詳しいプロフィールはこちら

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

スポンサーリンク
Unity
フォローする
タイトルとURLをコピーしました