【Unity】CSVファイルを読み込み、テキストを画面に表示する

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます

再生ボタンを押すと、Consoleウィンドウと画面上にcsvのデータを表示する。

CSVファイルをUnityで表示

ゲーム作成で欠かせないものはデータです。
例えばRPGは、モンスターの名前とパラメータ(HP、攻撃力、防御力)
加えて、アイテム情報が必要です。
また、ノベルゲームではセリフや名前、登場人物の立ち絵が欲しいです。

ゲームのジャンル・規模に関わらずデータ管理は必要不可欠です。
特に、スケールの大きいゲームは膨大な数のデータを扱う必要があります。

ゲームのデータを簡単に取り扱うには、csvファイルの使用がおすすめで、
Unityは、csvをロードすることが可能です。

本記事は、ExcelやGoogleスプレッドシートのような表計算ソフトでcsvを作成して、
Unityに保存したcsvデータを画面上に表示する方法を紹介します。

本記事は次の人におすすめ
  • 「Unity」でCSV(テキストファイル)の導入をしたい。
  • ゲームデータの管理を簡単にしたい。
  • UIを使えるようになりたい。
スポンサーリンク

CSVファイル

CSVファイル(Comma Separated Values)は、表形式のテキストデータを簡単に記録・保存・共有するために使用されます。

一般的にコンマを区切り文字として各フィールドが区切られます。
ただし、CSVファイルには特定の区切り文字を含むことはありません。
タブ・セミコロンなどもあり、.tsvや.ssvと表記されます。

CSVファイルは非常にシンプルなテキスト形式(構造)なので、行ごとにデータが格納されます。
各行はカンマで区切られたデータフィールド(セル)で構成させるため、汎用性が高いです。

テキストベースの形式で、多くのプログラムやツールでサポートされています。
Excel、Googleスプレッドシートのような表計算ソフトに加えて、
メモ帳などの多くのアプリケーションで使用されて、データの読み書きが可能です。

データベースのエクスポートやインポート、スプレッドシート間でのデータのやり取り、
プログラム間でのデータ転送などで活用されます。

Excel(表計算ソフト)を使うメリット

表計算ソフトを使わずに、メモ帳でCSVファイルを作成すると、
スペースやコンマなどの区切り文字を1つだけ入れるので、項目がずれて見えにくいです。

「田中次郎」は名前の項目だけれども、文字数の関係で、隣の項目まで干渉してしまいます。

隣との間隔を取って解決しようと文字を入れると誤認識してしまい、
区切り文字を2回使うと1つずれます

したがって、メモ帳でCSVファイルを作ることは向いていません

一方で、表計算ソフトは行と列がセルで区切られています。
2行目にキャラクターの名前「太郎」、レベルが15、HPは30というように、
それぞれのパラメータを横に並べることができます。

キャラクターを増やす場合は、下の行に新しいデータを並べることができます。

CSVファイルを使用することはゲーム開発においても、データを効率的に管理することができます。

CSV作成

初めに、Excelあるいはスプレッドシートでcsvファイルを用意します。
本記事では、2列で作成します。

A列には、ひらがな・カタカナ・漢字で果物の日本語表記を入力しています。
B列には、A列に対応する果物の英語を入力します。

完成後、作成したシートをCSV形式で保存してください。

スプレッドシートでcsvファイルを保存

スプレッドシートはGoogle社が提供するサービスで、エクセルと同様に表計算ができます。
Googleアカウント(無料作成)を持っていれば、誰でも無料で使用できます。

初めに、Googleスプレッドシートを開き、ファイルメニューをクリックします。
項目の中から「ダウンロード」を選択します。
「ダウンロード」のドロップダウンメニューをクリックし、カンマ区切り形式(.csv)を選択します。

これで、スプレッドシート上のデータがCSV形式で保存されます。ファイル名を指定すると、ファイルがダウンロードされます。

Excelでcsvファイルを保存

大学でOfficeを購入することを義務づけられていることがほとんどで、
Excelは買い切り・サブスクでしか使えないと思っていることでしょう。

しかし、OfficeはMicrosoftアカウント(無料作成)を持っていると、無料で利用できます。
ExcelかGoogleスプレッドシート自分が慣れているソフトウェアで作成してください。

初めに、Excelでファイルを開き、ファイルメニューをクリックします。
項目の中から「名前を付けて保存」を選択します。
参照を選択して、ファイルの種類から「CSV UTF-8(コンマ区切り)」を選択します。
ファイル名を入力し、「保存」をクリックします。

