自作アプリ紹介: 「航空母艦決闘空間1942」-3
空母開発アプリ開発記の第3回目です。最初から大きくはなるだろうなとは思っていましたが、結果的にここまで大きくなるとは想像もできなかったものに最後はなりました。Unityの持つ様々な機能を活用して、いろいろな機能を試行錯誤しながら創りました。
今回は特に苦労した部分をまとめてみたいと思います。
しつこくてすみませんが、下記紹介ビデオの中で使われている機能です。
レイキャストによる攻撃対象艦船選択
プレイヤー側艦載機の攻撃を創るためには、これから雷撃する、または急降下爆撃する敵艦をどれにするかを選択しなければなりません。索敵機からの敵機動部隊発見の報を受け、延々長い時間を掛けて敵機動部隊が存在する海域に到着した攻撃部隊(10数機で構成した攻撃機の編隊)。この部隊の隊長としての役割として高度数千メートルの上空から攻撃対象の敵艦船を最初に選択します。
UnityのRayCast機能を使って、3D空間の中の攻撃機の場所にあるカメラから、攻撃部隊の隊長の視線の方向に海面に向けてRay(仮想光線)を飛ばします。この光線が3D空間上のオブジェクトにぶつかるとその場所を得ることができます。隊長の視線は仮想ジョイスティックで攻撃機の飛行方向とは独立に動かすことができます。
光線が海面にぶつかる場所を求めて、その場所に例えば100m以内にいる艦船を検索して攻撃対象艦船の候補として画面に表示します。そしてプレイヤがこの艦船を攻撃しようとする場合にはこのまま攻撃対象艦船を選択し、他の対象を探す場合には視線を外して他の艦船を探すことができます。
個々のコード等をここで示すと途方もない量になってしまいますので今回は示しませんが、このようにしてこの機能を実現しました。Raycastの機能はこのアプリで初めて使ったのですが、ネットで”Unity Raycast 使い方”とかググると来てくれる、すごくたくさんのすてきな先生方が懇切丁寧に教えてくれました。前にも書きましたがUnityの最大のメリットです。
Raycastは負荷が重いとは良く言われているようですが、とても便利な機能です。このアプリ以降のアプリでは良く使います。マスク機能を使うことで光線の衝突検知をするオブジェクトをレイヤーで選別することが可能なことも使い勝手を良くしてくれています。
これからリアルタイムシュミレーションを創ろうと考えている方でRaycastを使ったことがないかたは良くマスターしておくと良いと思います。
時間高速化処理
Unity独自機能という訳ではありませんが、空母機動部隊同士の海戦においては、実際はそのほとんどが待ち時間となります。なんせ索敵機が発進してから数時間しないと敵艦隊発見できない場合があるし、敵艦隊発見の報があってから攻撃部隊を発進させて敵艦隊海域まに到着するまで最大2時間かかり攻撃する時間、艦隊に祈祷する時間がまたかかります。よって空母機動部隊同士の海戦をリアルタイムシュミレーションとして実現するには、待ち時間を短縮するスマートな処理方法が必要となります。
戦略レベルでの待ち時間短縮方法
空母機動部隊は巨大なシステムであり、その巨大なシステム同士が艦載機で2時間かかる距離での総力戦となります。
このシステムを構成するために、艦隊全体を見る最上位ステートマシン(状態遷移)を敵と味方の2系統持ちます。そして決戦の朝6時とかに互いに索敵機を発進させるところからふたつのステートマシンが動作開始します。
プレイヤーは何もしなければ、実際の時間軸でプレイすることができますが実際は無駄な待ち時間となります。本当はこのじりじりするような待ち時間こそが空母機動部隊決戦の本質とは思いますけど、本アプリでは索敵活動をリアルに実行できるようにしていますのでそちらで体験頂くようになっています。
二つのステートマシンはそれぞれの状態遷移のための条件が決まっています。敵艦隊発見、個艦載機攻撃部隊発進開始、艦載機攻撃部隊発進完了し敵艦隊への移動開始、攻撃部隊が敵艦隊海域に到着、攻撃部隊による敵艦隊攻撃開始、攻撃時間終了、攻撃部隊帰投開始、攻撃部隊が自艦隊に到着、攻撃部隊着艦終了、攻撃部隊整備+第2次攻撃準備開始、第2次攻撃部隊攻撃準備完了、等々です。これを敵側と自分側の独立2系統を自律走行させます。
基本的には状態遷移は、関連する艦載機の数、艦載機の発艦時間、艦載機の巡航速度、艦載機の航続距離、艦載機の着艦時間、艦載機の整備時間+攻撃準備時間等々の時間要素で行われます。
敵も味方もすべて時間での状態遷移となりますので、ユーザーによって時間加速したいという要請があれば、次のイベントまで時間を高速に進めることが可能です。
下記の図の中で左の時計の下の時間加速ボタンで2段階の時間短縮を制御できます。
図:戦略画面です。英語ですみません。日本語プレイなら日本語表記です。
索敵作戦における時間短縮
索敵もまた長い時間を掛ける行動ですが、索敵こそが空母機動部隊同士の決戦において勝敗を決する最も重要な役割です。本アプリでは全方位を8等分したエリアを近距離、中距離、遠距離の3つのゾーンに分割して往復して索敵する仕組みとしています。
索敵に興味がないプレイヤーのために、①間違いを起こす可能性のある距離ゾーン毎の全方位自動探索機能、②索敵中の飛行機の時間を1分間加速する機能。の2つの時間短縮機能を創りました。
特に②の1分間加速装置はサイボーグ009の加速装置のように、Unityのカメラエフェクトのモーションブラーを用いた興味深いビジュアルを創りこみました。是非体験してみて頂きたいものです。
図:これまた英語ですみません(日本語プレイは日本語)上の左から2番目のスイッチは1分間加速スイッチです。
最後に
なかなか内容が多すぎてうまく紹介できておりませんが、まあ最初はトップレイヤでの機能創りこみ紹介ということでご理解下さい。詳細の創りこみについては必要に応じてコード等を含めて紹介させて頂くようにします。
以上