開発日誌

テクニック

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] [ ツクール情報 ] 敵の蘇生対象がランダムにならない不具合修正

2022-01-19 01:47:24

敵が蘇生スキルを使ってくる際に、死亡者が複数いたとしても、ランダムではなく必ず先頭の死亡者が対象になってしまうという、RPGツクールMZのコアスクリプトの不具合を修正します。

RPGツクールMVにも同様の不具合があるのですが、ターゲット選択部分のコアスクリプトの構造が微妙に異なるため、今回はMZ専用プラグインとなります。MVへの移植も容易なのですが、検証作業がめんd

以前にも「正しい蘇生術」で、RPGツクールVXに同様のプリセットスクリプトの不具合があることを解明し、修正スクリプトも公開していました。

当時の不具合は、Game_BattleActionのdecide_random_targetメソッドにおいて、対象が味方単体(for_friend?)ならば(生存中の)味方からターゲットをランダムに決定、対象が戦闘不能の味方単体(for_dead_friend?)ならば戦闘不能の味方からランダムに決定、としているつもりが、for_friend?にはfor_dead_friend?の場合も含まれるので、この判定順序では対象を戦闘不能の味方にしていても通常の味方単体で選ばれてしまう、というものでした。

実はMZが出た時に、この不具合がどうなっているのか、コアスクリプトを調べてみたことがあります。

対応するGame_ActionのdecideRandomTargetメソッドを見ると、ちゃんと戦闘不能の味方(isForDeadFriend)を先に判別しており、さすがに不具合は解消されているものだと思っていました。

ところが最近になって、蘇生魔法を使用する敵を作って戦闘テストをしていたところ、何度試しても先頭の死亡者ばかり蘇生してきます。

そこで改めてコアスクリプトを検証してみたところ、Game_ActionのdecideRandomTargetは敵の通常行動時に呼ばれるものではなく、敵がターゲットを決めるメソッドはmakeTargetsであることが判明しました。そしてここから呼ばれているtargetsForDeadを見ると、敵が蘇生スキルを使用するという前提がないせいか、先頭の死亡者が選ばれるような構造になっていました。

本プラグインはそれを修正して、敵が蘇生スキルを使ってくる際に対象者をランダムに選ぶようにしたものです。

質問やアドバイスなどはコメント欄まで、お気軽にお願いします。素材利用条件などについては、このサイトについての「提供素材について」の項目などをご覧ください。

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 能力値&敵キャラの調整Excelツール更新

2022-01-06 21:12:18

RPGツクールMV/MZ用に公開していた「エクセルで能力値かんたん調整」と「エクセルで敵キャラかんたん設定」の2つのExcelツールに不具合があったので、修正版をアップしました。

※ 2023-04-03追記
名前やメモ欄に"があると正常に出力できない不具合を修正しました

各ツールの使い方については、それぞれの記事を参照してください。

今回修正したのは、各職業や敵キャラのメモ欄等に\で始まる制御文字を使用していると、出力されたjsonファイルが読み込めなくなるという不具合です。jsonファイルの中では\が特殊な意味を持つので、\自体を出力するためには \\ としないといけないのを、そのまま \ と出力してしまったため、読み込みエラーが起きていました。エラー報告をいただき、ありがとうございました。

制御文字を使っていない場合は特に関係ありませんが、何かの拍子に制御文字が入らないとも限らないので、念のためアップデートをお願いいたします。

なお、64bit版のExcelをお使いの場合は、そのままでは動作しませんので、
https://tablacus.github.io/scriptcontrol.html
から、64bit版で動作するScriptControlである「Tablacus Script Control 64」をダウンロード&インストールしてください。

これはtwitterツクールフォーラムでしか言及していなかったと思うので、改めてエクセルツール上にも記載しました。

もしこれらのツールを使って、うまく動作しないだとか、jsonファイルが読み込めなくなったといったことがありましたら、お気軽にご相談ください。場合によってはファイルの復旧が不可能なこともありますが、その時はご容赦ください。

[ テクニック ] 不可視シンボルエンカウント・再

2021-12-13 00:02:36

本記事は「ツクールフォーラムアドベントカレンダー Advent Calendar 2021」12月13日分の投稿記事です。

シンボルエンカウントだけど、普段は敵シンボルは見えない――採用しているゲームも少なく定まった呼び名もないようなので、「不可視シンボルエンカウント」と名付けています。

