blockun dialy

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

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

はおっ(0^∀^)ノ

渚です!

circlesana.hatenablog.com

を,少し前に書きました。
読み込んだら,表示でしょう?
ということで,テキストデータの表示について解説していきます。

void NextText()
{
    // 次の文字
    stageDataIndex++;
    if (stageDataMax < stageDataIndex)
        return;
    //Debug.Log("MAX" + stageDataMax + "INDEX" + stageDataIndex);

    // 文章表示領域の,文章を消す。
    DisplayArea.text = "";
    for (int i = 0; i < stageData[stageDataIndex].Count; i++)
    {
        if (stageData[stageDataIndex][i].Length > 1 && stageData[stageDataIndex][i].Substring(0, 2) == "@@")
        {
            // @@の場合

            // @@?0の ?の番号により,背景を設定する
            DrawBackGround(stageData[stageDataIndex][i].Substring(2, 1));

            // @@0?の ?の番号により,キャラクターを設定する
            DrawCharacters(stageData[stageDataIndex][i].Substring(3, 1));

            if (stageData[stageDataIndex][i].Length >= 5)
            {
                if (stageData[stageDataIndex][i].Substring(4, 1) == ":")
                {
                    // 名前を表示する
                    NameDisplayArea.text = stageData[stageDataIndex][i].Substring(5);
                }
            }
            else
            {
                // 名前を非表示にする
                NameDisplayArea.text = "";
            }
        }
        else if (stageData[stageDataIndex][i].Length > 1 && stageData[stageDataIndex][i].Substring(0, 2) == "--")
        {
            // 選択肢を表示する
            SelectButton[i - 1].gameObject.SetActive(true);
            SelectButton[i - 1].transform.FindChild("Text").GetComponent<Text>().text = stageData[stageDataIndex][i].Substring(5);
            DisplayArea.text += stageData[stageDataIndex][i].Substring(5) + "\n";
            Selected = true;
        }
        else if(stageData[stageDataIndex][i].Length > 1 && stageData[stageDataIndex][i].Substring(0, 2) == "ED")
        {
            // 最後まで行ったので,タイトルに戻る
            SceneChange("Title");
        }
        else
        {
            // 本文なので,文章表示領域に追記する。
            DisplayArea.text += stageData[stageDataIndex][i] + "\n";
        }
    }
    //Debug.Log("stageData" + stageData[stageDataIndex]);
    //Debug.Log("pattern" + stageData[stageDataIndex].Substring(0, 2));
}

コメントを書いたので,どういう雰囲気で表示しているかはつかめると思います。

stageDataIndexは,int型で,どのかたまりの文章を表示するかを決めています。
選択肢が出た後,その選択肢に飛ぶときも,stageDataIndexの値を変更して,飛ぶようにしています。

DisplayAreaは,文章を表示する部分になります。
publicで,変数を定義した上で,Unity上でuGUIのTextを作り,InspectorにD&Dで設定すればよいかと。

DrawBackGroundや,DrawCharacters関数は,必要に応じて作ればよいかと思います。

NameDisplayAreaは,ノベルゲーでよくある,しゃべってる人の名前部分ですね。
これも,uGUIのTextを事前に作っておき,InspectorにD&Dで設定すればよいかと。

SelectButtonについては,ちょっとややこしいですが・・・
1.uGUIのButtonを事前に作る
2.Scriptで,public Button[] SelectButton;を宣言する
3.D&Dで設定する
4.以下のサイトを見て,イベントを追加する。
hiyotama.hatenablog.com
5.Unity上でSelectButtonを,非アクティブにする。
こんな感じのことをすれば,大体実装できると思います。

あとは,ボタンを押したときの処理に,
 適切な位置まで,文章を飛ばす処理と
 ボタンを非アクティブにする処理を入れておけば出来そうです。

SceneChange関数は,最近Unityの仕様が変わったので,5.3からかな
昔の,Application.LoadLevel("Title")ではなく

using UnityEngine.SceneManagement;を書いたうえで
SceneManager.LoadScene("Title");を書きましょう。

あとは,とくに気になる部分もないかと思います。

もしあったら,メールくれるとうれしいです。
コメントは,正直気付かないorz
Mail: sana.inquiry[at]gmail.com

ではでは

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

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

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

初心者がコミケにゲームを出展する時に必要な3つの秘訣!

あけましておめでとうございます!
サークルSaNaの代表 Nagisaです!

