最近、本当に暑いですね。
渦潮はコミックマーケットの1日目に参加してきましたよ。
久しぶりに待機列から参加でき、午前からお使いをこなしつつ掘り出し物を探し、昼にコスプレゾーンを見て帰るという、コミケの楽しいところを存分に味わうことができました。
やる気の無い例年は午後から行ったりもしていましたが、待機列の炎天下で多少つらい思いをして行ったのが良かったのかな?
コミケの楽しみ方をようやく分かれたような感じがしました。(有給とってるから)
新しくできた南館は十分に広く、夏コミというのに快適でした。あの会場を冷やせる空調がきっと凄い。
南3・4の上階に人がおらず異様に歩きやすかったのは、外から入る通路以外の道が封鎖されて、到達すること自体の難易度が高かったせい。
西の上階から南の上階に移動するときは、一度分岐点まで引き返して行ったほうがいいです。一度降りてしまうと大分ハマることになると思います。
そんな週刊ケモミちゃん第4回。はーじまるよー
ケモミちゃん消失バグ、あるいは納涼バグとは
バグの話(とても長い前置き)
皆さんは、「デバッグ」というゲームの開発工程にある作業をご存知でしょうか?
開発上に発生するバグ(想定と違う動作や、違和感の正体、不具合といったものの総称)を、開発者の考える正常な状態に戻すというのが「デバッグ」という工程です。バグを「取り除く」行為自体をデバッグということもあれば、バグを「探す」ためにテストプレイをする行為までをデバッグという場合もあります。どちらにせよデバッグの目的は「バグを取り除き正常な動作を保証すること」です。
バグとは大体は開発の途中で、開発者が作品に埋め込んでしまうものです。開発者はバグを潰すために、まず何をしなければならないかというと、「バグにあたりをつける」必要があります。「問題の切り分け」、「バグの切り分け」ともいい、あるバグがゲームの中の大体どのへんで悪さをしているか、領域区切りを行うのです。
見当違いな部分を直す必要はありませんからね。お医者さんの診察と同じです。ゲーム画面のキャラクターの体力ゲージが歪んでいるのだったら、ゲージの枠になる「グラフィックファイル」がそもそも歪んでいるのだと考えるのか、ゲージを描画しているプログラムが間違っているのか、という切り分けを行います。枠自体が歪んでいるのならグラフィックファイルが悪い、枠からゲージが突き抜けているのならプログラムが悪いのでは? と。
前置きが長くなりそうで焦っているのですが、ゲーム開発ツールとして「Unity」を使っている場合、バグの切り分けとして以下のような分類ができます。
- ゲームエンジンに含まれるバグ
→泣き寝入り - アセット(有志が作成した開発ツール)に含まれるバグ
→つらそう - 自分が開発の途中で埋め込んでしまうバグ
→末永くお付き合い。い つ も の。2年ほど開発を続けて思ったのは、バグの無いゲームなんて無いんだってこと。
プログラミングをすると、自由度が増える代わりにバグを埋め込んでしまう、という言い方もできます。
例えばゲーム製作ツールとして「RPGツクール」を使うとしましょう。
その場合、1のゲームエンジン上のバグは恐らく99.99%ありません。バグの原因を切り分ける上で、1.を有り得ないと考えられる「ツクール」を使うのはスマートな選択肢といえます。
ツクールはプログラミングをしなくてもゲームが作れる⇒バグを恐れなくてもよい開発ツールだからです。
ツクールという土台が盤石だから、開発者の足元が突然崩れ去るようなバグを未然に回避できる。
ただし例外もあって、RxHpsychosisというゲームがそれにあたります。
ツクールのプログラムをガリガリ書き換えているのであろう本作品は、ツクールという土台を作り変えていますから、自分の書き換え作り出したツール部分に含まれるバグと戦う必要があります。あのゲーム作るの……本当に大変だったんだろうなあ……。隠れた名作です。
そして。自分が埋め込んだバグを直すのって、自分が作ったのだから直し方が分かるわけで簡単だと、世間一般では思われているような気がします。原因さえわかれば解決のプロセスにコストはほとんど発生しない、あとは手を動かすだけの作業だと。プログラムなにそれ美味しいの? な一般の方と話す機会があり、そう感じられているのだなあと、驚きを受けたことが今回の話を書くきっかけにもなりました。
ときにバグは「生きている」ことがある。バグという第二の生命体がいつの間にか自己増殖する。消したら増えるバグがある。そう、ゲーム開発とは彼らとの間に繰り広げられる、架空戦記でもあるのです。
ケモミちゃん消失する
いい加減本題に入りたいのです。
ある日ケモミちゃんが消失します。発生場所は3面裏世界。(本当に申し訳ありませんが、dlsite体験版プレイ済みの体で記事を書かせていただきます)
表世界からベッドに入り⇒裏世界にワープしたあと⇒ゴールであるベッドで眠ると、
「表世界」に帰ってこれない。
Unityのログを見ると、
「NullReferenceException: Object reference not set to an instance of an object」
ケモミちゃんのオブジェクトが見つからない。
これがケモミちゃん消失バグ。
ステージコンセプト的にホラー風で、元の世界に帰ってこれなくなってしまったというバグは、「学校の怪談」を思い出させます。(アニメ版で、踊り場の鏡の向こう側の世界から帰ってこれなくなってしまう回のやつ)
そしてバグの犯人を探すというミステリーが始まるのです。(プログラムの一部を指して「ついに犯人を追い詰めたぜ……」みたいなことをずっとやってる)
障害復旧と原因究明の話
さてバグが起こったときに最初にしなければならないのは「バグの切り分け」であるという話をしましたが、その後に取れる行動というのが2つあります。それが「障害復旧」と「原因究明」です。
障害復旧とは、何が起こったかはわからないけれど、とりあえず対処する、という対策です。
一番簡単な障害復旧手段として、キャラクターが消えたならば、その直後に新しくキャラクターを生成して、何事も無かったかのようにゲームを再開させてあげる。みたいな。
障害復旧とは、とりあえずゲームを進行させるための応急処置であるわけです。
これはバグという欠陥を即席の布地で覆うような対策なため、根本的にバグが解決されたわけではありません。つまり、他の場所でも同じくケモミが消失する現象が起こる可能性があります。障害復旧は、一箇所を解決するには早いですが、バグを取り除く手段ではありません。
恥ずかしい話ですが、リリース直前など時間が限られているときには、原因究明に時間を割くわけにもいかず、障害復旧的な対応をすることがあります。また、下手なパッチワークのためにさらなるバグを埋め込んでしまうこともあり、対策が必要になります。
追い込みの時期には「進行不能」の無い安定版をキープし続けながら、バグ対応を行っていました。
それでも欠陥的なバグが起こってしまったDLsite体験版ver1.00では、安定版における最新のものを紛失してしまったために、慌て障害復旧的な対処をしたために、全く違うバグを埋め込んでしまったという状況に陥ってしまいました。
我々の力不足というほかありません。色々と対策を考えてはいますが、時間との戦いになると本当に難しいです。精進したいです。
さて、原因究明とはその名の通り、バグの原因を追いかけて、原因を特定することです。これによって何が悪さをしていたのかが分かれば、その部分を正常な動作に変更することで、「ケモミ消失バグ」そのものを世界から取り除くことができます。
こうしてバグを取り除く作業を進めていくわけです。
まあ、バグを取り除くことによって、その下に隠れているバグの群が出てきて、「消しても増える」ことはあるんですけどもね……。
ケモミ消失バグの原因
ケモミ消失バグ(またの名を納涼バグ)とは、ケモミが裏世界から帰ってこれなくなるバグのことでした。
調査の結果判明したバグの原因というのが、こいつでした。
意味がわからないと思います。書いてる私も、初めておにどら氏から聞かされたとき、意味がわからなすぎて笑いました。犯人は「移動する床」だそうです。
現象としては、「移動する床に一度でも乗ると、ケモミが裏世界から帰ってこれなくなる」ということらしいのですが。
内部的にはケモミちゃんが移動床の子オブジェクトとして登録されるということだそうです。
つまりケモミにとって移動床が自分の立っている世界のように見えていることになります。
しかし、ケモミ消失バグはこの「ケモミの世界」という設定が引き起こしたのでした。
ケモミ消失バグの原因とは、
移動床に乗った瞬間に設定した「ケモミの世界」という設定を、移動床から降りたときに元の世界に返してあげなかったことのために起こりました。(子オブジェクト設定を解除しなかった)
そして裏世界にあるベッドから元の世界に戻る処理が行われたとき、マップ空間の外に出ることができない移動床の設定を引き継いだケモミが、マップの切り替えによって、メモリごと消えてしまったわけです。
そうです、まさにケモミは裏世界から出ることができなかったのです。
という、本当にあった怖い話。
バグとの戦いって割と毎回ミステリーです。
原因究明がされた納涼バグは、このあと無事にデバッグされまして、3面のマップ遷移は正常状態となりました。
そんな感じのバグを、見つける度に課題管理表に記表しながらテストプレイを行っております。
ここまで長文を読んで下さり本当にありがとうございます。
体験版DLはこちらから&感想・不具合投稿フォーム(いつもの)
また次週。あばよ!