この「不可視シンボルエンカウント」は前作『天下御免!からくり屋敷』で採用し、その時も記事にしていますが、制作中の新作でも採用しているため、改めてここで解説します。

代表的な採用ゲームは大昔の『英雄伝説I』で、それを参考にしています。年がバレそう……。

ランダムエンカウントとシンボルエンカウント

RPGにおけるエンカウント方式には大きく分けて、ランダムエンカウントとシンボルエンカウントの2種類があります。

ランダムエンカウントは、歩いているうちにランダムでエンカウントが発生する方式です。

▲RPGツクールVX時代のランダムエンカウント設定

長所としては、だいたいのエンカウント回数を決められるので想定到達レベルを設定しやすい、ほどよく緊張感を持たせられるなどが挙げられます。RPGツクールシリーズのデフォルトもこのランダムエンカウントで、何よりも作りやすいのが一番の長所です。

一方で、探索中にばんばんエンカウントするのが邪魔だったり、運が悪いと1歩進んだだけでエンカウントしたり、また緊張感がある反面、目的地まであと少しのところでエンカウントした時の鬱陶しさなどが短所として挙げられ、近年はランダムエンカウントは好まれない傾向にあります。

対するシンボルエンカウントは、敵のシンボルがあらかじめ見えており、シンボルと接触することで戦闘が始まる方式です。

長所としては、何よりも戦闘するかしないかを自由に決められる点です。しかしそれは同時に短所にもなり得ます。戦闘を全て避けて進むこともできてしまうため、緊張感がなくなります。戦闘を避けることによって成長も遅れるため、想定到達レベルの設定が困難になります。

敵シンボルを多く配置したり狭くて避けにくい通路に配置したりすることで、ある程度の戦闘を強制させることはできますが、それをするとシンボルエンカウントの長所を潰してしまいます。敵シンボルに囲まれて連続戦闘を強いられたり、敵シンボルが通り過ぎるのを待たされてイライラしたり、といった短所も存在します。

不可視シンボルエンカウント

そんな両者のエンカウント方式の折衷案として、「不可視シンボルエンカウント」はいかがでしょう。

前作『天下御免!からくり屋敷』で試しに採用してみたのですが、割と意図通りの効果が得られたので、現在制作中の新作でもこの方式を採用しています。

プレイする側の感覚としてはランダムエンカウントに近いですが、敵シンボルの配置を工夫することでエンカウント頻度を調整することが可能です。

例えば、宝箱のある寄り道付近に敵シンボルを配置することで、宝箱を無視して進めば敵と遭わないが、宝箱を取ろうとすると1回エンカウントが発生する、みたいな絶妙な調整が可能になります。

一度倒したシンボルは一定時間 or マップを切り替えるまで復活しないようにしておけば、ランダムエンカウントでありがちな、ダンジョン探索中にどんどんエンカウントしてしまうといった事態も防ぐことができます。

敵シンボルは見えないため、シンボルを避けるのに神経を使うといったシンボルエンカウントでの短所もありません。

また、敵シンボルがあらかじめ見えるようになるアイテムやスキルを用意して、エンカウントを避けたい場合はそれを使うといったことも可能です。

仕様いろいろ

実装にあたっていろいろと細かい仕様は付けています。

前作『天下御免!からくり屋敷』と制作中の新作とでいくつか異なる点はありますが、概ね似たような仕様にしています。

  • 当初は敵シンボルが見えず、接触すると見えるようになる。
  • 戦闘からはボス戦を除いて100%逃げられるが、逃げた後はその敵シンボルが見えるようになって追いかけてくるので、実際にプレイヤーを操作して逃げる必要がある。
  • 逃げた直後は一定時間足止め。足止め時間を長くするスキル等も用意。
  • 一定範囲内に接近するとプレイヤーを追いかけてくるようになる。
  • 敵シンボルは初期位置からの移動範囲が決まっており、その範囲を超えては動かない。
  • プレイヤーの背後から接触された場合は確率で不意打ちとなる。
  • 逆に敵シンボルの背後から接触した場合は先制攻撃となる。
  • 倒した敵シンボルはマップを切り替えるまで復活しない。
  • アイテムやスキルで敵シンボルを最初から見えるようにできる。

