相麻ゆづきです!
今回は技術周りの雑記になります。
ウディタの細かい仕様をちょいちょい忘れるので、忘備録がてら覚えてる限りのことを書き出しておこうという記事。
内容的にはマニュアルに記載されてない細かい仕様の話がメイン。
ユーザーさん的には興味の薄いだろう話になりますが、息抜きの雑談記事ということでご了承くださいませ。
本記事はウディタVer2.24を基準に記述しています。
※追記:ウディタVer3.00以降で特に処理負荷周りは大きく変わっているため、以下の文は参考程度に見てください。
変数操作・文字列操作
呼出値による座標の変化
変数呼び出し値である
9100000+10*Y+X
9180000+X
9190000+X
に値を代入すると主人公やマップイベントが移動する。これによって変数操作だけでキャラを動かすことができる。(これ自体はマニュアルに記載されている)
ゲーム上での挙動は「動作指定」で動かす場合と変わらないが、内部的には異なっていて、以下のような違いがある。
動作指定:移動後に内部の座標が変化する
変数呼出:移動前に内部の座標が変化する
内部の座標とは、変数操作+で取得できる座標のこと。
『エルローグ』では、行動判定そのものは主人公とNPCで同時に行うけれど、NPCは主人公の移動後の座標に合わせて攻撃等をしかけてくるので、変数呼び出し値を用いて移動周りを実装している。
一覧表に記載のない呼出値
変数呼び出し値に関連してもうひとつ。
以下に記す変数呼び出し値は、マニュアルに記載されているが、変数呼び出し値の一覧表には記載されてないので忘れられやすい。
9100000+10*Y+X
X=5 影番号
X=6 方向
X=9 キャラチップ画像(文字列)
9180000+10*Y+X
Y=1~5 仲間
過去の更新履歴を見るに、後からアプデで追加された部分だから一覧表の方には記載されてないのかな?たぶん。
テキストの出力
文字列操作でテキストを出力する際、例文ではtxtファイルが指定されているが、ここで指定する拡張子に制限はない。
よって、iniファイルやhtmlファイルとして出力することもできる。オリジナルの拡張子を指定して入出力することもできる。
一応、拡張子にpngなどを指定することもできるが、破損したファイルになってしまうので流石に無理だった。(バイナリファイルの出力ができると悪意あるexeも作成できてしまいそうだから実装されることはなさそう)
UDB・SysDBへの書き込み
変数操作の「X番の変数呼出」
文字列操作の「代入先を変数で指定」
で代入先にユーザーDBやシステムDBを指定すると、変数/文字列を書き込むことができる。
マニュアルには記載されてないが、実は過去の更新履歴を遡ってみるとVer1.14あたりで隠し機能として実装されている。
なお、ここで書き換えた値はセーブデータには保存されないため、ゲームをロードすると元に戻る。
ピクチャ
ピクチャの処理負荷
ピクチャが表示される際は、画像をメモリに読み込む処理が入るので重い。ピクチャの移動や消去はこれと比べるとだいぶ軽い。また、エフェクトによるピクチャの処理はこれよりさらに軽い。
【処理負荷の大きさ】
ピクチャ表示 >ピクチャ移動・消去 > エフェクト
ピクチャとメモリ
既に同一の画像が表示されているときは、ピクチャ表示をしても新たにメモリに読み込まれることはない。
なので、ローディング処理として、あらかじめ使用する画像を不透明度0で表示しておくと高速でピクチャを表示できるようになる。
ただし、分割数の異なるピクチャは別の画像として扱われるので、ローディング処理を組むときはゲーム中に用いる分割数と同じ分割数で表示しておく必要がある。
(追記)Ver2.25で128MB以下の暗号化ファイルをメモリに読み込む機能がついたから、この範囲内で済むときはセルフローディング処理は作らなくて良さそう。
大量のピクチャの表示
ピクチャの移動等をしなくても、画面にピクチャが表示されているだけで若干の負荷がかかる。そのため、1000枚単位のピクチャを画面に表示しておくような状況だと体感できるレベルで重くなる。
これの対応策として、文字列ピクチャのアイコン機能を使う方法がある。
文章中にアイコンを表示するために使われることが多い機能だが、アイコンに限らずどんなピクチャでも表示でき、特殊文字で細かい位置を調整できるので、複数のピクチャを1枚のピクチャとしてまとめるような使い方ができる。
ただし、文字列ピクチャなので回転や自由変形は行えない。
例:
マップチップを取得してミニマップを描いたり、ゲーム中でドット絵を描いて『どうぶつの森』で言うマイデザインみたいなことをしたり、こういう縦×横の数だけの膨大なピクチャが必要なシステムをアイコン機能でまとめると、かなり軽くなる。
あんまり頻繁に更新されるピクチャだと、文字列操作でアイコンを加算する処理の方が重くなってくるので、この辺りは処理に応じてどっちが軽いかを検証した方がいいかもしれない。
ミニマップを複数のブロックに分けて、ブロックごとにアイコン機能を使ってまとめる、みたいなハイブリット型がたぶん一番軽くなる。
表示されないピクチャ
不透明度0と拡大率0のピクチャは、画面上で見えないだけじゃなく内部的にも最初から処理しようとしないので軽い。
よって、ローディング処理で大量のピクチャを不透明度0で表示しておく際に、それが原因で重くなることはそこまでは気にする必要はない。(もちろんメモリ消費については気にかけておく必要がある)
ピクチャへの命令の合成
ピクチャが移動している途中で、同じピクチャに対して新たな命令が実行されると最初の移動が中断される。
ただし、ピクチャへの命令が停止するのは次のフレームに移ってからなので、実は1フレーム分だけ複数の命令が同時に実行されている。
これを利用して、ディレイ等を用いてピクチャの移動を1フレーム単位で管理すると、ベクトル等の計算をしなくとも複数の相対移動を合成させたり、移動の途中でピクチャを回転させるような使い方ができる。
イージングコモンを組んでる途中で気づいた仕様だけど、わりと便利なのでUIを組むときによく利用してる。
通常のピクチャ移動よりは重くなるので数十枚のピクチャを個別に移動させるような状況には向かない。あと、ディレイはセーブされないから、セーブを跨いで動くようなアニメーションだと再描写する必要が出てくる。
セーブ・ロード
セーブファイル名の指定
セーブ番号のところに文字列変数を指定すると、番号ではなく指定したファイル名のセーブファイルを作成・読込することができる。
こんな感じで指定すると、SeveフォルダにSystem.savが作成される。
セーブされるもの
- 通常変数や文字列変数などの各種変数
- コモンセルフ変数
CTRL+Shift+F6等でコモンイベントの位置をズラしても、変数まで一緒にズレてはくれないのでバグの温床になる。アップデートできるように作る場合、リリース後はコモンイベントの入れ替えを避けるか、コモンイベント終了後にコモンセルフに値を保持しないように組む必要がある。
- 可変DB
- 表示中ピクチャ
- 再生中BGM
- マップチップ
チップ操作で書き換えたものも記録される。
- イベントの位置
イベントの一時消去も記録される。
ただし、一時消去したイベントの位置でイベントIDの取得を行うとセーブ前とロード後で結果が異なる。セーブ前は-1が返されるが、ロード後は消去されているイベントIDを読み込んでしまうので注意。(ウディタ本体のバグ?)
- トランジション
セーブ前に指定したトランジションがロード時のトランジションになる。
セーブされないもの
- システムDB/ユーザーDB
後からアップデートで変更されうるものはこっちのDBに入れておかないと大惨事になる。アイテムのデータ等はユーザーDBで管理して、アイテムの所持状況は可変DBで管理しておくような組み方が無難。
- ピクチャのディレイ
- 影グラフィック番号
変数呼び出し値で影グラフィック番号を書き換えてもそれはセーブされない。なお、キャラチップ画像の方は書き換えてもセーブされる。
- チップセット切り替え後のタグ番号
チップ処理でチップセットを切り替えた後、セーブしてロードすると表面上は切り替え後のチップが描写されているが、タグ番号のみ切り替え前のチップの値に戻っている。
- 実行中のイベント
イベントの途中でセーブしてもそれは保持されない。
2020/11/18 追記
分割したピクチャのセーブに関してのバグを確認。
発生条件:
分割ピクチャを「左上」「中心」以外を起点に表示してセーブし、ロードしたデータでそのピクチャを移動させようとする。(実際に移動するかどうかは関係なく、相対移動0でも発生する)
バグ内容:
ピクチャが「分割しなかった場合の左上地点」まで引き伸ばされる。
その後、移動時に指定した処理時間に合わせて元のサイズに縮小していく。
※0フレームで移動させる場合は、即座に拡大して縮小するので外見上はこのバグは発生しない。
※起点を「中心」にしている場合は、引き伸ばしは発生しないが左上地点にピクチャがワープしてしまう現象が発生する。
コモンイベント
コモンイベント名を文字列変数で指定
コモンイベント名でコモンイベントを呼び出すとき、文字列変数でコモンイベント名を指定することができる。(この前WOLFさんが呟いていたやつ)
ただし、\s[X]で指定する文字列変数だとうまく機能しない。コモンセルフ変数の文字列で指定した場合にのみ反応する。(たぶん)
『エルローグ』では、自動生成されるユニットとのイベントシーンを呼び出すとき、ユーザーDBに登録されたユニットのデータからコモンイベント名を読み込んでそれを呼び出しているので、わりと頻繁に使ってる。
ショートカット
Shiftを押しながら「次チェックPへジャンプ」をクリックすると、通常とは逆方向に向かってジャンプする。つまりコマンド検索と同じ挙動。(過去の更新履歴のとこに書いてあったけど、たぶんマニュアルの方には記載されていない)
その他
回数付きループ
0回ループの中に入っている処理はスキップされる。一時的に外しておきたい処理を入れるときなどに使う。
1回ループの中に入っている処理は1回のみ実行される。ループの途中で「ループ中断」を行うと、以降の行は実行されずループの外に出るため、複雑な条件分岐を入れ子にせず書きたいときに使うと便利。
こんなイメージ。画像の例は適当
コマンド文の処理負荷
コマンド文や0回ループのようなゲーム上ではスキップされる処理も、内部的には若干の負荷が掛かっている。
検証してみた感じだと、普通の変数操作の半分くらいの負荷は掛かってるかな?(いまいち検証方法に自信がない)
大した負荷ではないので大抵はそこまで気にする必要はないけど、例えば数百回ループさせるような処理の中で気軽にコメント文を入れてると体感できるレベルで影響が出ることがある。塵も積もれば山。
名前と処理負荷
ピクチャのファイル名は短い方が処理が軽い。
また、ラベル名は短い方が処理が軽い。
ファイルをフォルダ分けして呼び出す
エディタで選択するとDateフォルダ直下のフォルダからしかファイルを選べないが
Data/Picture/CG1/001.png
のように直接ファイル位置を入力すると、複数階層下のファイルでも呼び出せる。大量のCGや差分が必要になるゲームだと、CGごとにフォルダを分けたりできるようになるので管理が楽になる。
キャラチップ
ファイル名の最後に$をつけると、分割されずにそのまま表示される。
Game.ini
Game.iniにはコンフィグの値が記録されている。コンフィグを弄ればいい話なのでほとんどの値は触る必要はないけど、一応コンフィグに無い設定値もある。
ScreenShotFlag=0
にするとスクリーンショット機能がオフになる。
F12_Reset=0
にするとF12リセット機能がオフになる。
マニュアルにあるけどよく忘れるやつ
イベントの実行順序
マップイベント(自動&並列起動、両者混合でとにかくID順に実行)
→コモンイベント(自動起動のみのID順)
→コモンイベント(並列起動のみのID順)
マニュアルにちゃんとは記載されていなくて、「システム変数 108番:現フレームのコマンド処理数」 のとこにさらっと書いてある。
自作システムが複雑になってくるとこのあたりも厳密に管理しないとバグの温床になることがあるので気をつけてるところ。
文字列を数値として代入
変数操作で、右辺に文字列変数を指定すると、その文字列を数値に変換して代入できる。
引数が足りなくて文字列変数のとこに数値を入力してるときとかによく使う。
コモンイベントの入力値の保持
コモンイベントの選択で、Ctrlキーを押しながらプルダウンメニューを選ぶと、入力値を維持したままコモンイベントだけ変更できる。
おわり
ここまで記事を書いといて何だけど、ウチのサークルのCi-en自体がR18だから仮に未成年の人が検索でこの記事に辿り着いても開けないな?
とふと思った。
まあこんな場末の記事に辿り着くこともないと思うけど……。
息抜きがてらの忘備録でしかないので、そのときはごめんなさいということで!