画面を左クリックするごとに、読み込んだcsvファイルのデータを表示する。
Unityで作るノベルゲーム第3回は、Unityで読み込んだCSVファイルを画面に表示します。
- 第0回:「画面サイズ変更、ボタンとテキスト作成、UIの操作 」
- 第1回:「ExcelでCSVを作成して読み込む」
- 第2回:「画面クリックした回数だけCSVのテキストを表示する」
- 第3回: 【本記事】
- 第4回:「ボタンクリックで画面クリック判定しない方法」
- 第5回:「CSVでテキスト、画像、音をパスで認識して呼び起こす方法」
- 第6回:「Auto機能の実装」
- 第7回:「クイックセーブ・ロードの実装」
- 第8回:「改造されないセーブ・ロード実装」
前回「第2回」の製作は、「Input.GetMouseButton」を使って、Unityで読み込んだCSVファイルを一度ではなく、画面をクリック(マウス入力)をするごとに、テキストを1つずつ表示するシステムを開発しました。
alicia-ing.com/programming/unity-novel-game-2/
前回のスクリプトは「Debug.Log(“表示文字”);」を使用してCSVのテキストをconsoleウィンドウに表示していました。
しかし、consoleウィンドウはシステムが稼働しているか確認するだけで、ゲームを出力(「Build」ビルド)したときは表示されることはありません。
したがって、ゲームのプレイヤー(ユーザー)に文字を認識してもらうには、UIテキストを使用して画面上に文字を表示する必要があります。
本記事では、クリックの回数に応じて画面にテキストを表示します。
- 「Unity」のUI機能を使い方を知りたい。
- 画面上に文字を表示したい。
- ノベルゲームを作りたい。
「Unity」の標準UIとスクリプト操作
初めに、ノベルゲームのプレイ画面を作成します。
以下の画像が、「Unityでノベルゲーム」のシリーズで扱うシステム開発を進める画面になります。
この画面の詳しい作り方は第0回の「画面サイズ変更、ボタンとテキスト作成、UIの操作」で紹介しています。
本記事では、UIの使い方と操作方法をまとめていますので、あわせてご覧ください。
画面にCSVテキストを表示する
ここからは、CSVテキストを画面に表示するスクリプトを解説します。
今回のソースコードは、第2回のソースコードを修正と追加をしています。
ソースコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.UI; // 追加(UIを使用するために必要)
public class csvReader : MonoBehaviour
{
private TextAsset csvFile; // CSVファイルのテキストアセット
private List<string[]> csvData = new List<string[]>(); // CSVデータのリスト
int i = 0; // インデックスカウンター
public Text NameText; // 追加(名前を表示するテキストUI)
public Text LogText; // 追加(セリフ・地の文を表示するテキストUI)
void Start()
{
csvFile = Resources.Load("Data") as TextAsset; // "Data"という名前のテキストアセットをロードする
StringReader reader = new StringReader(csvFile.text); // CSVファイルのテキストを読み込むリーダーを作成
while (reader.Peek() != -1)
{
string line = reader.ReadLine(); // 1行読み込む
csvData.Add(line.Split(',')); // 読み込んだ行をカンマで分割してリストに追加する
}
}
void Update()
{
if (Input.GetMouseButtonDown(0)) // マウス左ボタンがクリックされたら
{
NameText.text = csvData[i][0]; // インデックスiの0番目の要素を名前テキストUIに表示する
LogText.text = csvData[i][1]; // インデックスiの1番目の要素をセリフ・地の文テキストUIに表示する
if (i < csvData.Count - 1) // インデックスiがCSVデータの要素数未満の場合
{
i++; // インデックスをインクリメントする
}
}
}
}
思い通りのゲームが作れない
Unityでゲーム開発しているけど完成しない。
技術的な壁や知識不足が原因で、思い描いたゲームを実現するのは難しいです。
しかし、Udemyは動画で実践的なゲーム開発を解説していて、
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで学習できます。
Unityの機能を網羅したいや作りたいゲームがある人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を3つ紹介します。
ビックセール開催中(10月11日まで)
対象のコースが1500円から(最大95%OFF)
Unityのはじめの一歩としておすすめ。開発例に物理挙動やアニメーションを使用しているので、今後の開発が円滑になる。
トランプを題材にした講座。カードゲームやボードゲーム開発に応用可能
UnityエンジンのインストールやC#の文法に加えて、App StoreとGoogle Playにゲームをリリース方法を解説。
容量不足を解消
Unityのプロジェクトは1.5GB~3.5GBと大きく、クリエイターはHDD・SSD増設が必要です。
価格 | 耐久性 | 静音性 | 読み書き | サイズ | |
HDD | 低 | 低 | 低 | 遅 | 大 |
SSD | 高 | 高 | 高 | 速 | 小 |
注目点は、HDDは安価だけど壊れやすい。SSDは丈夫だけど高価。
したがって、データの持ち運びをしない場合はHDD、持ち運びする場合はSSDがおすすめです。
- 据え置きHDD
- 外付けSDD
- 内蔵SSD
ぜひ、あなたのクリエイティブな作業環境に兼ね備えたストレージをお役立てください。
解説
初めに、「Unity」に標準で搭載されているUIを使用するため、名前空間へ「using UnityEngine.UI;」を追加します。
また、前回同様に、「File」クラスを使用してファイルを読み込んだり、書きこんだり、データを列挙するので、「using System.IO;」の追加が必要です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.UI;//追加(UIを使用するために必要)
続いて、変数を定義します。
csvFileとcsvDataは、CSVファイルのテキストアセットとCSVデータのリストを保持するための変数です。iは、int型変数で、CSVデータをどこを読み込んでいるか指定します。
今回はUIテキストを使用するので、「NameText」と「LogText」を追加します。
Public型のUIテキストで画面にそれぞれ名前とセリフ・地の文を表示します。
2つを定義するには、以下のようにスクリプトに書きます。
public Text "変数名";
この文法において、Textの部分をButtonにすると、ボタンの定義になります。
このことからint型やstringなどの文字列などと異なる変数の定義は以下のようにします。
(public) "要素" "変数名"
publicはアクセス修飾子であり、そのほかにもpriveteでも可能です。
自身の状況に応じて使い分けてください。
定義には、小文字ではなく先頭を大文字にすることに注意してください。このことは、後述するUIテキストを画面に表示するときの「.text」と混同しやすいです。
private TextAsset csvFile; // CSVファイルのテキストアセット
private List<string[]> csvData = new List<string[]>(); // CSVデータのリスト
int i = 0; // インデックスカウンター
public Text NameText; // 追加(名前を表示するテキストUI)
public Text LogText; // 追加(セリフ・地の文を表示するテキストUI)
Start()メソッドでは、Resources.Load()を使用して指定されたテキストアセット(ここでは”Data”)を読み込んでcsvFileに格納し、StringReaderを使ってテキストを行ごとに読み込んでcsvDataリストに格納します。
void Start()
{
csvFile = Resources.Load("Data") as TextAsset; // "Data"という名前のテキストアセットをロードする
StringReader reader = new StringReader(csvFile.text); // CSVファイルのテキストを読み込むリーダーを作成
while (reader.Peek() != -1)
{
string line = reader.ReadLine(); // 1行読み込む
csvData.Add(line.Split(',')); // 読み込んだ行をカンマで分割してリストに追加する
}
}
Update()メソッドでは、マウスの左ボタンがクリックされるたびに処理が実行されます。マウスの左ボタンがクリックされた瞬間を検出するために「Input.GetMouseButtonDown(0)」メソッドを使用します。
「NameText」と「LogText」を表示するため、それぞれ、「csvData[i][0]」と「csvData[i][1]」を代入します。
このとき、前述したUIテキストを定義をする際は「Text」と頭文字を大文字にしましたが、UIテキストを画面に表示するときは「.text」と全て小文字にすることに注意してください。
"変数名".text = "テキスト文";
「csvData[i][0]」と「csvData[i][1]」は表計算ソフトでは、A行とB行に対応しています。
int型変数「i」がString型変数「csvData」よりも小さいとiを1増やして、その値に対応する「i」のCSVテキストを画面に表示します。
「i」がCSVデータの要素数未満の場合、インデックスをインクリメントで「i」を1だけ増やします。
これにより、次の要素が次のクリック時に表示されるようになります。
void Update()
{
if (Input.GetMouseButtonDown(0)) // マウス左ボタンがクリックされたら
{
NameText.text = csvData[i][0]; // インデックスiの0番目の要素を名前テキストUIに表示する
LogText.text = csvData[i][1]; // インデックスiの1番目の要素をセリフ・地の文テキストUIに表示する
if (i < csvData.Count - 1) // インデックスiがCSVデータの要素数未満の場合
{
i++; // インデックスをインクリメントする
}
}
}
Public関数の操作、アクセス修飾子の違い
今回UIをpublicで定義しましたが、前述したように場合によってはprivateの方が良いこともあります。
しかし、これらの使い方が分かっていない人も多いかと思います。
アクセス修飾子は、「public」・「private」・「protected」・「internal」など様々あります。
ここでは、使う頻度の高い「public」・「private」を紹介します。
public
publicは、公開アクセス修飾子であり、クラスやメンバーに対して最も広範なアクセスを提供します。他のクラスやスクリプトから自由にアクセスできます。
スクリプトに、以下の変数を定義します。
public int num;
public Text txt;
これらの変数は、アクセス可能にするために、HierarchyウィンドウからUIをアタッチできます。
このように、他のクラスやスクリプトから参照や操作が必要な要素(変数、プロパティ、メソッド)を公開する際に使用します。
ここから、他のスクリプトからゲームオブジェクトの位置を取得したり、関数を呼び出したりする場合に、対象のメンバーにpublic修飾子を付けることが一般的です。
private
privateは、プライベートアクセス修飾子であり、クラス内でのみアクセスが可能です。他のクラスやスクリプトからの直接的なアクセスはできません。主に内部の実装の詳細を隠すために使用されます。
スクリプトに、以下の変数を定義します。
public int num2;
public Text txt2;
privateはクラスの内部でのみ使用される補助的な要素(変数、プロパティ、メソッド)、データの保護に使用されるので、Inspectorウィンドウからアクセスが不可能です。
public・private比較
以上のことから2つのアクセス修飾子は次のように使い分けることができます。
アクセス修飾子 | 特徴 |
public | 他のクラスやスクリプトから自由にアクセスできるようにするために使用。他のスクリプトからゲームオブジェクトの位置を取得したり、関数を呼び出したりすることができる。 |
private | クラス内でのみアクセスが必要なメンバーを制限するために使用。クラス内で使用される一時変数や、内部の実装に関連するメソッドで用いる。 |
実演
スクリプトに記載するソースコードを確認しましたので、スクリプトをHierarchyウインドウの項目にアタッチしてください。
Inspectorウィンドウに表示されたPublic関数「NameText」・「LogText」をHierarchyウインドウの項目のアタッチします。
画像のように、名前は「NameText」、セリフや地の文は「LogText」を適応させてください。
アタッチが完了しましたら、再生ボタンを押して実行します。
冒頭で紹介したような動作ができれば成功です。
※以下の動作はセリフを見やすくするために立ち絵は非表示にしています。
名前の行のセルを空白にすると何も読み込まれませんので、名前が表示されることはありません。
したがって、地の文を表示させる際は何も書かずにCSVを保存してください。
まとめ
今回は、画面のクリック回数に応じて、名前とセリフ・地の文を画面に表示させました。
名前とセリフ・地の文で「Unity」標準UIを使用するためには名前空間「using UnityEngine.UI;」をします。
UIテキストを変数として定義するときは、頭文字を大文字(「Text」)、画面上に表示(変数を代入)するときは全て小文字「.text」にします。
ここからは、Inspectorウィンドウに表示されたPublic関数はHierarchyウインドウの項目をアタッチして使うことができます。
第4回は、画面クリックした回数だけ画面の文字を表示する方法解説しています。