これで、Excel上のデータがCSV形式で保存されます。

「csv(コンマ区切り)」でもcsvファイルが作成できますが、
Unityにロードした時に文字化けするので、UTF-8を使用してください。

UnityにCSVを導入

CSVファイルをUnityを導入します。

Unityを起動して、Projectウィンドウ内のResourcesフォルダを選択します。
Unity Hubからprojectを新規作成した場合、Resourcesフォルダは作成されていません。

projectウィンドウを右クリックあるいはプラスから、
「Creat>Folder」と選択して、フォルダを作成します。
フォルダを右クリックして「Rename」で「Resources」に変更します。

後述するソースコードにて、「Resources.Load()」を使います。
ゆえに作成するフォルダ名は文字の間違いや大文字・小文字にも注意が必要です。
フォルダー名は必ず「Resources」にして表記の揺らぎがないようにしてください。

作成したResourcesフォルダに表計算ソフトで作成したCSVファイルを追加します。
ドラッグ&ドロップ移動で導入できます。

CSVファイルを読み込む

先ほどまでの工程は、CSVファイルをUnityに保管しているだけです。
ゆえに再生ボタンを押しても、「Unity」で読み込むことはありません。

UnityでCSVを取り扱うには、スプリプトで処理する必要があります。

ソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO; //追加

public class csvReader : MonoBehaviour
{
    private TextAsset csvFile; // CSVファイル
    private List<string[]> csvData = new List<string[]>(); // CSVファイルの中身を入れるリスト

    void Start()
    {
        csvFile = Resources.Load("Sample") 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リストに追加する
        }