今回C89にて,「クリスマスなんてくそくらえ!」を配布させていただきました!
現在,各DLサイトにて配布する準備を整えている所でございます。

遊んでくださった皆様方,このゲームを作るのにご支援頂いた方々,本当にありがとうございます。


さて今回は,備忘録もかねて,色々と情報を残せればいいなぁと
そして,これを見た,コミケにゲームを出したいな!」
って人がどうすればよいかの指標になれば,とても良いですね。

題して,
初心者がコミケにゲームを出展する時に必要な3つの秘訣!

どん!どん!ぱふ!ぱふ~!


ということで,まずは私たちが「クリスマスなんてくそくらえ!」をどのようなスケジュールで作ってきたかをご紹介いたします。
2014年1月 製作開始
2014年2月 第1弾の仕様を作成し,素材収集を始め,ゲームの各シーンを仮プログラム作成
2014年3月 なんとな~く動くプログラムが大体できた。(プロトタイプ版みたいな感じ)
2014年4月 互いにあんまり仕事をしなくなる
2014年8月 クリスマスなんてくそくらえ!動画をニコニコにて告知

【制作告知】クリスマスなんてくそくらえ!【オリジナルゲーム】 ‐ ニコニコ動画:GINZA

ここで出した告知のプログラムの8割は3月までに書いてあったと思います。
2014年8月 現状の仕様の根幹以外ほぼ破棄。画面サイズから練り直して(800x600→1280x720)製作開始。
2014年8月~ クオリティUPのため,素材制作依頼を色々なところへ出した。
       それに沿って,プログラムを( ..)φカキカキ
2014年10月  非常に優秀な方に作ってもらったので,10月くらいには素材が結構集まった。
2014年11月 冬コミ落選(この辺りから,約1年間 大きな進捗はありません)
2015年11月 冬コミ当選
2015年12月22日~27日 旧版のプログラムを大改造。30程度のクラス数で大量に書いていたコードを75程度にまで分散拡張+ステージを15個ほど作成
2015年12月28日 東京入りして,ステージクリエイト機能の実装をほぼ完了
2015年12月29日~30日 メインゲームの仕様を作りながら確定,気になる所を端から端まで製作。時間の都合で,セキュリティ系は無視。
2015年12月31日 早朝にインストールバッチファイルの作成+焼く作業 そして完成


まぁ,作業の偏り具合が凄まじいですね。
1日10分づつプログラムしていたら,2015年夏くらいには終わってるかとは思うんですが
まぁ,夏休みの宿題は最終日にやる人なので,しょうがないです。

ということで,3つの秘訣,まず1つ目!
「仕事をためると,ろくなことにならないので,週に1回必ずゲーム作ールの日!を設け,必ず実行しましょう!」
まぁ,出来る出来ないは置いといて,やったら,炎上はだいぶ回避できます^^;

次は・・・・3つの秘訣,2つ目!
「どういう作業を実行すると,コミケにゲームが出せるのかを知っておきましょう!」
これは知らないと,後々次々に作業が発生するので,
(ある作業を行うと,ぁ,これも必要じゃん!」)となるやつです^^;
できる限り,早目に知っておきたいですねっ。

ちなみに,「クリスマスなんてくそくらえ!」では,以下のような作業が発生しました。
主な内容は,<ゲームを作るわけですから,その作品自体にかかる作業そして,コミケに出展するのですから,例えば出展希望用紙の提出や,出店時に必要な用具をそろえる等のコミケ出展に掛かる作業最後に<出来る事なら,どういうゲームを出すのかを世の中に告知して,少しでも興味を持ってもらうようにするための告知作業が必要です。

<ゲーム作品自体>
・物理品(ケース+CDの購入,ケースに付けるパッケージのデザインと印刷)
 ※以下を事前に用意できた場合は,プレス(業者に頼む)することが出来ます。
・プログラム
・素材収集+素材作成依頼(素材には,絵だけでなく,マップ<ステージ>情報,音楽,等が必要です)
・Readme(著作者情報や,免責事項など 売りに出す以上,念のため書いておかなければならないことがあります)
・説明書(無料配布ならばともかく,遊び方を説明する情報は欲しいですね)

@物理品 約6千円(50枚 印刷費込)
@素材製作費で約2万5千円

