画面クリックすると、複数のcsvを読み込む
Unityでゲームやアプリを開発する際にCSVファイル
シナリオやデータを簡単にロードできます。
特にシナリオ分岐や膨大なデータを管理する場合、
CSVを活用することで、プロジェクトの管理が飛躍的に楽になります。
本記事では、複数のCSVファイルをロードして、
それらをシーンや選択肢に応じて動的に切り替える方法を詳しく解説します。
- Unityで分岐シナリオ(選択肢)を実装したい
- 複数のCSVファイルを簡単にロードしたい
- シナリオ管理を効率化したい
- テキストベースのノベルゲームを作成したい
- Unityでのファイル管理を学びたい
.Clear()
Clear()メソッドは、コレクション(リストや配列など)に格納されたデータを削除し、空にするために使用されます。
複数のcsvを扱う際には、CSVデータを格納するリストcsvDataをクリアして、
次にロードされるCSVファイルのデータが重複しないように管理しています。
void LoadCSV(TextAsset csvFile)
{
csvData.Clear(); // 前のデータをクリア
Line = 0; // 行番号をリセット
// CSVデータの読み込み処理
}
次のCSVファイルをロードする際に前のデータを一旦クリアすることで、
新しいデータが正常に読み込まれ、余計なバグを防ぐことができます。
csvファイルの読み込みを変更する
複数のCSVファイルを順に読み込む際に、
特定の条件やタイミングでファイルを変更したり、
次のCSVファイルに切り替える方法を学ぶことが重要です。
本スクリプトでは、index変数を使って現在のCSVファイルを追跡し、
すべての行を表示し終わったら次のファイルに自動的に切り替えます。
機能として、画面クリックでindex変数を進めます。
ソースコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using TMPro; // TextMeshProの追加
public class Multicsv : MonoBehaviour
{
public TextMeshProUGUI DisplayText; // 表示するテキストUI
public TextAsset[] csvFiles; // CSVファイル配列
private List<string[]> csvData = new List<string[]>();
private int Line = 0;
private int index = 0;
void Start()
{
if (csvFiles.Length > 0)
{
LoadCSV(csvFiles[index]); // 最初のCSVファイルをロード
DisplayNextLine();
}
else
{
Debug.LogError("CSVファイルがアタッチされていません。");
}
}
void Update()
{
if (Input.GetMouseButtonDown(0)) // クリックで次の行へ
{
DisplayNextLine();
}
}
// CSVをロードするメソッド
void LoadCSV(TextAsset csvFile)
{
csvData.Clear(); // 前のデータをクリア
Line = 0; // 行番号をリセット
StringReader reader = new StringReader(csvFile.text);
while (reader.Peek() != -1)
{
string line = reader.ReadLine();
csvData.Add(line.Split(',')); // CSVファイルの各行をリストに追加
}
Debug.Log(csvFile.name + "をロードしました");
}
void DisplayNextLine()
{
if (Line >= csvData.Count)
{
// 現在のCSVが終わったら次のCSVに切り替える
index++;
if (index < csvFiles.Length)
{
LoadCSV(csvFiles[index]); // 次のCSVファイルをロード
DisplayNextLine(); // 次の行を表示
}
else
{
Debug.Log("すべてのCSVファイルを表示しました。");
}
return;
}
string[] lineData = csvData[Line];
// テキストの表示
DisplayText.text = lineData[0]; // テキスト内容は2列目にあると仮定
Line++;
}
}
UdemyでUnityを学習
Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
- 【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の基本的なクラスや関数(例えば、MonoBehaviourやDebug.Logなど)を使うために必要です。
「System.IO」:ファイルの入出力操作を行うための名前空間で、CSVファイルの内容を読み込むために使用しています。
「TMPro」:TextMeshProを使ってUIにテキストを表示するために必要な名前空間です。
- フィールド(メンバ変数)
「DisplayText」:ゲーム内に表示するテキストUIコンポーネントを参照します。
「csvFiles」:複数のCSVファイルを配列として保持し、順に読み込むために使います。
「csvData」:現在読み込まれているCSVファイルのデータを行ごとに保持するリストです。
「Line」:現在表示しているCSVデータの行番号を管理します。
「index」:現在読み込んでいるCSVファイルのインデックスを管理します。
- Startメソッド
csvFilesにアタッチされたCSVファイルをロードし、1行目を表示します。
もしファイルがアタッチされていなければエラーメッセージを表示します。
- Updateメソッド
ユーザーのクリック入力を検知します。
クリックされるとDisplayNextLineメソッドを呼び出して次の行を表示します。
- LoadCSVメソッド
指定されたCSVファイルの内容をリストcsvDataに読み込みます。
リストcsvDataをクリアし、行番号をリセットします。
StringReaderを用いてCSVファイルの各行を読み込み、
それをカンマ区切りで分割してリストに格納します。
- DisplayNextLineメソッド
現在の行番号に対応するCSVデータをUIに表示します。
すべての行を表示し終わったら次のCSVファイルに切り替えます。
全てのCSVファイルを表示し終わった場合、処理が終了します。
実演
画面上にテキストUIを配置します。
Resourcesフォルダー内にcsvを用意し、
これらをアタッチします。
クリックごとにUpdateメソッドが呼ばれ、
現在のCSVファイルのすべての行を表示し終わったら、次のCSVファイルをロードします。
すべてのCSVファイルを表示し終わった場合は、終了メッセージを表示します。
CSVファイルは、LoadCSVメソッドを使ってテキストとして読み込まれ、
その内容をカンマ区切りでリストに保存します。
まとめ
Unityで複数のCSVファイルをロードして分岐シナリオを作成する方法を解説しました。
Clear()メソッドを使って前のデータをクリアしたり、index変数で次のファイルを動的に切り替えることで、柔軟にファイル管理ができます。
このシステムを使うことで、分岐シナリオや大規模なデータを効率的に管理し、スムーズなゲーム体験を提供できます。