
Unityで「溜めて撃つ恒星レーザー」を作る|Shader Graphと演出の試行錯誤
前回は、惑星のShader、大気、自転、名前やHP表示まで追加して、Week8の目標だった「1個の惑星をUnity上でゲームらしく表示する」ところまで進みました。
今回からいよいよWeek9。Mother Planetsの画面中央にずっと存在する主役「恒星jyori」の制作に入りました。
そしてこのゲームの恒星といえば、やはりレーザーです。
HTMLで作っていたβ版でもかなり派手な演出を入れていた部分なので、今回は恒星本体の見た目だけでなく、レーザーの発射やチャージまで一気に作り始めました。
恒星jyoriを作る
まずは恒星本体から。CoreとCoronaを分け、表面には専用のShader Graphを作りました。
単純なオレンジ色の球ではなく、表面にまだらな熱模様を入れ、それがゆっくり流れるようにしています。
さらに外側にはCoronaを追加。
Fresnelを使って恒星の縁を強く光らせ、Bloomも組み合わせて「自分で発光している天体」に見えるよう調整しました。
このBloomでは少しハマりました。
Game Viewが妙に暗くなり、Bloomの設定をいくら触っても思った見た目にならなかったのですが、原因はRender Pipeline側で別のVolume Profileが使われていたことでした。
正しいProfileへ戻したところ、ようやく狙っていた発光になりました。恒星表面の模様、Corona、Pulseも動くようになり、ひとまず恒星jyoriの土台は完成です。


レーザー制作でかなり苦戦
ここからレーザー制作へ。
最初はLine Rendererで太いビームを作り、その周囲へ「うねり」や「螺旋」を追加しようとしていました。
ところが、これが思った以上に難しい。
3D空間上で線を螺旋状に配置しても、実際のGame Viewでは単に2本の波線が並んでいるように見えてしまったり、Shader Graphで疑似的な螺旋を作っても短いハイライトの集合に見えてしまったりと、なかなかβ版のような印象になりませんでした。
ここで一度方針を見直しました。
「新しいレーザー表現を一から考える」のではなく、すでに完成しているHTML版βを重要な基準資料として使う。
Mother Planetsにはすでに何度も調整してきたβ版があります。
恒星レーザーだけでなく、今後作る惑星レーザーやUFOなどの攻撃演出も、まずβ版の実装と見た目を確認し、それをUnityへ移植していく方針へ変更しました。
この判断はかなり大きかったと思います。
まずは「レーザーが発射される」仕組みを作る
グラフィック調整を一度止めて、レーザーそのものの動きを先に作ることにしました。
目標は、
Play → 2秒チャージ → 任意の位置へビームが伸びる → 照射 → 消える
という一連の流れです。
さらに、次の段階では公転している惑星を狙うことになるので、最初から「固定された座標」を狙うのではなく、移動しているTransformを毎フレーム追跡する方式にしました。
テスト用にMovingLaserTargetを作り、恒星の周囲を公転させます。そこへレーザーを撃ってみると、Targetが動いている間もレーザーの終端がちゃんと追従。
これで、
Charge → Extend → Hold → Fade
というレーザーの基本シーケンスが完成しました。
カメラと惑星軌道もβ版から見直す
ここで、レーザーとは別に気になることが出てきました。
Unity版の画面が、β版と比べてかなり真正面から見ているように感じます。β版はもう少し斜め上から惑星系全体を見下ろしていて、公転軌道も横長の楕円に見えます。
最初は「軌道そのものを楕円にする必要があるのでは?」とも考えました。そこでβ版の実装を詳しく調べ直してみると、意外なことが分かりました。
β版の軌道そのものは円でした。
円軌道を約25度の角度から見下ろし、さらにかなり弱いPerspectiveを使うことで、画面上では横長の楕円に見せていました。
そこでUnity版も同じ考え方へ変更。最終的に現在のカメラは、
Position (0, 76, -160)、Rotation X 25.2°、FOV 6.6
という、かなり遠くから望遠気味に見る設定になりました。
これによって手前と奥で惑星サイズが大きく変わらなくなり、それでいて公転軌道はβ版らしい横長の形に見えます。外周テストも行い、Radius 14.5程度まで広げても問題なく表示できることを確認。
ここでカメラと基本軌道は正式に確定しました。
チャージ演出もβ版準拠で作り直す
次にもう一度チャージ演出へ戻りました。
最初のUnity版では、発射前の2秒間に「短いレーザーを少しだけ出して脈動させる」という実装にしていました。
しかしβ版を見直すと、そもそもの考え方が違います。
β版のチャージは、
「レーザーが少し出ている」のではなく、「恒星がターゲットをロックオンしながら巨大なエネルギーを溜めている」
という演出でした。
そこでチャージ用のVFXをレーザー本体から完全に分離し、ChargeVfx として作り直しました。現在は、恒星の周囲に5重のチャージリング、Target側に4重リングを表示。さらに恒星からTargetまで全距離を結ぶCharge Laneを追加し、その周囲を3本のHelical Coilがうねりながら走ります。
中央には白熱したHot Coreを追加。Target側には短い白い円弧が回転するSweepも入りました。
もちろんTargetは公転中なので、これらのエフェクト全部がリアルタイムで追従します。
そして最後に、恒星本体もChargeへ連動。チャージが進むにつれてCoreの発光が強くなり、Coreが少し膨張、Coronaはさらに大きく膨らむようにしました。2秒のChargeが終わると、これらの演出が消えてレーザー発射へ切り替わります。
↓↓↓β版準拠チャージ演出テスト(動画)
ようやく「溜めて撃つ」感じが出てきた
まだ光量やリングの太さなどは最終調整前ですが、最初に作っていた短いチャージ光と比べると、かなりMother Planetsらしくなりました。
特に、
恒星の発光 → リング → Targetへのエネルギー経路 → ロックオン → 発射
という流れが画面上で分かるようになったのは大きいです。
今回かなり時間を使ったレーザーですが、途中でβ版を基準資料として使う方針へ戻したことで、ようやく進む方向がはっきりしてきました。
新しいものを作ることばかり考えていましたが、すでにHTML版で何度も試行錯誤して完成させた演出があります。これからはそれを「昔の試作品」ではなく、Mother Planetsの重要な仕様書兼リファレンスとして積極的に使っていこうと思います。
次は実際の惑星を狙う
現在レーザーが狙っているのは、テスト用のMovingLaserTargetです。
次の大きな目標は、このTargetを卒業して、
Twitchで !join → 自分の惑星が生成 → 公転 → 恒星jyoriがその惑星をロックオン → チャージ → レーザー発射
までをつなげることです。
すでにレーザー側は移動しているTransformを毎フレーム追跡できるように作っているので、この先は今まで作ってきたTwitch参加システムとレーザーシステムを接続していくことになります。
その前に、今回作ったチャージ演出と本レーザー側のグラフィックをもう少しβ版へ寄せる予定です。現状、最低限の動作を見るための簡易演出で完成版には程遠いです。
恒星レーザーだけでなく、今後実装する惑星・UFOなどの各種レーザーについても、β版を基準に再現していきます。
Week9に入って、ようやく画面中央の恒星から攻撃が飛び始めました。
少しずつですが、Unity版Mother Planetsが「惑星を表示するデモ」から、実際にMother Planetsが動いている画面へ変わってきています!