コミケ関連> 事前申請~参加までについては,コミケから情報が沢山出ているので,サークル参加するには?を読んでください。
・サークル参加申し込み(冬だと8月中旬,夏だと2月くらい?)
サークルカットの提出,コミケから送られてくる注意事項の読破
コミケで販売するための物理的な準備
 1.お釣りの準備
 2.敷物の準備
 3.展示用のブックスタンドやタブレットスタンド
 4.ゲームを魅せるなら,タブレットやノートPC
 5.ポスターと,ポスタースタンド
  matome.naver.jp

@参加申し込み用紙 約1000円
@おつり 約5000円分
@敷物 約2000円
@ブックスタンド 約500円
@ポスター 約150円
@ポスタースタンド 約2500円

<広報>
・ゲームデモの作成
・PVの作成
ニコニコ動画youtubeへのUP
・ゲーム用サイトの構築

等が必要になるかと思います。
もちろん,全てを行う必要はありませんが,出来るだけ多くのことが出来ている所は・・・・すごいので・・・・

・何が必要かは,例えばコミケに参加して,綺麗に準備しているところや,目指したいところのサークルさんに
 「サークル出展を目指していまして,参考にしたいので,撮影させていただいてもよろしいでしょうか?」
 といった形で,尋ねてから撮影させてもらい,それを参考にするとか

・サイトを構築しているところのを,色々と見回って
 どういう物を準備しているか?どういうことを行っているのかを確認して参考にするとか

参考にすべきサークルさんは,死ぬほどありますので。。参考にして,色々準備していけば良いかと思います。


最後に,3つの秘訣,3つ目!
「諦めたらそこで試合終了!」

ゲーム作りって,本当に,本当に大変です。

まず,ゲーム作ろうぜ!ってなったとしたら,いろいろ調べて作り始めますよね。
でも,まぁ いろいろな壁が出てきて,挫折しちゃう人は多いです。
(作る技術力が身についていない人の大半は,まぁこうなります。)

技術力はある人は,しばらく作り続けられるのですが,,,保って3カ月です。
この3カ月っていうのは,モチベーションがどんなに高い位置にあっても,
多くの人は3カ月すると大体モチベーションが下がってしまう。
実際,私は3カ月も経ったら,まずモチベーションは維持できていないですし
スケジュール感を見ても,確かにそうだね~ってなると思います。
(私の個人的な所感と実感です。)

つまり,ゲームを長期間にわたって,こつこつと作り続けられる人って
本当にごくわずかだと,私は考えています。

<じゃぁどうするの?>
>諦めなければいいと思います。
私は,3カ月でモチベーションが下がるなら,下がるままにしておいて
また上がった時に一気に作業します。
まぁ,放置すればするほど,上がりにくいので,きっかけは必要ですが・・・また,エンジンが掛かったら,意外と進みます。

<技術力ないと,一気に仕上げるなんて無理>
>モチベある時に,技術力をつけてください。
プログラムって,難しいのは事実ですが,文法を覚えるだけなら,小学生でもできますし「将棋とかで数手先を読む」ことが出来る人なら,ゲーム作りだってできます。
いかに,ゲーム的なプログラムを組めるようになるか までが勝負です。

ゲーム作りって,本当に本当に大変なんですが
諦めなければ,意外と何とかなります。
5年先の完成?いいじゃんw10年先?それでも,やりたくてやるなら,いいじゃんw
私はそう思うので,5年かかっても10年かかっても,
まぁ,ゲーム作りは楽しいところもあるし,長い目で見てやろう。
それでいいと思います。

ということで,,
「仕事をためると,ろくなことにならないので,週に1回必ずゲーム作ールの日!を設け,必ず実行しましょう!」
「どういう作業を実行すると,コミケにゲームが出せるのかを知っておきましょう!」
「諦めたらそこで試合終了!」

この3つを忘れずに,ちょいちょい,プログラムにちょっかいを出していけば
いつか,夢が叶うんじゃないでしょうか。



ここから本当の備忘録 箇条書きで,今回忘れてた仕事内容を書き溜めます。
<音>
・音の出力が可能かどうか,一旦試しておくこと。
・BGMやSE等を取得したとき,音量を合わせること。
インストーラー>
・余裕のある時に使ってみて,使い方などメモっておくこと。
・1枚焼くのに約3分半掛かるので,気を付けよう。

備忘録は・・・思い出したら,また続きを書きます

     

C89「クリスマスなんてくそくらえ!」アクションゲーム!

こんにちは!
サークルSaNaの渚です!

