ゾンビとUnity

ゾンビネタとUnityでのゲーム制作について綴るブログです。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Unity ゲーム製作 17 GUIデザイン設定ファイルのパーサ

a0002_011730_m.jpg 写真提供

ここしばらく階段上りにハマっていて、通勤途中にある階段を上る(エスカレーターやエレベーターは使わない)という習慣というか癖が、うっかりしたことに4年くらい続いちゃっている。
階段があったら上るのが普通になっちゃってるから、今までは意識してこなかったんだけど、ついぞ最近

「一日で何段上ってるんだろう?」

と、急に気になってしまった。
で、上っている階段の段数を数えようとしているんだけど、すぐ忘れる!

まず、数えるのを忘れる。
さらには、数えた段数をすぐ忘れる。

通勤中ずっと階段を上っているわけではないので、当然、途切れ途切れに階段様が出没するわけですが…

しばらく電車に乗って、「今作ってるゲームのアソコどうしようかなぁ」なんて考えていると、うつらうつらとしちゃう。
そんな感じでまどろんでいると、降車駅に到着。
電車を降りて、改札を抜けて、さぁ階段だ!

という頃には、段数かぞえてる事を忘れちゃってるんだ…。
たまに思い出すんだけど、階段を上ってる途中で思い出しちゃうと、さすがに数え直す気にはならなかったりで、なかなかきちんと数えられない。

「忘れるんだったらメモしとけ!」って話ですよねぇ、まあーそんなことは絶対しないです。

え?

だってめんどくさいじゃん



さて、インベントリのプロトタイプよりも先にGUIデータのパーサができた。

パーサはプログラムやデータの解析を行うプログラムのことで、パース(parse)は構文解析するという意味(デザイナーが良く言うパースはパースペクティブの略で、全く意味が違う)。

パースは、何らかのデータが書かれたファイルを解析して、プログラムで扱えるようにすること。
それを行うプログラム・スクリプト・アセット・ソフト・アプリなんかをパーサと言う。

エクセルに書いたデータを Unity の ScriptableObject に変換するアセットなんて、まさにパーサそのもの。

Excelでデータを管理してUnity iOS/Androidで使うワークフローをノーコーディングで使えるようにした - テラシュールブログ
http://tsubakit1.hateblo.jp/entry/20131010/1381411760




GUIデータはこういう感じのフォーマットにします。

※1

//こめんとこめんとこめんと

TestWindow { //こめんとぅーだよー
width=Screen :90%,
height
=
Screen:40%
,
TitleBar{ width=Parent:90%,height=Screen:10%,text=TestWindow, type=TitleBar },
CloseButton
{
width = Screen : 10%,
height = Screen : 10%,
help = Close,
type = Button,
}

}


基本はこういう構造。

ウィンドウ識別名 { パーツデータ }

パーツデータは省略可能。
最小のデータは、

ウィンドウ識別名{ }

となる。
なので、最低でも、↑の記述がないとパースに失敗する。
しかし、これだと何もデータを記述していないので、何も表示されないウィンドウになる(メモリにはロードする)。


ウィンドウ識別名はアルファベットから始まる半角英数字と _ (アンダーバー)の組み合わせ。
アルファベットの大文字と小文字は区別されない(abcとABCは同じものとみなされる)。
ウィンドウ識別名の途中にスペースや改行を入れることはできない。
スペースや改行、もしくは { の前までをウィンドウ識別名と認識する。

ウィンドウ識別名 {
}

と書いたり

ウィンドウ識別名
{
}

と書いたり

ウィンドウ識別名
{ }

と書くことができる。


パーツデータには、以下の記述ができる。

タイプA
データ名 = 値

もしくは

タイプB
パーツ識別名 { パーツデータ }

それぞれ、複数記述できる。
複数記述する場合は , (カンマ)で区切る。
ただし、以下の順番で記述する場合はカンマで区切る必要はない。

タイプBタイプB
タイプBタイプA

例)
Hoge { } Moge { }
Hoge { } moge = 1

カンマで区切らなければならない順番。

タイプA,タイプA
タイプA,タイプB

例)
hoge = 0, moge = 1
hoge = 0, Moge { }

データ名とパーツ識別名は、ウィンドウ識別名と同じルールで記述する。

値は、データ名 = の後のスペースまたは改行以外の文字から、カンマまたは } の直前までが値と認識される。
ゆえに、その間にスペースや改行があっても値の一部と認識される。
すなわち、hoge = 0, と hoge = 0 , の値は異なる。前者は 0 で、後者は 0(スペース) という値になる。

一行コメントの開始文字は ; か # か ' か // か -- のいずれか。
これらの文字から行末までを一行コメントとみなす。
ただし、値の中にそれらの文字が含まれていても、一行コメントにはならないので注意。

以下はコメントが認識される。

hoge = //一行コメント
0,

以下はコメントが認識されない

hoge = 0//一行コメント,

値の後ろに一行コメントを入れたい場合は、先にカンマを入れる。

hoge = 0,//一行コメント

行末までがコメントと認識されるため、以下はエラーになる。

hoge //一行コメント = 0,

//一行コメント = 0, までがコメントと認識されてしまう。
この位置にコメントを入れたい場合は以下の記述が必要。

hoge //一行コメント
= 0,



データ見ればすぐに分かるのに、言葉で説明すると長くなるなぁ…。
パーサのプログラムは以下。

String.cs
UI.cs

※ソースコードの著作権は放棄しませんが、自由にお使い下さい。

このソースコードをコンパイルするのに Unity は必要ないので、以下のようなテスト用のコードを書けば、C#コンパイラでコンパイルして動作チェックできます(VC#でコマンドラインプロジェクトを作ってビルドしてもいい)。

class test {
static void Main() {
Dead.UI.Reader r = new Dead.UI.Reader("test.txt");
Dead.UI.Data d = r.Data;
if (d != null) d.Dump();
else {
int err, row, col;
r.GetLastError(out err, out col, out row);
System.Console.WriteLine("Error Code={0} Row={1} Col={2}", err, row, col);
}
}
}

ui_reader_output.png
上記のソースコードをC#コンパイラでコンパイルして、この記事の※1を test.txt という名前でファイルに保存し、コンパイルしたプログラムに読み込ませて解析した結果を表示した画面。

解析部分は正規表現を使ってやってみたかったんですが、どうにもうまく行かなかったので、結局一文字ずつ読んで解析する処理になってます。
データ解析が終わると、Dead.UI.Data クラスに変換されるので、そのクラスのプロパティを参照しながら画面にウィンドウやらボタンやらを表示する処理を Unity で作る形になります。
ゲームの仕様ができないことには、GUIの細かいデザインが決められないので、現状はここまで。
 
むー…こんなことしてると、アセット作る人になってしまいそう…。
 
スポンサーサイト

- 0 Comments

Add your comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。