実装としては自作プラグインとコモンイベントを併用しています。

敵シンボルを透明にしたり、移動範囲の設定やプレイヤーが一定範囲に接近したかどうかの判定はプラグインで行い、足止めや追いかけるなどの動作、戦闘の開始などについてはコモンイベントで行っています。

1つの敵シンボルに対してセルフスイッチA~Dをフル活用しています。

  • なし:通常時(自律移動:ランダム)
  • A:消滅中(既に倒した状態)
  • B:追跡中(自律移動:近づく、移動速度:2倍速)
  • C:停止中(逃げた直後の足止め時間)
  • D:可視状態

セルフスイッチの切り替えはプラグインで行い、セルフスイッチの状態に応じて敵シンボルのイベントページを分けています。

敵シンボルのイベント名は、$[1,2,3]という風にして、カッコ内に敵グループIDをカンマ区切りで指定しています。

指定された敵グループIDの中からランダムで、実際にエンカウントする敵グループが決まる仕組みです。

敵グループの決定はマップの切り替えの際に行われるので、逃げて同じシンボルに再度接触すると違う敵グループになっているということはありません。

まとめ

ワールドマップの場合、敵シンボルが数百体にも及ぶことになって重さが心配になりますが、画面に表示されている範囲から遠いイベントに関しては処理を行わないというRPGツクールのコアスクリプトの仕様があるため、そこまで重くはなりません。

実際に現在制作中の新作では、200体あまりの敵シンボルを配置していますが、特に重くはなっていません。

本当はプラグインを公開できればいいのですが、コモンイベントを併用するのと、細かい仕様は人によってかなり好みがあるので、紹介のみに留めておきます。

質問等はコメントなりで問い合わせていただければ、可能な限り回答します。

それでは読んでいただきありがとうございました。

[ テクニック ] モブ会話の作り方

2021-12-02 00:01:24

本記事は「ツクールフォーラムアドベントカレンダー Advent Calendar 2021」12月2日分の投稿記事です。

モブ会話とは?

「モブ(mob)」とは「群衆」といった意味で、RPGにおける「モブキャラクター」といえば、ストーリーに関わるメインキャラクターではない、町の人とかお城の兵士など一般のキャラを指します。

町の入口で「ここは○○の町です」と言ってくる女性や、井戸の周りを走り回る子供たち、今日の晩ご飯は何にしようか悩む主婦などが代表格でしょう。

彼らはメインキャラではないので、特に重要なことは喋りません。しかし、プレイヤーが話しかける以上、何かしら台詞を喋らせないといけません。

この台詞を「モブ会話」とか「モブ台詞」とか言いますが、このモブ会話を考えるのがけっこう苦手と言う人が多い印象です。

ただ私は、モブ会話を考えるのがむしろ楽しいし、割と得意だと思っているので、モブ会話の作り方について解説してみようと思います。

モブキャラに何を喋らせる?

そもそもモブキャラクターに何を喋らせればいいのでしょう。

最近のRPGでは、ストーリーの進行に関する情報はメインキャラたちの会話イベントで勝手に語られるため、モブキャラはあまり有益なことを話してくれない傾向にあります。

有益なことを話さないのでプレイヤーがモブキャラに話しかけることも少なくなり、話しかけるプレイヤーが少ないのでますますモブキャラに重要なことを喋らせないようになり……という負のスパイラル。

たわいない日常会話が悪いとは言いませんが、そんな台詞ばかりではモブキャラに話しかけるモチベーションも湧きませんし、何よりそんな台詞ばかり用意するのも大変です。

ストーリーのヒントや情報はメインキャラが全部話しちゃってるから、今さらモブキャラに喋らせる情報なんてありません、と言われるかもしれませんが、ヒントや情報はいくらでも考えられます。

ヒントや情報の種類

では、どんなヒントや情報が考えられるのか、具体的に見ていきましょう。

この町の情報について

まずは定番中の定番。

町の入口付近にいて「ここは○○の町です」と教えてくれる人。

これだって、この町が何という町なのかが分かる立派な情報です。

自分の作品では町に入った瞬間に町の名前が出るんで、そんな台詞いりません、という場合は、その町の特徴を一言添えてみるのはどうでしょう。

この町がどんな町なのか、一発で特徴を理解できるので、町の印象も深まります。

