クリックすると、テキストと立ち絵とボイスが出ます。
Unityで音声や画像を読み込みたいとき、”Add component”やImageを使いますが、
画像を変化させたい場面は多々あります。
そんな時は、Resourcesフォルダーとcsvファイルを使用することで簡単に実装することができます。
UnityのResourcesフォルダーは、アセット(素材)をランタイムでロードするために使用される特殊なフォルダーです。
フォルダー内のアセットは、ビルド時に自動的にパッケージ化され、
ゲームが実行されている間に動的にロードすることができます。
本記事はcsvから画像と音声を読み込む方法を紹介します。
- 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ファイルをドラッグ&ドロップして、スプリプトで処理します。
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をあまり使うことを薦めていません。
2つの観点から規模があまり大きくなくて、
メモリの消費が激しくないプロジェクトであれば使っても問題ないでしょう。
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テキストを設置するだけでよいです。
本記事では立ち絵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は、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
ビックセール開催中(12月19日まで)
対象のコースが1500円から(最大95%OFF)
- 【Unity C# ゲーム開発超入門】7つのミニゲームを作っておぼえる!UnityとC#講座
Unityで頻出の機能を実際のゲーム作りで学習。
何か作りたい、今後の開発で役立てたい初心者におすすめ
- 【Unity C# ゲーム開発初心者レベルアップ】7つのトランプゲームを作っておぼえる!UnityとC#講座
トランプやボードゲーム作りに特化している講座。
テーブルゲームを作りたい人におすすめ。
- 【全行程を網羅!最初に学びたい総合学習】Unityワールド制作講座
Unityワールド制作の全工程を学習できる講座。
RPGを作りたい人におすすめ。
- Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】
C#の文法やApp StoreとGoogle Playへゲームをリリース方法を解説。
ゲームを出品したい人におすすめ。
解説
初めに名前空間を定義します。
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/…」というようなパスを使って素材の所在を特定し、画面に表示させることができます。