2015年4月3日

SCI-FI アーセナルの磨き込み

作成 Vasiliy Tedeev

Snowforged Entertainment はシベリア郊外にある小さな山の洞くつに設立されました。ヒグマ達と人間1人が運営する会社で、チームは今現在 Starfall Tactics の開発に取り組んでいます。独自の宇宙船艦隊の構築、それぞれの艦隊をカスタマイズ、熟練した相手に対し自身のデザインのテストが可能なリアルタイムウォーゲームです。 

PCゲームの熱狂的ファンである我がチームは、以前からハードコアで斬新なゲームを制作したいと考えていました。制作過程で技術的な制限に邪魔をさせるつもりはありませんでした。アンリアル・エンジン 4のおかげで直ちにプロジェクトに取り組むことができたため、開発をかなり楽にすすめることができました。

このブログ記事は、Sci-Fi アーセナルの基本ツールのいくつかを確実なものに仕上げるにはどうしたら良いかについて説明します。弊社のチームがこれらのタスクをどのように解決したかを以下にまとめてみました。代替ソリューションをお持ちの方は、ぜひとも下記コメントへ返信する形でご意見を聞かせてください!

"Always look on the bright side…unless you’re holding a laser pointing device.)"  作者不詳

Sci-Fi の歴史において、レーザーは最も効果的な武器の1つと思われます。お気に入りのSci-Fi ムービーの象徴的なバトルシーンを、宇宙スペースへ放たれるレーザーショットのまばゆい光なしで想像することは不可能だと思います。

チームが思い描いたStarfall Tactics は、レーザーをパワフルで脅迫的なだけの武器ではなく、スペースバトルに視覚的なエフェクトを追加する武器にしたかったのです。でもどういうわけか当初の考えとは異なり、シンプルなタスクではありませんでした。

SF_1

プログラマは解決策にビームパーティクルシステムを選択しました。Starfall Tactics のそれぞれの銃は、パーティクルシステムコンポーネントを含んだアクタです。レーザービームが放たれると、システムはターゲットへのビームをトレースすることにより着弾点を判断して、この値をビームのターゲットのパーティクルシステムでパラメータとして渡します。その後パーティクルシステムコンポーネントがアクティベートされて、レーザービームをターゲットへ送ります。

ここで明白な問題2つに直面したのです。

瞬間的なライト表示

2つのテストシップがレーザーを照射し始めた時に、ビームが瞬間表示されて、射線が全くはっきり表示されなかったのです。そこで別のソリューションを試しました。ここで コーン 形状のビームに変更して満足はできなかったのです。 

プログラマーはビームの伝播に有限値の速度を追加しました(パーティクルシステムのBeamタイプデータモジュールでSpeed パラメータをチェックしてください。)。適度なFPSで、レーザービームの分布がいくつかのフレームにきちんと収まるように、この値を出来るだけ高い値に設定にすることが大切でした。こうして最終的に正しいエフェクトを作成することができました。ビームは瞬時に表示されるだけですが、ビームの方向は問題なく追いかけることができます。

SF_2

メガビーム

遠くからでも視認できる十分な幅のビームにすると、ズームインした時に万里の長城よりも大きく見えることに驚いてしまいます。スペースシップが自身の凸包幅よりも太いレーザーを放射することを考えてみてください。おかしいですよね?

でも「リアルな」レーザーを作成すると、スペースシップは線のように細いライトをお互いに放射しあうのみです。標準的に考えても最高の出来とは言えません。

最初にパーティクルシステムのLOD(Level of Detail) 設定を修正することで問題解決を試みました。残念ながら、ビームの幅とサイズはほぼ即時に変化して、異なるLOD レベルの遷移がはっきりと表示されてしまいました。 

いくつか手を加えた(悪態をついたり)後に、ビームのマテリアルを利用してこの問題を解決しました。

SF_3

平面に対するビームの厚みは、カメラの高さによって継続的に変化します。はい。任務完了です!

SF_4

“An invisible wall of super condensed jelly would make a great shield to stop bullets and sarcasm.” Jarod Kintz 

Sci-Fi におけるエネルギーシールドは、ファンタジー小説における刀と同等です。ゲーム、小説、映画、TVシリーズなど刀は至る場所に登場します。でも、一律に同様な刀であるわけではありません。あるシールドはオブジェクトの表面に付着するものである一方で、その他のシールドはホストを取り囲む保護用の「卵」のようなフォームであったりします。こちらへ向かってくる発射物をすべて吸収してしまうシールドもあれば、発射物をすべて攻撃側へ跳ね返してしまうシールドもあります。 

