サーバーエンジニアの吉田です。私は今まで、いろんなゲームのバトルシステムに携わってきました。たくさんの失敗も経験しました。今回はその失敗した話と、その反省からこうした方が良いよ、という話をしてみたいと思います。ここでは、言語としてはC++を想定して書いていますが、オブジェクト指向で書けるプログラミング言語なら、同じ考え方を適用できるはずです。まとめこんなバトルをつくりたいまず、本題に入る前に、今回の記事で想定するバトルシステムについて、前提条件を書いておきます。複数のキャラが同時に、リアルタイムで行動する時間とともに、キャラの状態が変化する(例えば毒ダメージなど)あるキャラの行動が、他のキャラの状態を変化させる(攻撃、回復など)敵キャラのHPが0になり倒されると、スコアが加算されるよくある、リアルタイムバトルですね。このようなバトルをプログラミングする時、どのような事に注意をしなければならないでしょうか?多くの場合、次のような形になるかと思います。1つずつ、設計を進めてみましょう。一般的なオブジェクト指向の考え方で設計してみます。一般にゲームは、時間の経過とともに状態が変化します。その時間経過による状態の更新を、BattleクラスのUpdate()メソッドで処理することとします。BattleクラスのUpdate()の中で、各BattleObjectのUpdate()を呼びます。オブジェクトの更新処理BattleObjectの実装BattleObjectクラスの中身は、どうなるでしょうか。BattleObjectクラスこんな感じでしょうか。Update()の中では、下記の2つの処理をします。したら、スコア加算このような処理をします。実際に動かしてみたところ、特に問題なく動作します。・・・ところが!リリースした後、ユーザーさんから、「スコアが余計に加算されることがある!」と報告が来ました。テストでは問題なかったのに、どうしてこんな事が起こってしまうのでしょうか?何が起こっているか?いろいろと検証した結果、どうやら、キャラが多数出現し、処理に負荷がかかっている時に、報告されている様な現象が、たまに起こる様です。負荷がかかった時にしか発現しないので、デバッグでもチェックしきれなかった様ですね。図4を見て、考えてみましょう。