【Unity】バグが出た場所と根本原因は遠いこともあります【C#】
またバグの話ですが、ゲームを作っているとデバッグ作業が占める割合も大きいのでついたくさん伝えたくなってしまう部分です。
バグが発生した時にはその瞬間、その場面に注目しがちですが、実はその前の処理に問題があってバグとなって現れることがあります。
表面的な解決だけでは一見問題を修正できているようでいて、実は再発する可能性があったりします。根本原因を特定する場合はより広い視野で問題を眺めてみることも大切です。
バグが出た所と根本原因は遠いことも
なんらかのバグを見つけた時、その部分だけ応急処置をすることがあります。表面上、バグとして確認された動作がなくなったように見えますが、後になって再発することも。
根本原因が解決されていないと、同じ状況になった時にまたバグが出てきちゃうんですよね。
例えば、RPGである魔法を使った時になんらかのフラグがOffになってなくて、次に敵がその魔法を使ったタイミングでバグが発生して処理が止まる、なんて状況が発生したとします。
ドラクエの魔法で具体的に名前を出してみると、
うおのめ(味方)がホイミを唱える(ここはまだ止まらないけど原因)
↓
もりそば(味方)がホイミスライムを攻撃(ここも大丈夫)
↓
ホイミスライム(敵)がホイミを唱える(ここで止まる)
みたいな感じです。
こういう状況だと「敵キャラがこの魔法を使うと止まる」みたいな解釈をしがちですが、根本原因はその魔法の処理で正しくフラグがセットされていないことなので、敵キャラの行動からその魔法を外しても、次に自分が魔法を使ったらまた止まるかもしれません。
これだと問題の解決までは至っていないんですよね。
リリースした後のゲームだともしかしたら応急処置的な修正を行うこともあるかもしれませんが、問題が再発する可能性を考えるならできる限り根本原因の解決を行っておきたいところです。
バグの発生原因を説明できるようになるとグッド
表面上の見えている範囲のバグを修正しようとすると根本原因まで解決できないこともあるので、ロジックの部分にも問題がないことを確認しておくと良いです。
そのためには「なぜこのバグが発生していたのか」を論理的に説明できるようにするとさらに解決しやすくなります。
ここでは本来どうなっているべき、という点も考えておきましょう。
バグが発生している理由が分かるということは、それを解決する方法も分かるということです。
場合によっては私たちが書いたコードだけではなくUnityエディタなどに不具合があることもありますが、多くは自分で書いたコードが原因なので解決はしやすくなるはずです。
もしかしたら普段のお仕事で「なぜなぜ分析」という言葉を聞いたことがあるかもしれません。「なぜなぜ分析」はトヨタ生産方式のひとつで、効果的に原因究明を行うための考え方で、ある問題に対して「なぜこの問題が起きたのか?」「さらにその原因はなんなのか?」といった形で掘り下げていく方法です。だいたい5回くらい掘り下げると根本原因に行き着くと言われています。
バグの根本原因を見つけるためにはこの「なぜなぜ分析」が有効だったりします。
再現手順を見つけるのも大事
別のページで触れていますが、バグの再現手順を見つけることも大事です。
再現手順が分かるということは、なぜそのバグが発生しているのかを説明できるということでもあります。手順のここで大元の問題が発生して、次の手順でバグとなって検知された、みたいな感じに論理的にバグの発生理由を説明できると解決までの道のりが見え、なおかつ再発生の可能性を減らすことができます。
コンピュータである以上、同じ入力を行ったら同じ出力があるはずなので、多くのバグは何かしらの原因があることがほとんどです。「何もしていないのに壊れた」なんてことはなく、何かしらの原因があるはずです。それを見つけるのも開発者の大事な役目だと思います。
デバッグ作業は仮説と検証の繰り返し
デバッグ作業(バグの修正)は仮説と検証の繰り返しです。
論理的に説明できて仮説を立てても、検証によって反例が出ることもあります。そうだとしても仮説を修正して再度検証すればOKです。仮説を立てることによって考えるためのベースラインがあるのは負担も減りますからね。
また、「本来ならこうなっているはず」とあるべき姿を思い浮かべておくのも大切です。ゲームを作る時にはこうしたあるべき姿を設計書や仕様書に書いていることが多いので、こうしたドキュメントを参考にするのも仮説を立てる上で役に立ちます。
本来の動きと目の前で起きている動きを比較するとおかしい部分を見つけやすくなるのもポイントです。
まとめ
バグが現れた場合は、表面上だけではなく根本原因まで目を向けることを意識してみてください。根本原因を解決しないと、直したつもりでもまたバグが出てくることがあるので、「あれっ? 直したのに!」と再び発生するバグに苦しめられることも。
根本原因にたどり着くためには論理的にバグの発生理由を説明できるようになるのが大切なので、仮説を立てて検証を行うことでその道筋を立てていきますょう。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】バグを見つけたら再現方法を確認するのが大事【C#】 2020.12.08
-
次の記事
技術や知識を得る時に言ってはいけない言葉を知ってますか? 2020.12.10
コメントを書く