【ウディタ】主人公の動作指定が止まる/実行されない原因を探る
例えばこのようなマップを作り、「マップイベントの上で決定キーを押すと主人公が向こう側の赤いタイルまで前進する」という処理を組むとします。
主人公が↓に5歩進む、何の変哲もない処理です。
ゲームを起動し、決定キーを押してみましょう。
押しました。
なぜか一歩しか進んでくれません。
変ですね、動作指定で主人公が5歩動くよう指定したのになぜ動いてくれないのでしょう。
実はこれ、決してこの処理が間違っているというわけではありません。通常であれば主人公は指定通りに移動してくれます。
しかしこの処理を実行すると同時に動作指定を含む並列実行イベントが起動していると、このような挙動になってしまうのです。
今回はこのバグの解決策を載せておきます。
同じようなバグに悩んでいる方の役に立つかもしれません。多分。
ちなみにこのように組むと一応正しく動いてくれます。
私も昔悩んだときにこのような処理を組んだことがありますが、条件によっては新たなバグを生む原因となるのでやめておいたほうがいいです。詳しくは記事の終盤で。
確認していただきたいこと
主人公の動作指定がおかしくなる場合は、以下のようなイベントがないかをご確認ください。
『並列実行』または『並列実行(常時)』で動くコモンイベントまたはマップイベント内で、『主人公の動作指定』を含むもの
※主人公ではなく特定のマップイベントID(マップに設置したキャラ)の挙動がおかしくなる場合は、そのキャラクターの動作指定が並列実行イベント内に組み込まれていないかご確認ください。
動作指定は『移動速度の変更』『向き固定』『すり抜け』など、とにかく動作指定で命令しているモノ全てを含みます。
特に、『特定のキーを押している間、主人公の挙動が変わる』系のコモンは確認しておいたほうがいいかもしれません。並列実行で動作指定が組み込まれていることが多いです。
ここからは、上記で挙げたようなイベントが組まれているという前提で原因と解決策を話します。また、並列実行で動いているイベントのことを『並列イベント』と呼ばせていただきます。
原因
何らかの並列イベントで主人公の動作指定をしているとします。
その状態で、起動条件を満たした通常イベント(自動実行や決定キーで起動するイベントなど)が起動し、通常イベント内の動作処理が実行されたとします。
すると、どうなるか。
並列イベントと通常イベント(自動実行や決定キーで起動するイベントなど)の、2つのイベントで指定された動作指定が同時に実行されるという現象が起こります。
それで互いの動作指定が干渉し合ってしまい、うまく処理されなくなってしまうのです。
解決方法
動作指定を正しく動かすためには、イベント同士の干渉を防ぐのが不可欠です。
そのためには、並列イベントを一時的でいいので止める必要があります。通常イベントをなくすわけにはいきませんからね。
具体的には、並列イベントをこちら側が制御(起動と停止)できるようにすればよいのです。
必要なときだけ並列イベントを起動してそれ以外の時は停止するか、
主人公を強制的に動かしたいとき(自動実行のイベントなど)だけ並列イベントを止め、終わったら解除する、といった処理が必要になります。
これらの処理は、変数や条件分岐を使えば作れそうです。
一番簡単なのは変数で起動条件を管理することだと思います。
とまあ、並列イベントで動作指定しているだけの処理ならこれだけで問題ありませんが
キー入力など、プレイヤーの何らかの操作で主人公の挙動を変えられる並列イベントの場合、この方法だけではうまくいきません。(並列処理で動作指定を組んでいる方のほとんどが、このような処理をされているのではないでしょうか)
例えば『Shiftを押している間は主人公の向きが固定される』という並列イベントが起動している状態で、Shiftを押しながら通常イベントに突入した場合……向き固定がONのままになります。
向き固定を解除する処理が行われないまま、並列イベントが停止してしまうからです。
その状態ですと、イベント中ずーっと主人公が同じ方向を向いてしまいます。
イケメン主人公がカニ歩きする、みたいなレアな演出が見られてしまうかもしれません。
決められた演出がプレイヤーの操作によって変わってしまうのはかなり致命的です。
これを防ぐには、主人公の動作指定を含む通常イベントの先頭で向き固定をOFFにすればよいのです。
ちなみにこの一連の処理はコモン化すると楽です。イベントの度に動作指定を組む必要がなくなりますし、処理の意味が分かりやすくなるのでおすすめです。というか、ひな型となるコモンを作りました。
コモンを作りました。
解決方法まで読んでも、私の下手な説明ではわけわかんないという人が多いと思います。また、コモンイベント制作に慣れていない方も多いと思います。
そんな方のために、このバグを回避できるコモンを作ってみました。早い話、詳しいことがわからなくてもバグさえ出なければ問題ないのではないでしょうか。
どのような処理にするか迷いましたが、最も需要が高いであろう『ダッシュコモン』を作らせていただきました。Shiftキーを押しながら十字キーを押せば、主人公を走らせることができます。Shiftを離せば元の速度に戻ります。
ダッシュコモンとして公開しますが、速度変更の部分を向き固定やすり抜けなどのお好きな処理に変更していただいても構いません。要はこのコモンをひな型として、お好きに改造していただければと思います。
動作指定を含むイベント内で、ダッシュを有効/無効化する必要があるので手間はかかりますが……。通常変数・予備変数を使いませんので、お気軽に使ってみてください。
おまけ:動作指定NGパターン
記事の冒頭で挙げた、並列処理を止めないでこのように動作指定を組む方法。このように書けば確かに動いてはくれますが、バグの温床となりやすいのでお気をつけください。
この書き方でバグが起こるのは、記事内で何度も登場している『特定のキーを押している間、主人公の挙動が変わる』系のコモンが起動しているときです。
例えば↓のコモンを常時並列で動かしている場合。
常時並列なので、Shift(サブキー)を押せば常に主人公の移動速度を変えることができます。
常時並列、ということは
イベント中であっても、プレイヤーの操作で主人公の速度を変更できてしまいます。
このコモンの場合ですと、演出内で主人公が移動すると同時にプレイヤーがShiftを押せば、主人公が高速移動することになります。
勇者である主人公が足にケガを負いながらも、姫を助けるためにゆっくりゆっくり魔王城の階段を登るシーン……でプレイヤーがShiftを押してしまったらどうでしょう。
この方法で一時しのぎするのはやめておいた方が無難です。
ディスカッション
コメント一覧
まだ、コメントがありません