blockun dialy

同人ゲーム制作サークル「SaNa」のメンバーが書くゆるーいブログです。

Unityでノベルゲームの基礎 テキストデータの読み込み スクリプト解説!

はおっ(0^∀^)ノ

渚です!

最近,月1で1本 ゲーム作れていないことに愕然としています。 ちょっと,イベントがあるやら,修士論文書かなくちゃだわ,仕事は普通にあるだわで 馬鹿みたいに忙しく,落ち着いた後は,燃え尽き症候群的なことになってしまい,何やってたか記憶がない・・・

ですが,ようやく落ち着きました!

ところで?「れお」さんというかたより
「はじめまして、学生でUnityを使ってゲームを製作している者です。
 私もゲーム中の要素として、シナリオを実装したいと考えておりました。
 いつかスクリプトの中身を解説された記事を投稿していただけることを期待しております。」
という,コメントが120日以上前にあったので(ぉぃ

本気で,気付かなかったんですorz ごめんなさいorz

スクリプトの解説をしたいと思います。

まぁ,今更書いても「れお」さんも自己解決してるだろうなとは思うのですが 気になる方がいらっしゃるなら,全力で答えるのが私のモットー

ちなみに,ちゃんとしたノベルゲー作るなら,以下のサイトはおすすめです!

tsubakit1.hateblo.jp

ということで・・・!これが,テキストデータ読み込み部分のスクリプト

/// <summary>
/// テキストデータの読み込み。
/// </summary>
/// <remarks>
/// テキストデータを読み込み、読み込んだテキストデータをステージデータに格納し、空白を削除する
/// </remarks>
void ReadTextData()
{
    // TextAssetとして、Resourcesフォルダからテキストデータをロードする
    stageTextAsset = Resources.Load(filePath) as TextAsset;
    // 文字列を代入
    char[] kugiri = { '\r', '\n' };
    string [] data = stageTextAsset.text.Split(kugiri);
    int Number = 1;
    foreach(string str in data)
    {
        if(str != "")
        {
            if (str.Length > 1 && str.Substring(0, 2) == ">>")
            {
                List<string> slist = new List<string>();
                stageData.Add(Number++, slist);
            }
            else
            {
                stageData[Number - 1].Add(str);
            }
        }
    }
    stageDataMax = stageData.Count;
    //for (int i = 1; i < stageDataMax; i++)
    //    for (int j = 0; j < stageData[i].Count; j++)
    //        Debug.Log(i + ":" + j + ":" + stageData[i][j]);
}

たしか,どっかのサイトのスクリプトをお借りして,編集したものだと思うのですが 探したけれど,どこから引用したか,わかんなかったorz

ちなみに,準備したテキストデータは,こちらから

circlesana.hatenablog.com

stageTextAssetは,TextAsset型です。 対応しているテキストファイルの拡張子は,以下のものらしい。 .txt .html .htm .xml .bytes .json .csv .yaml .fnt

細かいところは,以下で確認してね。 docs.unity3d.com

Resources.Loadは,Unityのプロジェクトに,Resourcesフォルダを作り,その中に入っているデータなら, 簡単に取得できるよっていう,魔法の呪文。逆に言うと,Resourcesフォルダではない場所にあるデータは, 取得するのが,正直面倒。。;できるんだよ?wwwとか,Systemを使うとか,ほかにも・・・

filePathには,string filePath = "Text/text"; 
こんな感じで,文字列が入ってます。
この場合だと,Resourcesフォルダの中に,Textフォルダがあって,text.txtファイルが入れてあるという感じです。

string data = stageTextAsset.text.Split(kugiri);は, Resources.Loadで取得した全文章を,string dataという配列に一括で入れます。 あとは,dataが,1行づつの配列になってるので,1行ごとに処理していく感じです。

stageDataは,private Dictionary<int, List> stageData = new Dictionary<int, List>(); こんな感じで,定義されています。
intの番号で,Listが取得できる仕組み。
つまり,intの番号が0ならば, 
 「ガラララ」 
1ならば, 
 「いらっしゃいませぇ~
  桜の占い屋はこちらですょ~」
  間延びした声の少女は,学校で有名な占師の清水桜だ。
という文字列のリストが取得できる仕組み

foreachの中の処理は,以下のような感じです。
1.strが空白じゃなければ。(普通はないはずだけれど,一応念のため)
2.str.Length > 1(1行の長さが,1文字以上で) かつ
  str.Substring(0, 2) == ">>"(1~2文字目が >> と同じ)ならば・・・
   3.Listの新規作成と,stageDataへの追加
4.同じではない・・・ つまり,@@か,本文になる場合
   5.先ほど新規作成した,Listに,stageDataからアクセスして追加

stageDataMaxは,int型で,文章の塊が最大いくつかを保存しておく。(使いどころは,文章の最後まで読み切ったときに把握できるように)

最後のコメントを解除すると,どういう文章が入っていたかわかるようになります。

ということで,まずはテキストデータを読み込むスクリプトを解説しました~。