この台詞を言うキャラは、町の入口すぐの位置に配置するのが鉄則です。

ここは にぎわいの町。

家々が軒を連ね 世界中から人々が集まる

活気あふれる町ですわ。

ここは 山裾の村だ。

何にもない 村だけど

まあ ゆっくりしてって くれや。

ここは 砂塵の町。

砂漠の ど真ん中にある 町だ。

この町の詳細情報

上述のこの町の名前や一言特徴に続き、町に入って二番目くらいに遭遇するモブキャラに、もう少し詳しい町の情報を喋らせてみてはどうでしょう。

特に、異民族の村とか独自性の強い町の場合、その生活様式とか歴史とかを掘り下げた台詞があると、より印象が深まるのではないでしょうか。

こういった情報は攻略には直接関係ありませんが、かといって全く意味のない無駄な会話というわけでもなく、町の雰囲気作りに役立ちます。

かつて 草原を 転々としていた頃は

よく 野生動物に 襲われたものじゃったが

村に 定住してからは そんな危険も なくなった。

この町からは 東の大陸への 交易船が 出ているわ。

だから この大陸では あまり 見かけない

珍しいものが たくさん 入ってくるわね。

イベントに関わる人物・施設について

イベントが起こるキャラや場所があれば、それが町のどこにいる or あるのか、ヒントを出してあげると親切でしょう。

ストーリーに関わる重要人物であれば、その人についての性格や特徴などをモブキャラに喋らせておけば、いったいどんな人物なんだろう?という興味が湧きますし、実際に会った時の印象もより深くなります。

この町の 町長様は

いにしえの賢者 シルバー様の 末裔なんですって。

この先の 大きな お屋敷に お住まいよ。

え? ケージ爺さんだって?

ああ ケージ爺さんの 家なら

村はずれの 高台にある 一軒家だよ。

近くのダンジョンや次の町の情報

この町を拠点に攻略するダンジョンや、次に訪れる町の情報も重要です。

ダンジョンや次の町がどの方角にあるか、何か途中の目印はあるか、どんな特徴があるか、何か注意すべき点はあるかなど、プレイヤーに伝えるべき情報はたくさんあるはずです。

そして、これらの情報を一人の人に喋らせるのではなく、複数の人に分散して語らせるのがコツです。

一人の人だけに喋らせると台詞が長くなってしまいますし、聞き漏らしたら重大な情報ロスになります。その点、複数の人に分散して喋らせれば、一人あたりの台詞は短くて済みますし、一人ぐらい聞き逃しても大丈夫です。

下記の例では、次の目的地である賢者の墓というダンジョンの、(1)場所、(2)特徴、(3)注意点を、それぞれ3人のモブキャラに喋らせています。

この町の 北の 川と山脈を 越えた先に

いにしえの賢者 シルバーを 葬った

賢者の墓と 呼ばれる ほこらが あるそうだ。

賢者の墓の 入口は 封印されているそうよ。

いにしえの賢者 シルバーの 血を引く者にしか

その封印は 解けないんですって。

噂によると 賢者の墓の 内部は

侵入者を 防ぐため

あちこちに 落とし穴が 作られてるらしいぜ。

ここまではストーリーに直接関わってくるヒント・情報なので、比較的考えやすいかと思います。

ただこれだけでモブ会話が全て埋まるわけではありません。

他にどんな情報が考えられるでしょうか。

この町で手に入る装備品やアイテムの特徴

新しい町を訪れた時の楽しみの一つが、新しい装備品やアイテムの物色。

しかし、お店に入ってズラッと並んだ商品リストを前に、いったいどれを買えばいいんだ……と途方に暮れることがよくあります。

特に後半になるにつれ、単純な能力値だけでなく、様々な特殊効果や耐性を持った装備品も多数登場します。

もちろんアイテムの説明欄に特徴などは書いてあることが多いですが、その効能がよく理解できなかったり、見落としてしまったりということはあり得ます。

装備品の特徴などをモブキャラに詳しく説明させれば、有用性などもよく理解できるのではないでしょうか。オススメの装備品などを語らせれば、装備選びの参考になるでしょう。

仕留めた 獲物は あたいが 出刃庖丁で 掻っ捌く。

出刃庖丁は 普通のナイフと 違って 斬る武器だけど

この辺の 魔物なら 斬るだけで 威力は 十分だわ。

