いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

ゲーム開発でイベントはしばらく使わない!

■■■開発日記 イベントはしばらく使わない!

Unity、C#には「イベント」という仕組みがあります。例えば弾を当て、敵キャラを殺したとしましょう。このとき、例えば弾の当たり判定(コードの、当たったかどうか判断する部分)で「弾が敵に当たったよ」とゲーム全体に通知します(「イベントを発行する」と言います)。敵を殺したらスコアも増やす必要があるし、弾が当たった敵が例えば爆発する様子を描画したいかも知れません。そして爆発音を流したいでしょう。そこで、スコアを管理するクラス、エフェクトの描画をするクラス、効果音を流すクラスは「弾が敵に当たったよ」という通知を受け取り(「イベントを購読する」と言います)、それぞれの働きをするのです(一応、こうして機能を「クラス」に分けて開発します)。これが「イベント」という仕組みです。この場合は3つのクラスが関係するので、このくらいだとイベントの使用を検討しましょう、みたいなことをジェミニが言っていました。「3年後、今イベントを使ったことに感謝することになります」とも。おお……。それなら、ということで慣れないところを「練習、練習」と頑張って15ヶ所くらいで使っていました。が、昨日、おそらくこのイベントが原因のエラーが出始めました。ブラウザゲームの開発中なのですが、ブラウザで試しに実行中、止まってしまうのです。

 

イベントを使わないで済ませるなら、弾が当たったとき、その場で「スコアを増やせ」「爆発シーンを描画せよ」「爆発音を流せ」という命令を出すのです。古くからのやり方で、意図は明確です。通常、コードを書いてひと月も経つと細部どころではなく「これ、誰が書いたの?」という感じに忘れています。でもその辺を読み直せばすぐ「ああ、弾が当たったときに必要な処理が並んでいるな」とすぐ分かります

 

イベント関係のエラーですが、何とかしようとあれこれ調べましたがどうにもならず、面倒なのでイベント自体を使わないことにしました。使っていたイベントを全て引き上げ、代わりに「スコアを増やせ」といった命令を書くことに。あれこれ迷いながら半日以上かかりましたが、一応イベントはなくなり、ホッとしました。

 

イベントにはもちろんよいところがあります。例えば、クラスAが発行したイベントをクラスB・C・Dが購読しているとき、さらにクラスEが購読する設計に変更してもAが何かを変更する必要はありません。……等と言われるとそんな気にもなってきます。が、ひと月くらいイベントをあれこれいじってみた感想は……とにかくコードの動作を追いかけにくい! これに尽きます。あるイベントをコードのどの部分が購読しているのか、(いちいち検索などしないと)すぐには分かりません。慣れの問題かも知れませんが、どんなにメリットがあろうとぼくにとってもう我慢の限界に近いストレスでした。もうちょうどいい。今回のバグの解消も併せ、イベントを通常のコードに置き換えてしまった、というわけです。

 

プログラムを書いてればバグは出ます。「ああ、あそこはこうした方がよかった」などと思いつくこともいくらでもあります。自分で書いたコードのどこが何をしているのか、すぐに把握できることは大事です。ふー、これでスッキリ! 開発作業はまあ順調です。