三日坊主って,ご存知ですか?
三日保ってねぇじゃん!という突っ込みは,受け入れますが,馬耳東風です。


さてさて。。
昨日は,集中力を高めるために,あえて早めに寝る作戦を取りました!

そして,今起きました!(こけコッコー

渚>いや~ゆっくり寝たわー

そら>・・・同罪だから何も言えん。

ということで,現在の進捗状況です。

題して,女性警官を探せ!
f:id:nagisa39:20151230095329p:plain (※注意※実際のゲーム内容とは著しく異なりますのでご注意ください)
いやー流石に結構進みましたねっ!開発進捗は89%ですっ!
f:id:nagisa39:20151230095622p:plain
このゲームの特徴は,自分で作ったステージを遊ぶ事が出来るところです!
その為に,結構本格的なステージ制作ツールを入れましたっ!
マップチップの一斉貼り付け,コピペ,レイヤー切替,便利機能多彩です!

開発秘話が聞きたい人は,明日「東のヤ57a」までお越しください!
6時間位お話しますよ~!

ではでは,明日会えることを楽しみにしております!

追伸:
これから,残りの11%を開発して,デバッグして,焼いて・・・
ぁれ,おかしいな・・・
頑張ってきま~す!

C89 同人ゲーム制作デスマ突入した様子

おはようございます、こんにちは、こんばんは
年の瀬ですね。soraです。

今日からC89がついに開催ですね!
わたしもtwitterからひそひそと見守っています。

さて、わたしたちも明後日31日に制作中のオリジナルゲーム頒布のため会場に向かう予定なのですが、ただいまメンバーで「間に合わねええええええええ!!!」とか言いながら、泊り込みで追い込み作業をしています。これが噂の同人ゲームデスマモード。 f:id:moshisora:20151229105154j:plain

制作物のほうはというと… f:id:moshisora:20151229110348p:plain

という具合でまだまだデバッグ感満載でござます。
開発環境がWindows&VisualStudio&DirectXということもあって、Macユーザな自分ほぼ全くプログラムの内容にタッチできていないので買い物したりご飯を作ったりの主婦業に徹していますが、プログラム書いてる人の独り言が日に日に増している気がします…。

これからディスク焼いたりパッケージ作ったり印刷したり会場の準備したりほげほげしたりうわあああああああという感じですが頑張ります。まだ40時間くらいはありますからね!!

C89「クリスマスなんてくそくらえ!」アクションゲーム!

こんにちは!
サークルSaNaの渚です!

睡眠時間が,がりがり削れてきました!

昨日寝たのは3時半!

ソラ>まだ余裕じゃん

渚>ひぃぃぃ


ということで,昨日頑張ったところは・・・ f:id:nagisa39:20151224000645p:plain f:id:nagisa39:20151224000650p:plain
ソラ>あれ?一緒じゃない?

渚>一緒です。はい。

ソラ>ぇっ,進んでないの?

渚>違うんです。これは,プログラマなら,誰もが経験するところの・・・・

内部のみ大改造

書いてたコードが,スパゲッティ(意味:とにかく酷い)だったので,(マジだれが書いたんだよ。こんなコード。)
それを,がんばってクラス分けしてたんです。

ちなみに,MainGameは完了しましたが,StageCreateはまだ直りきってません!

今日は,続きを頑張ります!

サークルSaNaの渚でした~

C89「クリスマスなんてくそくらえ!」アクションゲーム!

こんにちは!
サークルSaNaの渚です!

そしておやすみなさい!

ソラ>こらこらこら

渚>ぇ,だめですか?

ソラ>その前に進捗報告!

渚>ぁぃ


ということで,昨日頑張った分を報告します。
現在の進捗率は,66%!
 おぉ~6%UPです。(当社比)

具体的には,こんな感じ! f:id:nagisa39:20151224000645p:plain f:id:nagisa39:20151224000650p:plain MAPを表示したバージョンと,MAP+あたり判定を表示したバージョンです。


思ったより進んでるように,見えるかもしれませんが・・・
実は,ゲーム性に関するプログラムには,まだ一切手を付けられていない状態なんです。

プレイヤーが,
 どんな風に,このゲーム世界を走り回るのか?
  どんな風に,カップルを駆逐していくのか?
   どんな風に,殉職していくのか?

全て闇に包まれたまま
 私はフェードアウとぉぉぉぉぉぉ!!!

ソラ>まて

捕まりましたorz

渚>今日も頑張ります。

サークルSaNaの渚でした~