覚醒のオルゴールというものを 使えば

眠らされた 仲間を 起こせるらしいですな。

何回か 使うと 壊れてしまうそうですがね。

覚えるスキルの説明

市販のゲームであれば攻略本や攻略サイトが充実していて、どのレベルでどんなスキルを覚えて、どんな効果なのか、というのを事前に知ることができます。

しかしフリーゲームではそういう情報は基本的に分かりません。次のレベルでどんなスキルを覚えるのかはもちろん、そもそもこのゲームにどんなスキルが出てくるのかすら、プレイヤーは分からないのです。

そんな時、この町に到達する推奨レベル前後で覚えられるスキルの説明をしてくれるモブキャラがいれば、そろそろこういうスキルが覚えられるんだな、ということが分かるので安心感に繋がります。

また、スキルの説明欄だけではその効果が分かりにくかったりもします。

どういうシーンで有効なのかなどをモブキャラに説明させれば、使ってみようという気にもなりますし、デメリットがあるならそれを説明させておけば、注意して使おうという気になります。

たくさんの 魔物に 取り囲まれても

ファイアブレスの 魔法さえ 使えれば

一掃できるから 怖くないわ。

とは言っても MPを かなり 消費するから

そんなに バンバンは 使えないわね。

斧のスキルで 覚えられる 一刀両断の 技は

敵の防御力を 無視して ダメージを 与えられるぞ。

装甲が固い敵には 打って付けだな。

付近に出現する敵の特徴

あとは、町の近くやダンジョンで出現する雑魚敵の情報を喋らせるのも手です。

特に、強力な技を放ってくる敵や嫌らしい行動をする敵については、その危険性や弱点があらかじめ分かっていれば対処のしようがあります。

これが分からないと初見殺しとか理不尽な印象を与えてしまいますので、少し雑魚戦をホネのあるものにしたいと思っている場合には極めて有効です。

ヒグマは すさまじい攻撃力が 脅威ですな。

しかも 時々 痛恨の一撃を 繰り出してくるので

体力は 常に 気を配られた方が よろしいかと。

ベビーデーモンって 奴を 甘く見るなよ。

時々 ファイアブレスの 魔法を 唱えてくる 強敵だ。

複数 現れた時は まず 数を減らした方が いいぜ。

軍隊ガニって 奴は ハサミは鋭いし 甲羅は固いし

おまけに どんどん 仲間を 呼びやがる。

弱点は 槍か ナイフで 一突きして やることだな。

属性や状態異常の情報

最近の作品では、属性や状態異常について、序盤の町の本棚で解説されるようになっていたり、「戦闘指南書」みたいなアイテムを作っていつでも読めるようになっていることが多いようです。

しかし、そんな序盤から属性や状態異常がたくさん登場するとも思えませんし、そんなにたくさんの情報を一度に覚えきれないでしょう。

属性を考えることが重要な敵や、その状態異常を使ってくる敵が登場するあたりで、モブキャラにその情報を喋らせれば十分ではないでしょうか。

炎は氷に弱くて 氷は炎に弱い。これ 常識。

つまり 炎を操る魔物には 氷の魔法が 有効で

氷を操る魔物には 炎の魔法が 有効ってことね。

星見の山には マヒ毒を持つ 魔物が 出るらしい。

麻痺させられると しばらくの間 体がしびれて

身動きが とれなくなっちまうから 気を付けろよ。

能力値の説明

さすがに攻撃力や防御力の説明まではいらないと思いますが、敏捷性や運などは作品によって違う使い方がされている場合もあります。

説明書などで説明しているかもしれませんが、説明書などはあまり読まれないかもしれません。

モブキャラに説明させれば、どういうシーンでその能力値を重視すべきかなど、もう少しプレイヤー目線での解説ができるのではないかと思います。

運が強いと 毒や眠りなどの 状態異常に

かかりにくく なるんだって。

まあ 絶対じゃ ないらしいけどね。

敏捷性が 高い者ほど 先に 行動できるぞ。

敵よりも 素早く 動ければ

余計な ダメージを 食らわずに 済むってことだな。

TPは 戦闘開始時に 50までの間で 割り振られるわ。

ダメージを 受けたり 与えたりすると 増えていって

強力な 特殊技が 打てるようになるのよ。

ゲームシステムの説明

