再生ボタンを押すと、Consoleウィンドウと画面上にcsvのデータを表示する。
ゲーム作成で欠かせないものはデータです。
例えばRPGは、モンスターの名前とパラメータ(HP、攻撃力、防御力)
加えて、アイテム情報が必要です。
また、会話で話を進めるノベルゲームではセリフや名前、登場人物の立ち絵が欲しいです。
ゲームのジャンル・規模に関わらずデータ管理は必要不可欠です。
特に、スケールの大きいゲームは膨大な数のデータを扱う必要があります。
ゲームのデータを簡単に取り扱うには、csvファイルの使用がおすすめで、
Unityは、csvをロードすることが可能です。
本記事は、ExcelやGoogleスプレッドシートのような表計算ソフトでcsvを作成して、
Unityに保存したcsvデータを画面上に表示する方法を紹介します。
- 「Unity」でCSV(テキストファイル)の導入をしたい。
- ゲームデータの管理を簡単にしたい。
- UIを使えるようになりたい。
CSVファイル
CSVファイル(Comma Separated Values)は、
表形式のテキストデータを簡単に記録・保存・共有するために使用されます。
一般的にコンマを区切り文字として各フィールドが区切られます。
ただし、CSVファイルには特定の区切り文字を含むことはありません。
タブ・セミコロンなどもあり、.tsvや.ssvと表記されます。
CSVファイルは非常にシンプルなテキスト形式(構造)なので、行ごとにデータが格納されます。
各行はカンマで区切られたデータフィールド(セル)で構成させるため、汎用性が高いです。
テキストベースの形式で、多くのプログラムやツールでサポートされています。
Excel、Googleスプレッドシートのような表計算ソフトに加えて、
メモ帳などの多くのアプリケーションで使用されて、データの読み書きが可能です。
csvファイルは、互換性・汎用性高いことは、様々なシーンで使用できることから分かります。
プログラミング言語として、人気なPythonでもcsvは標準ライブラリであり、
データを格納することができます。
現在流行している「ゆっくり実況・解説」や「ずんだもん」を使った合成音声動画の台本はcsvは使用され、編集ソフトymm4にインポートができます。
データベースのエクスポートやインポート、スプレッドシート間でのデータのやり取り、
プログラム間でのデータ転送などで活用されます。
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ファイルを追加します。
ドラッグ&ドロップ移動で導入できます。
Resourcesフォルダは非推奨?
Resourcesフォルダは、手軽にアセットを動的に管理できる機能ですが、ビルドサイズの増加やメモリ管理の難しさなどデメリットもあります。プロジェクトの効率とパフォーマンスを最適化するために「アドレッサブルシステム」を利用することが推奨されます。
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]);
}
}
}
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へゲームをリリース方法を解説。
ゲームを出品したい人におすすめ。
解説
- 名前空間
「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ファイルの各行がリストに格納されます。
int型やfloat型、string型のように他のプログラミング言語でよく見かける変数とは違い、TextAsset型はUnity限定の変数です。
Unity公式のマニュアルでは、以下のように説明されています。
Text Asset は、インポートされたテキストファイルのための形式です。プロジェクトフォルダーにテキストをドロップすると、テキストアセットに変換されます。以下のファイル形式がサポートされています。
テキストアセット – Unity マニュアル
要するに、TextAsset型の変数を使用することで、csv形式やtxt形式、html形式をUnityでスクリプト内で直接が読み込みが可能になると考えてください。
表計算のスプレッドシートから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)」となります。
表計算シート
A1 | B1 | C1 |
A2 | B2 | C2 |
A3 | B3 | C3 |
スクリプト
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ファイルのテキストが表示できていれば正しい動作をしています。
Can’t add scriptが表示される
「Can’t add script」は、スクリプトをコンパイルした時にコードが正しいのに、
Hierarchyウインドウにアタッチすると、表示されることがあります。
これは、ファイル名とクラス名が一致していないことで生じます。
画面上にCSVテキストを表示するには?
Debug.Log()は、ConsoleウィンドウにCSVファイルのテキストを表示しました。
Consoleウィンドウ上の表示は、ビルドしたゲーム上では文字が出ることがありません。
画面上にcsvのテキストを表示するには、UIテキストを使用します。
UIテキストは、legacyとtextmeshproがあります。
legacyは日本語を簡単に導入できますが、制御しにくいという問題点があります。
したがって、textmeshproの使用を検討してください。
csvで管理できるのは文字(セリフだけ?)
csvは、文字を基本的に扱います。
しかし工夫をすれば、csvファイルで画像や音声も管理できます。
方法はパスを使用します。
セルにパス(Path)を入力して、
パスに基づいて画面上に画像や音声を出力します。
CSVファイルを複数読み込み
ノベルゲームでは、ゲームの選択肢が存在します。
選択によってゲームのシナリオを変える必要があります。
上記の状況には、複数のCSVファイルを読み込むことをおすすめします。
まとめ
csv形式をUnityで適用するには、「using System.IO」を追加して、StringReaderを適応します。読み込んだcsv形式をリスト化します。「.peek()」が-1になるまでreader.ReadLine()を1行ずつ読み込みます。コンマで区切って追加することでできます。
さらに、csv形式やtxt形式,html形式はExcelやスプレッドシートで管理できるので、円滑にゲーム制作を進めることができます。