【ウディタ】イベント予約についてあれやこれや。”入力する値”と”名前呼び出し”実現
[予約]の仕様
元々僕は公式ページに記載されている通り、
現在のイベントの処理が全て終わった後、指定したイベントの処理を続けて実行します。
という風に理解していたのですが、これ、正確には
現在実行中の「並列処理」以外のイベントが終了したあとに、その呼び出したイベントが実行します。
だったんですよ。
YADOT-WOLF コモンイベントにわかりやすくまとめられている通り、並列実行の中で予約したイベントは予約設定した瞬間に実行されるんだそうです。
この仕様を理解していなかったために、非常に苦戦しました...
じゃあ並列実行中にイベント予約するのと、普通に呼び出すのは同じ事なのか?
違うらしい
なぜなら、そもそもこの予約機能は1回だけ自動実行する処理だから。
つまり、並列実行中のコモンEv内で処理するイベント予約(一回だけ自動実行)と通常のイベント挿入には以下のような違いがあるわけです。
自動実行 | 通常挿入 | |
並列実行中の処理 | そのまま処理が次の行に進む | このイベント処理が終わるまで進まない |
---|---|---|
主人公の行動 | 移動できず、メニュー画面も開けない | 通常通りに操作可能 |
例えば、以下のようなコモンEvがあったとして。
❶通常変数 V0:起動フラグ が1の間、並列実行するコモンEv[並列実行①]
❷通常変数 V0:起動フラグ が1の間、並列実行で「[並列実行②]実行中」と表示するだけのコモンEv[並列実行②]
❸並列実行中に挿入したいコモンEv
通常挿入の場合
処理順としては、
- 通常変数 V0:起動フラグ が1で、❶❷が並列実行中
- ❶内で❸を実行
- ❸処理中
- ❸の処理が終了(プレイヤーが決定キーを押す)
- ❶内で通常変数 V0:起動フラグ が0になる
- ❶❷の処理が終了
つまり、❸処理中にも❷の「[並列実行②]実行中」と表示される処理は続く
予約の場合
処理順としては、
- 通常変数 V0:起動フラグ が1で、❶❷が並列実行中
- ❶内で❸を実行(自動実行)
- ❶内で通常変数 V0:起動フラグ が0になる
- ❶❷が終了
- ❸処理中
- ❸の処理が終了(プレイヤーが決定キーを押す)
つまり、❸処理を進める頃には❷の「[並列実行②]実行中」と表示される処理は終了している
・並列実行でイベント予約する際は、実際に処理を実行したいタイミングにする
・この場合、呼び出した側の並列実行イベントの処理は実行したコモンEvの終了を待たず次の行に進む
「入力する値」が使えない対応
通常、イベントを挿入する際はそのコモンEvに設定された「入力する値」と「結果」を指定できますが、
イベント予約だとこの「入力する値」が使えないんですよね。
で、ショップ大改造の時に気付いたのですが、これ無理矢理に「入力する値」を指定できると思うんですよ。
かなり単純かつ力業なんですが、ただ二重に呼び出すだけっていう...
こんな手法どこで使うんだよって思われるかもしれないんだけど、何故か普通に使ってます...
偉い人に処理方法見直せって言われそう
予約の名前呼び出し
予約の場合、通常と違ってあの便利な名前呼び出し機能が使えないとの事。
が、これも無理矢理解決する方法があると思うんですよ。
1.引数(入力する値)に「モード」を用意
2.本来の処理の前に、コモンEvIDを返す処理を入れる
3.コモンEvを予約する前に、上記処理でコモンEvIDを取得してから変数呼び出し(EvID+500000)
はい。
一応捕捉で、なんで4行目でわざわざCSelf0[モード]を0(=実行モード)にしているか疑問に思う人もいるんじゃないかと思います。
試してみるとわかるんですが、コモンセルフ変数って保存されるんですよね。なので、予約で実行する際は引数を指定できないのでCSelf0[モード]が1のまま処理が始まってしまうんですよ。
そんなわけで、予約で実行する時のためにCSelf0[モード]は初期化してあるわけです。
まあこんな無理矢理な処理を入れるくらいなら、ユーザーDBでEvIDを管理する方が現実的。
基本システムでメニューにコマンドを追加する際も似たようなことやってますし。
www.silversecond.com
※2023/1/22 追記
ウディタVer3.0の新機能で、<< GET_COMMONEVENT_ID_FROM_NAME>>(コモンイベント名)でコモンEvの名前からコモンEvIDを取得できるようになったそうなので、上記の方法は必要なくなりました。