その他、ゲームシステムに関する説明も、説明書だとかチュートリアルなどで無味乾燥に説明されるよりは、モブキャラの台詞として説明された方が、ずっと理解しやすいでしょう。

作品独自のシステムはもちろんですが、「装備」メニューといったRPGに共通の基本的なシステムも、説明しておくに越したことはありません。

フリーゲームを遊ぶ層でそんなことも知らない人はいないのではと思うかもしれませんが、実況プレイなんかを見ているとけっこう分かっていない人はいます。

少しメタな台詞になってしまうかもしれませんが、メタ発言を避けようとして分かりにくい表現になっては本末転倒なので、そこは割り切った方がいいと思います。

武器や防具は ただ 所持しているだけでは

何の役にも 立ちません。

必ず 装備をなさってください。

からくり屋敷の中には 魔物が 住んでおっての。

普段は 姿が見えぬのじゃが

接触すると その姿を現すそうじゃ。

たんすや戸棚 ツボやタルを 見つけたら

中を 調べてごらんよ。

たまに ちょっとしたものが 手に入るかもね。

モブ会話作成のコツ

以上、見てきたように、モブキャラに喋らせる情報はいくらでもあります。

特に装備品やスキル、敵キャラの情報などは、あまり取り入れている作品は少ないように思いますが、数が多いのでモブ会話の量産に役立ちます。

私の場合、新しい町を作る際に、まずその町で得られる情報をざっと箇条書きにします。内容は上記で見てきたような、町の情報、イベントに関わる情報、装備品やスキル、敵の情報などです。

次にそれらを、どんなキャラ(性別・年代・職業など)に喋らせるかを意識しながら、台詞に起こしていきます。

▲この町で得られる情報を箇条書き

▲箇条書きした情報を台詞に起こす

情報は小分けに

あと意識した方がいいのは、1人の会話はなるべく1画面、多くても3画面に収めることです。

会話が長くなる場合は、得てして情報量が多いものです。1回の会話で得られる情報量が多いと理解しづらくなります。「近くのダンジョンや次の町の情報」で解説したように、情報を小分けにして複数のキャラに情報を分散できないか、検討してみましょう。

例えば、東の○○洞窟に××という盗賊がいて、そいつが町の大事な△△というアイテムを盗んでいったという情報であれば、

  • 東に○○洞窟がある
  • ○○洞窟に××という盗賊がいる
  • ××が町の大事な△△というアイテムを盗んだ

という情報に分けて3人の人に喋らせます。

プレイヤーはこれら3人の情報を組み合わせて、「東の○○洞窟で盗賊の××を倒して△△を奪い返せばよい」ということが分かります。

たとえ簡単でもプレイヤー自身に「考える」という作業が生まれることで、能動的にプレイしている感が得られます。単に言われた通りに洞窟に行ってボスを倒すよりも、ずっと達成感が得られるでしょう。

日常会話と見せかけてヒント

「今日の晩ご飯は何にしようかしら」的な完全な日常会話が絶対悪とは言いませんが、なるべくなら避けたいです。

特に、システムの説明など基本的な情報が多数発生する序盤の町から、有益でない日常会話のモブキャラが登場すると、「このゲームは町の人に話しかけても無駄なんだ」というイメージを持たれてしまいます。

ベストなのは、たわいない日常会話と見せかけて、実は重要なヒントになっているという台詞です。

右は飼い猫を探す女の子の会話ですが、別にこのネコを探すイベントが発生するとか、見つけると何かアイテムをくれるというわけではありません。

ですが、このネコの居場所が実はダンジョンに向かうルートの重要なヒントになっています。

あまりヒント然とした会話ばかりでも、ヒントを聞かされているような感じになって、それはそれでプレイを強制されている感が出てしまいます。

こういうさりげない会話でヒントが得られるのが理想ですね。

おわりに

モブ会話が苦手という人は、そもそもモブキャラに何を喋らせればいいのか分からないという人が多いのではないかと思います。

この記事を参考に、モブキャラにも有益なことを喋らせて、ただのモブキャラも作品を彩るキャラクターの一人として、命を吹き込んであげてください。

それでは読んでいただきありがとうございました。

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] タイマーの不具合修正

2021-09-11 10:34:13

