【ウディタ講座】文字列変数を複数の変数として扱う方法

ウディタで凝った処理が作れるようになってくると、悩みの種類も変わってきます。
「コモンイベントへの入力が4つじゃ足りない」
「別のセーブデータからの変数読み込みに時間がかかりすぎる」
実はこれ、文字列変数で解決できちゃいます。
変数に文字列変数を代入することができ、文字列変数を数値変数と扱う小技があるのです。メジャーなテクニックではあるのですが、このブログでも丁寧に図説してみましょう。
SRPGを作るのにも必須のメソッドです。

まずは「ウディタの文字列変数の性質」をチェック

・入力できる長さはほぼ無限
 といっても文字列変数の操作は比較的重い処理なので、ほどほどの文字数におさめましょう。

・呼び出し値を使うことで、数値変数へ代入できる
 数値でない場合やカラの文字列を代入した場合は、0が代入される。
 複数行の文字列変数の場合、先頭の行のみ代入される。
 「08」のような場合は「8」として扱われる。

つまり……

たとえば、こうして「代入内容を手動で指定し、変数呼び出し値(1600005)を使う」ことで、コモンセルフ10番(変数)に、コモンセルフ5番(文字列変数)を代入することが可能です。

以上を踏まえると、次のようなことができます。

本題:文字列変数を応用した複数変数の管理

こんな中身の文字列変数があるとします。
8
100
31
9999
改行情報があるので、ウディタのコマンド的にはこうなっています。
■文字列操作:CSelf5 = “8\n\n100\n\n31\n\n9999”
文字列としては4行あるひとつの文章ですが、変数としては「8」「100」「31」「9999」の4つ分の意味を持ってるわけですね。これを次のように、4つの変数へ分割できます。

代入できるのは文字列の1行目なので、代入のたび1行目を削って上詰め(代入済の行を消す)しているのですね。これで文字列変数ひとつで、複数の変数を記憶したり送ったりすることができました。

 

「コモンイベントへの入力が4つじゃ足りない」という問題ならば、これで解決。文字列変数ひとつ(cself5)を使えば、事実上、無限に近い変数を送ることが可能ですね。

ウディタには再起処理の機能がありませんが、疑似的に再起処理を行う際にもこのメソッドが重要になってきます。オープンソースのウディタ製SRPG『システリアの冒険』でも、SRPGのキモである移動範囲計算でこの手法が使われているのです。

こちらがその様子。

膨大な量のx,y座標を扱うことになるのですが、99個までのコモンセルフ変数では扱いきれないため、文字列変数に順次書き込み/読み込みをしているのですね。
詳しくは直接システリアをDL(サイト)してお確かめくださいませ。

「別のセーブデータからの変数読み込みに時間がかかりすぎる」問題

問題なのは読み込む変数の個数。別のセーブデータから変数ひとつ読み書きするだけでもセーブデータまるごと1個分の時間がかかるらしいのです。
変数を10個読み込もうとしたら、セーブ10回分の処理負荷がかかるんですね。重くて当然。なので、文字列変数ひとつに複数の変数の情報をまとめておけば、「別のデータから読み書きするのは文字列変数ひとつ」に留めることができ、処理負荷を軽減できるのです。
すべてのセーブデータで同期させたい情報(クリア状況やギャラリーモードのフラグ、コンフィグなど)がある場合に重宝する小技ですね。

ワンポイント

文字列変数ひとつで変数複数個分の働きができるとはいえ、コモンイベントは文字列変数を5つしか持っていません。そしてマップイベントは文字列変数ナシです。

文字列変数のやりくりは苦しいわけで、「変数リスト用」と「先頭行の切り出し用」に、都合2個の文字列変数をとられるのは結構きびしい。

そこで、こんなコモンイベントを作ってみましょう。

送られてきた文字列変数の先頭行を削るだけの処理です。
が、これを使うことでおおもとのコモンイベントのソースは視認性が上がり、文字列変数の節約になります。
視認性が大幅アップです。
しかし、別コモンの呼び出しはちょっと処理負荷を上げます。再帰処理に近いことをして、負荷が気になる場合は、あえてこのような「1行削るコモン」は使わない選択もありえるでしょう。