        for (int i = 0; i < csvData.Count; i++) // csvDataリストの条件を満たす値の数(全て)
        {
            // データの表示
            Debug.Log("日本語:" + csvData[i][0] + ", English:" + csvData[i][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

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

解説

  • 名前空間

「System.Collections」:コレクション型やその他のデータ構造を扱うための基本的なクラスを提供します。例えば、リスト、配列、キュー、スタックなどのデータ構造を操作するのに使用されます。

「System.Collections.Generic」:ジェネリック型のコレクションクラスを提供します。ジェネリック型は、型を指定してコレクションを作成できるため、型の安全性を保ちながらコレクションを使用できます。

「UnityEngine」:Unityのクラスやメソッドへのアクセスを可能にします。

「System.IO」:ファイルやディレクトリを操作するための基本的な入出力操作を提供します。CSVファイルを読み込むために使用されます。

  • フィールド(メンバ変数)

「csvFile」:CSVファイルの中身を保持するためのTextAsset型の変数です。
「csvData」:CSVファイルの各行を格納するリストです。各行は文字列配列として格納されます。

  • Startメソッド

Unityで動作するゲームオブジェクトにアタッチされたcsvReaderクラスであり、
指定されたCSVファイルを読み込み、その内容をデバッグログで表示します。

「Resources.Load(“Sample”) as TextAsset」:Resourcesフォルダ内にある”Sample”という名前のファイルを読み込み、その内容をTextAsset型のcsvFile変数に格納します。拡張子.csvは不要です。

「StringReader(reader.Peek() != -1)」:csvFile.textをStringReaderに変換します。Peek()メソッドは、次に読み込まれる文字を返します。-1が返されるまで(ファイルの終端まで)繰り返し、1行ずつ読み取ります。

「csvData.Add(line.Split(‘,’))」:各行をコンマで分割し、文字列配列としてcsvDataリストに追加します。これにより、CSVファイルの各行がリストに格納されます。

Text Asset型の変数とは

int型やfloat型、string型のように他のプログラミング言語でよく見かける変数とは違い、TextAsset型はUnity限定の変数です。

Unity公式のマニュアルでは、以下のように説明されています。

Text Asset は、インポートされたテキストファイルのための形式です。プロジェクトフォルダーにテキストをドロップすると、テキストアセットに変換されます。以下のファイル形式がサポートされています。

テキストアセット – Unity マニュアル


要するに、TextAsset型の変数を使用することで、csv形式やtxt形式、html形式をUnityでスクリプト内で直接が読み込みが可能になると考えてください。

表計算シート

表計算ソフトで作成したデータをcsv形式に変換する前

csv形式へ変換

表計算ソフトで作成したデータをcsv形式に変換する後


「csvData[i][0]」と「csvData[i][1]」は、それぞれi番目の行の1列目と2列目を表します。「Debug.Log()」メソッドを使用して、読み込んだCSVファイルの内容をConsoleウィンドウに表示します。

表計算ソフトのセルは「A1」、「B11」のようにアルファベットと数字の2次元配列であるので、スクリプトでも反映します。

しかし、配列は「1」ではなく「0」から始めることに注意してください。
また、表計算ソフトでは、「アルファベット・数字」の順ですが、スクリプトでは、「数字、アルファベット」の順になります。
加えて、数学で扱う「x,y座標」は右方向、上方向に正(数字が増える)になりますが、表計算ソフトでは、右方向、下方向に正(数字が増える)とみなします。

つまり、「A1」は「(0,0)」、「B11」は「(10,1)」となります。

表計算シート

A1B1C1
A2B2C2
A3B3C3

スクリプト

csvData[0][0]csvData[0][1]csvData[0][2]
csvData[1][0]csvData[1][1]csvData[1][2]
csvData[2][0]csvData[2][1]csvData[2][3]

動作確認

Resourcesフォルダには、csvの他にもセリフや画像などの素材を保管するので、
Resourcesフォルダの中にそれぞれのフォルダを作成して、csv管理をおすすめします。

例えば、Resourcesフォルダーの中に、csvフォルダーを作成して、その中にcsvを保管するのであれば、「Resources>csv>Sample.csv」と管理されているので、以下のように変更してください。

csvFile = Resources.Load("csv/Sample") as TextAsset;   //Resourcesのcsvのsample.csvを格納

このときも、拡張子「.csv」の記述は不要です。

ソースコードをHierarchyウインドウのゲームオブジェクトにアタッチしてください。
アタッチをせずに、スタートしても何も変化はありません

今回は、シーン名「SampleScene(デフォルト名)」の配下にある「Main Camera」へアタッチしました。

再生ボタンを押して実行します。冒頭で紹介したように、Consoleウィンドウにそれぞれ対応するcsvファイルのテキストが表示できていれば正しい動作をしています。

画面上にCSVテキストを表示

Debug.Log()は、ConsoleウィンドウにCSVファイルのテキストを表示しました。
Consoleウィンドウ上の表示は、ビルドしたゲーム上では文字が出ることがありません。

画面上にcsvのテキストを表示するには、textmeshproを使う必要があります。

textmeshproの使い方を紹介しています。
CSVファイルから画像や音声を読み込む方法を紹介しています。

ソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using TMPro;

public class csvReader : MonoBehaviour
{
    private TextAsset csvFile; // CSVファイルのテキストアセット
    private List<string[]> csvData = new List<string[]>(); // CSVデータのリスト
    int i = 0; // インデックスカウンター
    public TextMeshProUGUI Englishtext;
    public TextMeshProUGUI Japanesetext;

    void Start()
    {
        //csvファイル読み込み
        csvFile = Resources.Load("Sample") as TextAsset; 
        StringReader reader = new StringReader(csvFile.text); 

        while (reader.Peek() != -1)
        {
            string line = reader.ReadLine();
            csvData.Add(line.Split(','));
        }
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) // マウス左ボタンがクリック
        {
            //TextMeshProにcsvテキストを代入
            Englishtext.text = csvData[i][0]; 
            Japanesetext.text = csvData[i][1]; 

            if (i < csvData.Count - 1) // インデックスiがCSVデータの要素数未満の場合
            {
                i++; // インデックスをインクリメントする
            }
            Debug.Log(csvData[i][0] + csvData[i][1]);
        }
    }
}

解説

  • 名前空間

「using TMPro」:TextMeshProUGUIを使用するために必要です。

  • フィールド(メンバ変数)

「i」:インデックスをカウントするための変数です。CSVデータの要素を取得する際に使用されます。
「Englishtext」:英語のテキストを表示するTextMeshProUGUI要素を格納するための変数です。
「Japanesetext」:日本語のテキストを表示するTextMeshProUGUI要素を格納するための変数です。

  • Updateメソッド

マウスの左ボタンがクリックされたときにCSVデータから英語と日本語のテキストを取得して、
それぞれEnglishtextとJapanesetextに表示します。

インデックスiをインクリメントして次のデータに進みます。最後の行まで表示した場合は、インデックスiの値がcsvDataの要素数未満になるように制御しています。

まとめ

csv形式をUnityで適用するには、「using System.IO」を追加して、StringReaderを適応します。読み込んだcsv形式をリスト化します。「.peek()」が-1になるまでreader.ReadLine()を1行ずつ読み込みます。コンマで区切って追加することでできます。

さらに、csv形式やtxt形式,html形式はExcelやスプレッドシートで管理できるので、円滑にゲーム制作を進めることができます。

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