※ 2021-12-10追記:
RPGツクールMZのVersion 1.4で、タイマーの挙動が修正されました。が、条件分岐のタイマー判定が正しくなっただけで、残り秒数の画面表示や変数取得の場合はこれまで通り小数点以下が切り捨てられる仕様のようです。これらの挙動も修正したい方、およびRPGツクールMVをご利用の方は引き続き本プラグインをご利用ください。

RPGツクールのタイマー機能には、想定より1秒早く終了判定されうるという不具合があります。

RPGツクールMV/MZにて、その不具合を修正するプラグインを作成しました。

RPGツクールシリーズにはタイマー機能があります。

昔のシリーズから存在する機能で、秒数を指定してのタイマーの始動と停止、タイマーの残り秒数による条件分岐、およびタイマーの残り秒数を変数に取得・操作することができます。また、タイマーの稼働中は画面内に残り秒数が表示されます。

この機能を使うと、1分以内に脱出!とか、30秒後に爆発する爆弾!とか、リアルの時間経過に依存するイベントを作成することができます。ミニゲームや時限イベントで活躍する機能です。

先日、星潟さんより、一部のツクールシリーズではこのタイマー機能に小数点以下の計算が行われない不具合がある旨、報告がありました。

こちらで調べたところMZでも同様の不具合があったので、修正プラグインを作成しました。

なお、VX Ace用の修正スクリプトは上記、星潟さんのサイトにあるので、そちらをご利用ください。

不具合の内容と原因

例えば右のように、タイマーを3秒で開始して、タイマーが0秒以下になるまでループさせるイベントを組んだ場合、実際には3秒ではなく2秒でループが終わってしまいます。

タイマーを1秒にすると一瞬で終わるので、より顕著に不具合が分かります。

不具合の原因は、条件分岐でタイマーの残り秒数の判定をする際に、小数点以下の秒数が切り捨てられている点です。

タイマーは内部ではフレーム数(1フレームは1/60秒)で管理されており、1フレーム経過するごとに残りフレーム数が1ずつカウントダウンされます。

そして残り秒数の判定や表示の際には、残りフレーム数を60で割って残り秒数として使用される仕組みになっているのですが、この時に小数点以下の秒数が「切り捨て」られるようになっています。

この時どうなるかというと、残り1秒から1フレーム経過して残り0.983秒(59/60秒)となった段階で、小数点以下が切り捨てられて0秒として判定されてしまいます。実際にはまだ0.983秒残っているにもかかわらず、1秒をわずかでも切った時点で0秒と判定されてしまうのです。

条件判定が「以上」の場合は正しく判定されますが、「以下」の場合は約1秒早く判定されてしまいます。たいていは「0秒以下」の条件で終了判定する使い方だと思うので、不具合の影響を受けることになります。

たった1秒ではありますが、たいていタイマー機能は制限時間内に何かせよ、というイベントやミニゲームで使用されるので、1秒といえどもかなり重要な意味を持つのではないでしょうか。

修正内容

このプラグインを導入すると、条件分岐のタイマー判定が小数点以下まで含めて正しく判定されます。

具体的には条件分岐のタイマー判定においては、小数点以下込みの数値で判定されます。例えば条件を「3秒以下」とした場合、正しく3.00秒になった瞬間に条件に合致します。従来は3.99秒になった瞬間に条件に合致してしまいました。

また、画面内に表示される残り秒数は、小数点以下を「切り上げ」て表示するように修正しています。従来は残り秒数が1秒を切って0.99秒になると、画面内の表示は0:00となっていましたが、上記不具合が修正されたことにより、このままだと画面上は0:00と表示されながらも、実際にはまだあと1秒弱の猶予があります。これだと紛らわしいため、表示が0:00になった瞬間にタイムアップとなるよう、小数点以下の秒数を「切り上げ」としています。

それから「変数の操作」にも、タイマーの残り秒数を代入・操作する機能があります。これは画面上に表示されている残り秒数と同じ秒数が取得できた方がよいと思うので、同じく「切り上げ」としています。

なお、既に修正前の状態で秒数の調整をされている場合は、本プラグインを導入して修正することによって、逆に想定よりも1秒長くなってしまうことになるため、タイマーを使用しているゲームに後から導入する場合は、ご注意ください。

質問やアドバイスなどはコメント欄まで、お気軽にお願いします。素材利用条件などについては、このサイトについての「提供素材について」の項目などをご覧ください。