ゲームプレイとメカニズムに関しては、これらのオプションすべてには良い点も悪い点もあります。Starfall Tacticsは、宇宙船を取り囲む不可視の「卵」のシールドを採用しました。シールドは向かってくる投射物を緩和して、プレイヤーに返すフィードバックとしてインパクトの瞬間に光を放ちます。

SF_6

当初は、シップを取り囲むシールドメッシュを作成する予定でした。でもコリジョンを有効にしたままで1つ1つのシップの後に追加のメッシュをドラッグするのは、良いアイデアとはいえないことに気づきました。そこで2番目の試みとして、プログラマーはメッシュシールドをカプセルコンポーネントと置換しました。このオプションを選択したことで、大幅なコリジョンオーバーヘッドが実質的に生じることなく同じ結果を実現しました。

インパクトの際にシールドが光るエフェクトの表現は、コリジョンが発生した時点でアクタをスポーンしています。アクタは、シールドエフェクトを表現するマテリアルの半球形状をしたスタティックメッシュで構成されています。この半球はカプセルのサーフェスへの法線とシップのサイズに基づいて、インパクトの瞬間に縮小します。

float Yscale = FMath::Abs(FVector::DotProduct(DamageEvent.HitInfo.Normal.SafeNormal(), this->GetOwner()->GetActorRotation().Vector().SafeNormal()));

Yscale = FMath::Lerp(this->CapsuleRadius * 2, this->CapsuleHalfHeight * 2, 1.0f - Yscale);

ShieldEffect(DamageEvent.HitInfo.Location, DamageEvent.HitInfo.Normal.Rotation(), FVector(this->CapsuleRadius, Yscale, this->CapsuleRadius));

結果としてプレイヤーは、シールドがシップに「密着」している感覚にとらわれます。この方法が非常にうまくいったため、チームのみんなは今後も別のシールドタイプで試してみるのが待ちきれないようです。

SF_7

“Could it be that planets are castaway heads."  Visar Zhiti 

 

惑星 - 宇宙の宝石!

3D アーティストの目標は、サーフェス全面のオーロラ(北極光)と一緒に惑星を作成することでした。彼らが作成した地球は、美しく神秘的な緑の光に包まれた表現となっています。エフェクトは、惑星の大気圏にぶつかった太陽風で発生します。 

SF_8

設定したいエフェクトはマテリアルを利用して実現することにしました。設定は比較的簡単です。標準テクスチャと緑(っぽい)ハローで惑星を作成します。ハローのイメージは、境界線周りに均等に配置された多数のライン数のコレクションと、特別なオパシティマスクを併用したものです。

最善の努力にもかかわらず、生命が通っていないエメラルド色の球みたいな惑星が出来上がってしまいました。オーロラが放つ雄大で柔らかな動きはスタティックメッシュでは表現できません。光はフレンドリーな大きなアメーバのように移動しながら、常に動き続けます。 

解決策として、ハローをゆっくりと回転させて、コサイン関数を用いてアニメーションをスケーリングしました。ボリュームは、ライトがある平面を1つだけでなく3つ使用して、これらをわずかに違う角度に配置してより追加しました。 

大体が出来上がってきました!同期した移動によりハローから発せられるライトの波が出来ないようにするために(不自然な見た目)、惑星のブループリントのランダム値で判断する新規のパラメータを追加しました。

SF_9

マテリアルを使用することで、惑星の一定回転速度を設定して、フレネルの公式でたくさんのボリュームを追加しました。弊社の3D アーティストは、ボリュームは状況を改善してくれる爆発と同類であると考えているようです。

SF_10

最後の一仕上げ!表面の暗い領域をライトアップする大気を惑星に作成しました。多少大きくしたり、別のマテリアルを適用することで、惑星のメッシュを複製することにより最終的に実現できました。 

ラディアンス(放射輝度)の量をもっと増やすために、Base カラーと昔ながらの信頼できるフラネルの式を使用することで、惑星自体の視界を遮ることなく、エッジだけが輝くようにしました。最後にノーマルマップから惑星のサーフェスにバンプやへこみを加えます。

SF_11

ついに惑星が誕生! 

SF_12

注釈:動作中はもっと見た目がよくなります!

“There is no real ending.It's just the place where you stop the story."  Frank Herbert(フランク・ハーバート) 

この記事が、我々のチームがほぼすべてのSci-Fi ゲームで使用できる基本エレメントを作成したアプローチ方法の解明に役立てば幸いです。Starfall Tactics は徐々に湧き上がった我々の断片的なビジョンを現実にしています。現時点のゲーム開発は高度なプロトタイプ段階にあり、今後も開発に進捗があり次第、皆さんと情報を共有していきたいと考えています。 

ゲーム開発の進捗状況は starfalltactics.com から確認してください。

では「通信終了」です!