Unityにテキストファイルを取り込んでスクリプトから読み込む

今回はテキストファイルをUnityに取り込んでその中に記述してあるテキストをスクリプトから操作してみます。

これが出来ると何がいいかと言うとRPGやサウンドノベルゲームで会話のテキストを多く使用する場合、スクリプト内にテキストを記述してもいいですが、

テキスト量が多くなり処理内容を探すだけでウインドウを多くスクロールする必要が出てきます。

スクリプト内には処理する内容だけを記述し、実際に表示するテキストと分けておいた方が管理しやすくなります。
(テキストだけを記述したクラス等を作成して、表示したいテキストを返すようにするのもいいかもしれません)

スポンサーリンク

テキストファイルを取りこむサンプルの作成

テキストファイルの作成

まずはパソコン内にテキストファイルを作成します。

Unityに取り込む為テキストファイルを作成

↑のように普通のテキストファイル(.txt)を作成します。

テキストファイルに記述した内容

↑のようにサンプルのテキストを記述します(↑はテキストファイルの中身です)。

ここでは適当にテキストを入力してください。
スクリプトで1回に表示するのは改行までになります。

Unityで作成したテキストファイルを取りこみResourcesフォルダに入れる

Unityのメニューからテキストファイルを読み込む

UnityのメニューのAssets→Import New Asset…を選択し、さきほど作成したテキストファイルを選択します。

Unityに取り込んだテキストファイルの画像

Unityに取り込むとテキストファイルは↑のようになります。

取り込んだテキストファイルをダブルクリックするとデフォルトではMonoDevelopが起動しテキストの内容を変更する事が出来ます。

Unity内でテキストファイルの作成は出来ないんかな?(謎)

Unityでテキストファイルの中身を作るには一旦ダミーのテキストファイルを取り込んだ後に中身を編集する必要があるかもしれませんね。

次にUnityに取り込んだTest.txtをCtrl+Dキーでコピーし名前をTest2とします。

Test2ファイルの中身は

Resourcesフォルダに入れたテキストファイルの中身

↑のようにしました。

その後ProjectタブのAssetsフォルダで右クリック→Create→Folderを選択し、名前をResourcesとします。

フォルダをResourcesとすると特別なフォルダとなります。

Resourcesフォルダにあるアセットやオブジェクトを直接読み込む事が出来ます。

スクリプトから指定のテキストファイルを選択する時に直接ファイル名で読みだす事が出来ます。

このフォルダにTest2ファイルを移動させます。

これでテキストファイルの準備が出来たので、次は左クリックした時にTestファイルの中身を、右クリックした時にTest2ファイルの中身を表示するようにしてみます。

テキストファイルの中身表示用UIを作成

まずはテキストファイルの中身を表示するUIを作成します。

読み込んだテキストを表示するUI

↑のようにシンプルにCanvas直下にTextを作成します。

テキストファイルの中身を読み込むLoadTextスクリプトの作成

Canvasには新しくLoadTextスクリプトを作成し取りつけておきます。
LoadTextは以下のようになります。

それでは中身を少し見てみましょう。

LoadTextスクリプトの解説

テキストファイルを扱うにはTextAssetを使用する必要があります。
その参照変数をtextAssetとしたら

で中身を全部取り出せます。

ResourcesフォルダのTest2ファイルを取り出すには

Resources.Load関数を使用し第1引数にファイル名、第2引数にそのファイルの型を指定します。

読み込んだテキストファイルは改行文字(¥n)を含んだ形で記述されていますので、Split関数を使用して\nを使って分割し文字列型の配列に入れます。

Splitは引数の文字で分割し、文字列型の配列を値として返します。

通常のJavaScriptであれば

『分割したい文字列』.Split(“\n”);

で分割出来るんですがUnityだと”(ダブルクォーテーション)、’(シングルクォーテーション)どちらでもstring型と判断されてしまう為、あえて

として、\nを1つの文字に変換して使用しています。
Parseはその型に変換する事が出来ます。

一番難しい部分は説明し終えました。

後は配列に入れたメッセージを順番に表示しているだけです。

ただ\nで分割しているので連続で改行文字が来た場合は配列の中身が空の場合があります。

そういった時は会話が終了した時と判断し会話を終わらせたりして、次の会話がくるまで待たせたりする事が出来ます。

テキストファイルの読み込みを確認する

ではUnityを実行してメッセージが表示されるか確認してみましょう。

LoadTextのインスペクタの設定

LoadTextは↑のように設定します。

読み込んだテキストファイルの中身を表示するサンプル

↑のようになりました。
改行文字でメッセージが区切られている為マウスボタンを押すたびに次の文字列が表示されています。

サンプル動画では最後適当に連打していますが気にしないでください・・・・・(^_^;)

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. 宮津木 より:

    なんども、すみません。
    テキストファイルを確認し、検証したところ何故か私のほうでは日本語が表示されないというか読み込めないようです。
    ファイルをMicrosoft Visual Studioで開いて編集しているのですが、これが原因でしょうか。その場合、どのようにすれば別の方法でテキストを開けますか?

    • Unityに取り込んだテキストファイルの文字コードが原因のようです。

      TeraPad等のテキストエディターを使用しているならば設定で文字コードの変換をしておくことが出来ますが、Windowsのメモ帳等を使用する場合は保存する時に文字コードをUTF-8にしておきます。

      既に作成しているテキストファイルの場合はファイルを開いて名前を付けて保存を選んで開いたウインドウの下の方にある文字コードをUTF-8に変更し、保存ボタンを押します。

      メモ帳での文字コードの変換

      その後、このファイルをUnityにドラッグ&ドロップして取り込めば問題なく動作出来ました。(^^)/

      • 宮津木 より:

        ありがとうございました。無事、テキストに表示することができました。

  2. 宮津木 より:

    このプログラムは2Dの場合でも正常動作するのでしょうか。
    Unityでノベルゲームを作っているので参考にしたいです。

    • 2D、3Dの違いはUnityエディターの設定であったり、コライダの衝突(2D、3Dで使っている物理エンジンが違う)の違いがあったりしますが、

      テキスト処理では2Dでも3Dでも問題なく動作すると思います。(^^)/

      • 宮津木 より:

        返信ありがとうございます。
        そうなんですね…Unity初心者なので、とても助かります。

      • 宮津木 より:

        原因は自分だと思うのですが、オブジェクトがセットされていませんというエラーがでて先に進みません。改善策などはあるでしょうか。

        • おそらくNull参照だと思われます。

          原因の探り方としては

          https://gametukurikata.com/basic/errors

          を参照してみてください。

          UnityエディターのConsoleにエラーが出ていると思うのですが、そこをダブルクリックするとスクリプトエディターのエラーが発生した箇所がわかります。

          記述したスクリプトと、どの行でエラーが出ているかを書いて頂ければ、お手伝いする事も出来るかと思います。(^^)/

          • 宮津木 より:

            参照の件は解決したのですが、次は
            if(splitText1[textNum1] != “”)の行で配列が範囲外だというエラーがでてしまいます。
            右クリックの方は問題なく動きますが、左クリックの部分が動きません。
            配列がうまく宣言できてないんでしょうか?

          • 範囲外エラーが出る原因としてはインスペクタに設定したテキストファイルの中身が空の場合に発生します。

            この記事のスクリプトをそのまま使用している場合は今のところ発生する原因はそれかなと思います。