画面を左クリックするごとに、読み込んだcsvファイルのデータを表示する。
Unityで動作を確認するときに、Debug.Log()をしますが、
これは何の処理が実行されたか把握するものです。
consoleウィンドウはシステムが稼働しているか確認するだけで、
ゲームを出力(「Build」ビルド)したときは表示されることはありません。
要するに、ゲームのプレイヤー(ユーザー)に文字を認識してもらうには、
UIテキストを使って文字を表示する必要があります。
本記事では、クリックの回数に応じて画面にテキストを表示します。
この機能は、ノベルゲームで使うことができます。
- 「Unity」のUI機能を使い方を知りたい。
- 画面上に文字を表示したい。
- ノベルゲームを作りたい。
UIテキスト
UIテキストは、Hierarchyウィンドウを選択し、UI、Textmeshproを選択することで導入できます。
現在は、Textmeshproを使うことが主流です。
ただし、デフォルトのままだと日本語対応していないので、設定する必要があります。
画面にCSVテキストを表示する
ここからは、CSVテキストを画面に表示するスクリプトを解説します。
画面上にテキストを表示できても、コードで制御する必要があります。
ノベルゲームにおいて管理したいものは、セリフだけではないです。
例えば、立ち絵やキャラクターボイス、効果音などがあります。
これら画像や音楽も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]);
}
}
}
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の基本的なエンジン機能やオブジェクト操作のために必要。
System.IO:ファイル入出力を扱うためのクラスを提供。CSVファイルを読み込むために必要。
TMPro:TextMeshProを操作するために必要。ユーザーインターフェースのテキスト表示に用いる。
- フィールド(メンバ変数)
csvFile:CSVファイルを保持するための変数。TextAsset型としてリソースから読み込んだファイルのデータを保持する。
csvData:CSVファイルから読み込んだデータを格納するリスト。各行をstring[]として分割し、リストに保存する。
i:CSVデータの行を指し示すインデックスカウンター。ユーザーがクリックした際に表示するデータを制御する。
Englishtext:TextMeshProのUI要素。英語のテキストを表示するために使用される。
Japanesetext:TextMeshProのUI要素。日本語のテキストを表示するために使用される。
- Startメソッド
シーンが開始された際に実行される。
Resources.Loadを使用してリソースフォルダ内の”Sample”という名前のCSVファイルを読み込み、StringReaderでその内容を行ごとに読み取る。
各行はカンマ(,)で区切られ、csvDataリストに格納される。
「csvData[i][0]」と「csvData[i][1]」は表計算ソフトでは、A行とB行に対応しています。
- Updateメソッド
フレームごとに呼び出される。
マウスの左ボタンがクリックされると、csvDataの現在のインデックスiに対応する英語テキストと日本語テキストをそれぞれEnglishtextとJapanesetextに設定する。
さらに、インデックス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関数「Englishtext」・「Japanesetext」をHierarchyウインドウの項目のアタッチします。
アタッチが完了しましたら、再生ボタンを押して実行します。
冒頭で紹介したような動作ができれば成功です。
名前の行のセルを空白にすると何も読み込まれませんので、名前が表示されることはありません。
したがって、地の文を表示させる際は何も書かずにCSVを保存してください。
まとめ
今回は、画面のクリック回数に応じてUIテキストを進める方法を紹介しました。
「Unity」標準UIを使用するためには名前空間「using UnityEngine.UI;」をします。
UIテキストを変数として定義するときは、頭文字を大文字(「Text」)、画面上に表示(変数を代入)するときは全て小文字「.text」にします。