ITエンジニアのための勉強会・イベントレポート情報メディア

Unityで作ろう!ゲームアルゴリズム(11)シミュレーションゲームのアルゴリズムを作ってみる その2
skill

Unityで作ろう!ゲームアルゴリズム(11)
シミュレーションゲームのアルゴリズムを作ってみる その2

2017.09.22

 
  • このエントリーをはてなブックマークに追加

筆者は最近、「Unity1週間ゲームジャム」というイベントを楽しみにしています。どんなイベントかと言いますと、毎月1回月曜日にお題が出て、次の日曜日までの1週間でお題に沿ったゲームを作って投稿しよう!というもの。

開発期間は1週間ですのでサクッと遊べるミニゲームばかりで、その中にとってもセンスが良い作品があったり、1週間で作ったとは思えないほどクオリティが高い作品があったり、作者の狂気を感じる作品があったりと見どころがたくさん!人の作品を見ているだけでも刺激になりますし、同じ志を持ったゲームクリエイター仲間も見つけられますので、参加してみるのも面白いですよ!

さてさて、本題に入りましょう。

前回は戦略シミュレーションの移動処理を作りました。
今回は戦闘の仕組みを作っていきましょう。

賀好 昭仁

戦略シミュレーションの戦闘を考えてみる

アクションゲームの戦闘は敵を直接ひっぱたくわけですが、シミュレーションゲームの戦闘はそれとはまた別モノ。イメージを固めるところから始めましょう。

まずは、よく見る形のシミュレーションの戦闘システムを思い浮かべてみます。

  • ・ユニットを移動させる
  • ・移動先から攻撃範囲のセルを光らせる
  • ・攻撃範囲内にいる敵ユニットを選択
  • ・自軍ユニットが攻撃開始
  • ・HPが残っていれば、敵ユニットが反撃してくる

といった感じでしょうか。

書いてみると仕組みは単純ですが、攻撃力の高い敵を優先して狙ったり、突破されたくない場所に頑丈なユニットを配置したり、相手の攻撃範囲外から攻撃したりと、まさに戦略が攻略のカギになるというわけですね。

攻撃範囲の計算

攻撃範囲の計算は、前回の移動アルゴリズムよりもシンプルです。

処理の大枠は、ほぼ移動アルゴリズムと同じで、マスの移動コストは加味しない(全てのマスで1ずつ減る)ようにするだけでほぼ完成です。

↓の図では、中央に攻撃範囲が2〜3マスのユニットが居る場合の計算サンプルで、青いマスが攻撃可能なマスです。

図 1攻撃範囲の計算

まず、ユニットが居るマスには攻撃範囲の最大値を入れます。攻撃可能なマスは、「攻撃範囲最大値 〜 攻撃範囲最大値 - 攻撃範囲最小値」の値を持つマスで、今回の場合ですと0〜1のマスとなります。

ダメージ計算

次は戦闘におけるダメージ計算を考えてみます。まずは、ユニットにどのようなパラメータを持たせるべきかを検討してみましょう。

ユニットの種類が多い場合や、武器・防具でユニットのパラメータを多種多様に変化させたい場合は、防御力や属性値など、さまざまなパラメータを考える必要があります。シミュレーションRPGでよく見られる形と言えるでしょう。

一方、戦略シミュレーションであればユニットの種類が限定されているパターンが多いです。
その場合は、防御力などのパラメータを設けるよりもユニットの相性による攻撃倍率を個別に定義できたほうがバランスの調整がしやすくなります。

ということで、今回はユニットが持つ戦闘用パラメータとして

  • ・攻撃力
  • ・HP
  • ・ユニット相性倍率(攻撃対象のユニットに対するダメージ倍率)

を持たせてみましょう。

さらに、地形効果でダメージを一定量減らすような計算式を入れておけば「有利になる場所に陣取って戦う」という戦略を促せます。

これらのパラメータを計算式にすると、

ユニットの攻撃力 * ユニット相性倍率 * (1 - 地形効果による軽減率) = ダメージ

となります。

余談
多くのシミュレーションゲームには、命中率・回避率・クリティカル率など、運に左右される要素が存在しています。
ゲームをエキサイティングにする要素である一方、かなり扱いが厄介なものでもあります。

筆者が小〜中学生くらいのころ、とあるロボット系シミュレーションRPGで、命中率数%の敵に対して攻撃が命中するまでリセットを繰り返していました。
戦略の立て方がド下手だったのでしょうが、最終的に面倒くさくなってゲームクリアに至りませんでした。

このように、運次第であることと、やり直しができることが組み合わさると、プレイヤーは自分の思い通りの結果になるまでリセットを繰り返すという残念な状態になってしまうこともあります。

運が大きく影響するシステムの場合は、ユニットの行動決定時にオートセーブするようにして、やり直しを制限するなど、ちょっとした工夫をすることでよりプレイが快適になるかもしれません。

ユニットの残HPと攻撃力を比例させてみる

ここまでで戦闘に必要な最低限の要素は揃いましたので、こちらはオマケ的な要素となります。

読者のみなさまの中に「ファミコンウォーズ」をご存知の方、きっといらっしゃるかと思います。
シリーズ化もされている、とっても面白い戦略シミュレーションで、筆者にとって画期的だったのが「ダメージを受けるとユニットの攻撃力が下がる」という点でした。

ファミコンウォーズの歩兵ユニットは1ユニットあたり10人の兵士で編成されているのですが、敵から攻撃されて人数が減ると、それに比例して攻撃力も下がってしまいます。
他のシミュレーションが「敵を倒しきらないと手痛い反撃を受けるので、ダメージを与えるだけでは意味がない」のに対して、「敵が弱体化するのでダメージを与えるだけでも意味がある」というのは、リアルであることに加えて戦略の幅も広げるスゴイ要素だな、と思ったわけです。

仕組みとしては、ユニットを全て10体編成にするとして、HPが10%減る毎に1体減らし、攻撃力は残り人数に応じて倍率をかける(残り3体なら攻撃力0.3倍)といった感じで良さそうです。

実装してみた

ということで、ここまでの処理を実装してみました。

手元にある素材が猫でしたので、ナワバリを争うシミュレーションといった感じです。

サンプルプロジェクトはこちらからどうぞ。
https://github.com/akako/gamealgorithm-war-simulation/releases/tag/for_algorithm11

まとめ

戦闘というものはゲームとの相性がよく、さまざまなジャンルに組み込まれています。

どのような戦闘システムにするか頭を悩ませるところですが、「自分がどのようなシステムを作りたいか」ということに加えて「どのようなユーザーに遊んでもらいたいか」も加味しつつ仕組みを組み立てていくことをオススメします。

筆者は計算式をガチャガチャいじるので、複雑なシステムを組み立てがちなのですが、あまり複雑にするとユーザーのみなさまがついてきてくれないこともありますので(笑)

次回予告

次回は戦略シミュレーションのAIを作って、さらにゲームらしくしてみましょう!

原稿: 賀好 昭仁
qnoteスマホアプリ開発チーム技術主任。PHP・Android・iOS・Unityなど複数のプラットフォームでの開発を行う。
しばしば7匹の先輩猫社員たちにイスを占領される。

Unityで作ろう!ゲームアルゴリズム(11)シミュレーションゲームのアルゴリズムを作ってみる その2

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW