みんな、ALだ。Mortumusの初めての舞台裏へようこそ。
Finがサーバーの坑道に潜ってデータベースやサブスクリプション、世界を動かし続ける恐ろしい分散システムの魔術と格闘している間、反対側にいる俺は、すべての剣の一振り、足音、松明の揺らめき、鎧の一つひとつが画面上でちゃんと見えて、ちゃんと感じられるようにしている。
ダークファンタジーMMOは、アセットストアからドラッグ&ドロップで組み立てられるようなものじゃない。俺たちが追い求めているあの荒々しいオールドスクールな感覚――戦闘の重み、鎧のきしみ、地平線に別のプレイヤーが見えたときの恐怖――は、その下にある道具がそのために特別に作られていないと生まれない。だから今日は、クライアント側でコツコツ組み上げてきたカスタムUnityシステムのいくつかを紹介する。誰も見ることはないけど、誰もが感じるやつだ。
さっそくいこう。
ビジュアル、ルート、そしてPvPのプライバシー
MMOプレイヤーについて一つだけ真実があるとすれば、これだ――俺たちは装備が大好きだ。そしてMortumusのようなフルルートPvPゲームでは、装備は単なるドーパミンの点滴じゃない――情報だ。誰かが何を着ているかで、そいつが自分に何ができるかがわかる。
秘密は守れ、安全に――Equipment Visualizer
早い段階で、多くのMMOが静かに無視している問題に気づいた。クライアントが視界内のすべてのプレイヤーの装備の正確なアイテムIDを知っていると、やる気のあるチーターがメモリからそれを引っ張り出して、ガンクを仕掛ける前にこっちの正確なステータスを把握できてしまう。
だから、Equipment Visualizerはちょっとパラノイアなことをしている。自分のキャラクターについては、完全な装備サービスから読み取る――自分の装備のすべてが見える。でも他のプレイヤーについては、サーバーが公開する簡略化された「ビジュアル」データしか読まない。剣は見える。ステータスシートは見えない。他人のアイテムIDは、そもそもFinのサーバーの外に出ない。
小さなことだ。でもメモリスクレイピング系のチートをかなり無力化できる。いいトレードだ。
アニメーションスタック
スキルベースの戦闘はアニメーション次第で生きるか死ぬかが決まる。予備動作が読めなければ、リアクションできない。攻撃が当たった感じがしなければ、戦闘に重みがない。死亡がモデルが…消えるだけに見えたら、雰囲気の半分が台無しだ。
Player Animation Coordinator
最初はみんなと同じようにやっていた――移動、魔法、死亡、ヒット、idle、全部を一つの巨大なアニメーションコントローラークラスで管理しようとした。全部同じファイルに。2週間くらいでカオスになった。
だから分解した。今のPlayer Animation Coordinatorは小さなエントリーポイントで、専門化された小さなモジュールのスタックを立ち上げる。移動、回転、攻撃、魔法、被弾リアクション、死亡、idle。それぞれが一つの仕事を持つ。それぞれが単独で読める。バグの追跡が数時間じゃなく数分で済む。
俺にとってはきれいなコード。プレイヤーにとってはタイトな戦闘。
戦闘のレスポンシブさ――Attack Animator & Spell Animator
典型的なMMOの問題がある。サーバー権威型の戦闘はチート防止の唯一の方法だが、サーバーがすべてのキャストを確認するのを待つと、糖蜜の中にいるような遅さになる。
Spell Animatorはちょっとズルをする――でも正直にだ。魔法キーを押すと、キャストアニメーションが即座に再生される。ローカル予測だから、体感は瞬時だ。それからFinのサーバーがそのキャストが本当に合法だったか検証する(cooldownが終わっているか、manaが足りているか、ターゲットが有効か、など)。承認されれば何も変わらない。却下されれば、きれいに中断する。
Attack Animatorは近接戦で同じダンスをする。さらにサーバーが指定する武器の攻撃テンポに合わせてスイング速度をスケーリングする。目にはレスポンシブな戦闘が映る。サーバーには嘘をつけない世界が映る。
「気持ちいい」と「フェアにプレイできる」のスイートスポット。このゲーム全体が、そこに生きている。
王国の音
オーディオは雰囲気の50%を占める。そしてどれだけ作業量がかかるか、みんないつも過小評価する。
雰囲気づくり――Audio Manager & Music Region System
従来のゲームは、見えない境界線を越えたときにBGMをハードカットで切り替えがちだ。不自然だ。俺たちは3Dポリゴンゾーンでやる。Music Region Systemを使えば、ワールド内に任意の形のエリアを描ける――呪われた森、呪いの礼拝堂、ボスへの道。入ったり出たりすると、Audio Managerがサウンドトラックを滑らかにクロスフェードする。カットなし。境界をちょっとまたいだだけで同じ曲がリスタートすることもない。
そしてこれはすべて、ミキサーグループルーティング付きのプールされたオーディオソースで動いているから、フレームバジェットへのコストはほぼゼロだ。
Character Audio Manager
Mortumusのすべての足音は、キャラクターのアニメーションと足元のサーフェスに連動している――石は石の音がして、泥は泥の音がする。魔法の音はアビリティに、武器スイングの音は武器に紐づいている。Character Audio Managerはアニメーションイベントとの間に入って、ゲームプレイのコードに触れることなく種族やクラスごとにSFXパックを差し替えられるようにしている。
小さなこと。たくさんの小さなこと。それが積み重なる。
水辺
ダークファンタジーの世界にはどこにでも水がある。沼、川、水没した廃墟、呪われた岬の先の海。そして水は、簡単にニセモノっぽく見えてしまうものの代表だ――特に陸と接するところ。メッシュが地形と交差するあの醜いポリゴンの水際線は、安っぽいゲームの証だ。
水のベース
水をゼロから作ったわけじゃない。Unityには実はBoat Attackという素晴らしいデモプロジェクトがあって、URP水システムとしては最高クラスのものが入っている。リアルな反射、屈折、浮力、全部入りだ。だからBoat Attackの水をベースにした。このホイールを再発明していたら、何の利益もなく数ヶ月を失うところだった。
でもBoat Attackは、まあ…ボート用に作られている。きれいで整った海岸線。砂浜で素晴らしく見える海岸の挙動は、Mortumusで実際に欲しい泥だらけで葦が生えた不規則な水路では最悪に見える。だから、外科手術が必要だった。
カスタムshader――Water Shoreline
Unityパッケージを直接編集する代わりに(アップデートのたびに壊れるから)、"WaterShoreline"という薄いカスタムshaderを書いた。パイプラインの中で海岸を担当する部分だけを差し替える。それ以外――反射、フローマップ、コースティクス――はBoat Attackからそのまま。必要な部分だけをオーバーライドしている。
大きな変更は二つ:
2メートルの泡のハードカットオフを撤廃。Boat Attackのデフォルトの泡バンドは固定の深度カットオフがあって、すべての海岸に均一な「白いリング」ができる。それをよりソフトなフォールオフとスクロールするノイズフィールドに置き換えた。泡が徐々にフェードして、完璧なリボンではなく有機的な舌や指のように崩れる。
ソフトな海岸線アルファ。あのポリゴンの水際線が地形にぶつかる問題?最後の半メートルの深さにかけて水自体を透明にフェードさせた。水際線が完全に消える。地形は水中に入るにつれて暗くなるだけ。本物の濡れた海岸線と同じだ。
川のシステム
Boat Attackの水の問題はこうだ:そのままだと海は美しく処理できるが、川というものを知らない。水はその場で波立てるが、本物の川のように下流へ流れたり、カーブを曲がったりはできない。ダークファンタジーの世界の半分が沼地で、川だらけで、びしょ濡れであるべきなら、これは問題だ。
だから、その上に川のシステムを構築した。
Mortumusの川は、フローパスとして作られる――源流から河口まで川の背骨をなぞるシンプルなポリラインだ。デザイナーが水を流したい場所にポイントを置くと、shaderが残りをやる。水面のすべてのピクセルについて、最も近いフローパスのセグメントを見つけ、そのセグメントの方向をローカルな水流として使う。結果:直線区間の近くの水は真っ直ぐ流れ、カーブの内側の水はカーブに沿って曲がり、その間はすべて滑らかに遷移する。
テクスチャ、法線、泡はすべてそのフロー方向に沿ってスクロールする。当てもなく漂うのではなく。川がどっちに流れているか、実際に見てわかる。
これらはすべてShoreFoamTunerからライブで調整できる。水のあるシーンにドロップする小さなインスペクターコンポーネントだ。泡の柔らかさ、ノイズスケール、ノイズ強度、ドリフト速度、アルファフォールオフのスライダーがある。マテリアルに触れることなく、湖全体の雰囲気を変えられる。
コミュニティと煽り: チャット & ソーシャル
オールドスクールMMOは、ゲームと同じくらい人が大事だ。ソーシャルツールがダメだと、世界が空っぽに感じる。
Overhead Chat System
キャラクターの頭上にテキストが固定されて、動くと追従して、距離でフェードする――このジャンルの絶対的な定番で、俺たちが死守するものだ。
パーティーが本当の会話になる。戦闘中に相手を煽れる。死にゆくプレイヤーの最後の言葉が、システムログの一行じゃなく、くだらなくて面白い何かになる。Overhead Chat Systemはプーリング、距離カリング、アンカートラッキングを処理するから、狭いダンジョンで20人が同時に叫んでいてもスケールする。
見た目を決める
正直に言え――キャラクター画面で恥ずかしいくらい長い時間を過ごすことになる。みんなそうだ。ゲームの中で一番いい鏡なんだから。
キャラクタープレビューシステム
ペーパードールは焼き付けた2Dレンダーじゃない。UIのrender textureにレンダリングされたライブ3Dシーンだ。フルライティング、リアルジオメトリ、装備のすべてがリアルタイムで表示される。回転させろ、ズームしろ、じっくり眺めろ。ゲームプレイには何の影響もないけれど、ゲームを所有している感覚を完全に変える、そういう種類の機能だ。
カバンを埋めろ: Icon Studio
MMO開発のちょっと汚い秘密を教えよう――アイコンだ。何百個も必要になる。すべての剣、すべてのポーション、宝箱から見つけるすべてのゴミルートに、ごちゃごちゃしたインベントリでもきれいに読める64x64の小さな四角が必要だ。しかも全部が同じゲームに属しているように見えないといけない。
3Dモデルをスクリーンショットして終わり、というわけにはいかない。ライティングを統一しないといけない。カメラアングルを統一しないといけない。そして――これがみんなが過小評価する部分だ――フレーミングがインベントリ内でアイテムが占めるグリッドサイズと一致していないといけない。1x1のダガーと2x3の大剣では、まったく違う構図が必要だ。さもないとどちらもおかしく見える。
俺たちの解決策: Icon Studio
Icon Studioは、一人(たいてい俺がブツブツ言いながら)で正気を保ったまま百個の統一されたアイコンを量産できるように作ったカスタムUnityエディタウィンドウだ。
ワークフローはこうだ:アイテムのprefabリストを入れる。インベントリでの各アイテムのグリッドサイズをツールに伝える――1x1、2x2、2x3、1x4、何でもいい。カメラを一度フレーミングする。そのフレーミングをプリセットとして保存する。生成ボタンを押す。
魔法はグリッドサイズが見た目だけじゃないところにある――実際のレンダーを駆動する。2x3のアイテムは2倍の幅と3倍の高さ(512pxベース)でレンダリングされるから、インベントリに入れたときプロポーションが正しく、引き伸ばされない。ロングソードは本当に1x4スロットを斜めに埋める。ポーションは本当に1x1に収まる。インベントリが本物のモノを整理している感覚になる。
さらにこのツールは:アイテムごとの透明または任意の背景、スケルトンベースのアイテムがゲームプレイリグを乱さずに表示ポーズをスナップショットできるボーンポーズキャプチャ、そしてアイテムカテゴリー全体のプリセットに対応している。すべての斧は同じカメラで、すべてのポーションは別のカメラでレンダリングされる。一貫性がタダで手に入る。
最終的な結果として、ゲーム内のすべてのアイコン――密なインベントリグリッドで32ピクセルでもきれいに読めるやつ――は、実際のゲーム内モデルから、アイテムがカバンの中で取る実際の形でレンダリングされている。外注の2Dアートなし。ライティングの不一致なし。UIで大剣より大きく見えるダガーなんてものもない。
誰も見ないタイプのツールだ。でもインベントリがバラバラのストック素材の袋に見えない理由でもある。
また次回
これらのシステムはどれもMortumusの目玉機能じゃない。足音がいい音だからとか、スケルトンが物理演算で粉々に爆発するからといって、このゲームを買う人はいない。でもこれらはすべての下にある骨だ――大きなものがその上に乗ったとき、ちゃんと感じられるようにする見えない仕事だ。
この基盤があれば、Finと俺は2年間ノートに落書きしてきた、あの暗くて残酷なフルルートの世界を――パソコンを川に投げ込みたくならないペースで――構築していける。
— AL