「戦艦決闘空間」をUnityで創ったときの話
Unityという開発環境を得たときに、最初に創ってみたいと考えたのは広い海の上で船を動かすということでした。
最初は船を動かしてみた
Unity使って最初に創ったのが海原を動く船でした。ただ好きだったということだけでしょう。陸でも人でも空でもなく海に浮かぶ船。
ゲームオブジェクトとしての戦艦大和を創りスクリプトを付加して海面上を動かします。最近は下記のスクリプトで動かしています。このスクリプトはUpdate()内で毎周期呼ばれる処理です。
3行目で船の移動目標を決めておいて、4行目で船の進行方向を決めます。Lerp機能は補間してくれる機能で、ここでは回転(Quaternion)について使っていますが、スムーズで自然な動きとなるので良く使います。
7行目は船を船の向いている方向へ進めるための処理ですが、forwardという船の進行方向を向いた単位ベクトルに速度を掛けると船が指定速度で移動します。Time.deltaTimeは毎周期呼ばれる処理においての前回からの時間差分を示します。この時間を毎回掛けておくことでUnityのリアルタイム世界の中の時間に従って動作することが可能となります。
Unityのすばらしいことは、この少ないスクリプトを書いて船オブジェクトにアタッチするだけで簡単に船らしく動き出してくれる点です。
次は大砲から砲弾を撃ってみる
砲弾のモデルを作成してUnityにインポートして大砲射撃の処理を創ってみました。Unityには物理演算機能がありますが、自分の場合には自分でスクリプトで必要な物理演算処理を行っています。理由は、アプリ創り始めだったので、最終的なアプリのパフォーマンスが見えていなかったからです。
今から考えれば、結果的には全く問題が無かったと思われるので、完全にUnityの物理演算におんぶにだっこ状態で開発すれば良かったように思いますが、当時は状況が見えていなかったので、アプリ自体のサイズに加えてアプリの性能制御に関しては非常に気を使っていました。
ということで昔の高校の物理を思い出しながら放物線処理を微分系で記述して砲弾のためのスクリプトを創り砲弾オブジェクトに付加しました。
大砲の射撃の処理は、これもUnityで簡単に実現できるのですけど、あらかじめプレファブ化しておいた砲弾プレファブを砲身の先に実在化(Instantiate())させて実現しています。
実際のアプリではこの砲弾の実在化と同時にパーティクルで創った煙プレファブを同時に実在化したり、大砲発射音を同時にワンショット再生したり、砲弾自身にトレイルレンダラーを付加して大砲砲弾の飛翔跡を付加したりしていますが、いずれも簡単な作業です。
下記のビデオは実際にiphone6plusのキャプチャ映像から作成したものですけど、この中の12~16秒程度に大砲発射および砲弾飛翔の映像が出ています。参照して頂ければ雰囲気がわかります。