ピトンはチェックポイントのようなものです。ゲームを開始したばかりの時に、特に役立ちます。
テクニカルアートの詳細解説:Cairnが3Dブレンドマップを使用して、ゲームプレイに特化した岩のマテリアルをどのように描画するか

The Game Bakersのアンソニー・ベイヤーが、ロッククライミングシミュレーションゲーム『Cairn』における「ノピトン・サーフェス」の開発技術について詳しく解説します。Unityの3Dブレンドマップとコンピュートシェーダーを活用し、ビジュアルとゲームプレイの整合という課題をどのように克服したのかをご紹介します。
こんにちは!私は、The Game Bakersのテクニカル・アート・ディレクター、アンソニー・ベイヤーです。もともとグラフィックスデザイン(ウェブ、印刷物)の背景があります。私が初めてビデオゲームに関わったのは、2010年に3Dモデラーとしてモバイルゲームに携わった時でした。その頃、私はプログラミングについては何も知りませんでしたが、ゲームエンジンでグラフィックスを扱うことに強い興味を持っていたので、JavaScriptを開始し、空き時間を利用してUnityでいくつかの小さなプロジェクトをいじり始めました。最近は、3Dモデルを作るよりもコードを書くほうに時間を費やしています!私のArtStationページで、私の作品の一部をご覧いただけます。
私は『Furi』の開発が始まったばかりの頃、2014年頃、スタジオ「The Game Bakers」での仕事を開始しました。2016年に『Furi』をリリースした後、私たちは『Haven』(2020年発売)の開発に取り組み、2026年1月にはロッククライミングシミュレーションゲーム『Cairn』をリリースしました。
『ケアン』におけるピトンとは何ですか?
『Cairn』では、ほぼすべての壁を登ることができますが、この体験をよりやりがいのあるものにするため、スタミナシステムを導入しました。しばらく登り続けると、アヴァ(プレイヤーキャラクター)は次第に疲れてくる。休息をとるために、彼女はピトンと呼ばれる金属製のスパイクを使って壁に体を固定することができる。(ゲームプレイに関する注記:ピトンは任意であり、使わなくても登ることができますが、その場合はケアンズの登攀コントロールについてより深い知識が必要となります。
一部の壁の難易度を高め、「フリーソロ」ルートを強制するために、環境内の特定のエリアではピトンの打ち込みを禁止したいと考えました。このブログ記事では、私たちが「No-Piton Surfaces」と呼んでいる、ゲームのこの小さな技術的要素をどのように開発したかについて解説します。
『ケアン』の主人公アヴァが、ピトン禁止の岩壁にピトンを打ち込むことを拒む。
環境にさまざまな種類のサーフェスを追加する方法
Terrain (地形)に変化をつけたいとき、真っ先に何を思い浮かべますか?あなたは……
- 新しいオブジェクトやジオメトリを追加する
- 「頂点色ペイント」を追加する
- 「ブレンドマップテクスチャ」を使用する
Cairnは、決して一般的な「ハイトマップコントロール」の地形ではありません。実は、キットバッシュで作られた山なのです(詳細はArtStationのこちらの投稿をご覧ください)。

そのため、追加のオブジェクトやジオメトリを用いてバリエーションを作ることは困難でした。というのも、すでに複雑なレベルデザインプロセスにさらなるコンストレイントが加わってしまうからです(そして私たちは、実際のクライミング用レベルデザインの上に、ノーピトン・サーフェスを自由に配置してレベルデザインを行いたかったのです)。
BlendmapとVertex Colorは類似した手法であり、どちらもシェーダー内でサンプリングされるマスクであり、レンダリングに変化を持たせるために使用されます。
私たちのケースでは、以下の理由から頂点カラーペインティングを使用することができませんでした:
- ペイントするべき頂点が多すぎた。
- ジオメトリの重複(キットバッシュされたTerrain (地形)に投影されたハンドホールドメッシュ)があまりにも多く見受けられた。
- 当社のモジュール式岩はLODを採用しているため、頂点密度は一定ではありません。
2Dブレンドマップ
結局、私たちはBlendmapを採用することに決めました!
幸いなことに、レベルアート用に「TexturePainter」という専用ツールをすでに用意していた。このツールにより、エディタ内でブレンドマップを描画し、それらをレンダラーのグループ(手動で選択したレンダラー、またはTexturePainterの範囲内にある場合は自動的に選択されたレンダラー)に割り当てることが可能になりました。
The Game Bakersでは、Unityでカスタムツールを作るのが大好きです。どのスクリプトでも、まず最初に追加するのが[ExecuteAlways]です!
主にTexturePainterを使って地面の草や雪のレイヤーをペイントしていますが、TexturePainterでは自由に回転させることができるため、壁にもペイントすることができます。

シェーディングを少し調整した後、「No-Piton Surfaces」というブレンドマップを作成し、テクスチャリングやシェーディングを動的に変更できるようにしました。
これはベイクされたTexture2Dであるため、ワールド座標上の特定の位置でテクスチャの値を簡単に読み取り、プレイヤーがピトンを設置できるかどうかを判断できます。
そのアイデアはうまくいった!しかし、この段階では2Dマスク投影方法だったため、その範囲はかなり制限されており、山全体に対して1つしか設定できなかったため、精度は低かった。
その時点では、「ノーピトン・サーフェス」がゲームに実装されるかどうか、まだ定かではありませんでした。見た目はあまり魅力的ではなく、ゲームに有意義な価値をもたらすかどうかを確かめるためには、ゲームプレイやレベルデザインのテストを数多く行う必要がありました。
しかし、少なくとも、どのような外観にするかについては、イテレーションを開始することはできるでしょう。
いくつかのレンダリングパラメーターを公開することで、この種の表面にどのような外観が適用できるかを試すことができます。
最初の解決策がまったくうまくいかないとき
アートディレクションの面で描画の改善に取り組んでいた一方で、レベルデザインの面では、「2D投影方法」という制限がますます問題となってきていた。レベルデザインの特性上、以下の「ノピトン・サーフェス」を3Dでコントロールする必要がありました:
- 山の中(洞窟内)に見られるピトンなしの岩場
- 凹面や凸状の壁・アーキテクチャに沿って曲がる「ノーピトン」表面
…
時間の飛躍
ゲーム開発の世界では、常に新しいアイデアや取り組むべきことがたくさんあります。私は蝶のように仕事をするのが好きだ――何かに行き詰まると、その問題は無視して、別の場所で別のことをやり始めるんだ!
…
3~6か月後……
その他の新しい特徴として、距離場の表現にはTexture3Dを使用しています。多数のボリューム(ボックスや楕円体)を配置し、そこから距離場テクスチャを生成します。各ピクセルには、最も近いボリュームまでの距離が含まれます。各音量は、加算または減法に設定できます。
これを「トポロジー・ビュー」と呼びます。これは、ワールド空間のTexture3Dによって制御されるスクリーンスペースのイメージエフェクトです。
これらの3D距離場テクスチャは低解像度であり、ランタイムでオンデマンドで生成されます(また、エディタ内でベイクされておらず、CPU側からは読み取ることができません)。
3Dブレンドマップ
ここで、No-Pitonサーフェス向けの3Dブレンドマップソリューションを試す時が来た。
シェーダー側では、Texture2DからTexture3Dへの変更は簡単です。あとは、世界座標にノイズを加えて、これらの低解像度のテクセルを隠すだけ。さあ、出来上がり!
ピトンがないサーフェスの編集
この解決策は見た目はうまくいっていたものの、テクスチャがCPUから読み取れなかったため、テクスチャ上でプレイヤーの位置を検出できず、ゲームプレイ面ではすべてが機能しなくなっていました。
距離フィールドのサンプリングは、各プリミティブなボリューム(ボックス、楕円体)に対してイテレーションを行うことで、CPU側で実行された。しかし、岩のシェーダーでワールド座標にノイズを加えたため、端部分に目に見えるオフセットが生じており、明らかに精度が不足していた。

映像とゲームプレイの同期
この問題を修正するために、コンピュートシェーダーを使用して、岩のシェーダーで表示される値とまったく同じ値を取得しました。
プレイヤーがピトンを打ち込もうとした際、壁に対してレイキャストを行い、ピトンの設置位置を特定するとともに、プレイヤーが「ピトン禁止エリア」内にいないかを確認します。その場合は、ピトン設置位置のコンピュートシェーダーにリクエストを送信します。コンピュートシェーダーの結果が返ってきたら(同じフレーム内か、その次のフレームで)、ピトンを設置できるかどうかを判定し、可能であれば有効にし、不可能であれば無効にします。
これで、テクセル単位で完全に一致するサンプルができました。「rock シェーダー」と「No-Piton コンピュートシェーダー」の2つは、まったく同じコードを共有しています。
結局のところ、この解決策は少し正確すぎた!
普通の岩と「ピトン不可」の岩の間にいて、ピトンを打ち込みたいのに、ゲーム内の位置情報によって「ピトン不可」の地面にいると判断されてしまい、打ち込めない状況を想像してみてください。ピトンをたった2インチ離れた場所に打ち込めるのに、これはとても不公平に思えます。
これを修正するために、プレイヤーの周囲の狭い範囲で複数のサンプルをトリガーし、有効な位置があればそれを特定します。
ここでは、緑のラインのチェックマークがピトンなしの岩に、上の青いラインのチェックマークが通常の岩に付いているのがわかります。ピトンを打ち込む位置を、2つ目の位置に選択します。
磨くべき点はいつだってある
外観が順調なので、次は仕上げと磨きをかける段階です。
複数のノーピトンエリアを同時にロードする機能を実装しました。最も近い領域だけが「実際の」領域であり、それ以外はLODデカールとして描画されます。この解決策は、デカールがディファード処理されるため、岩のシェーダーと同じようにライトを受けられないという点で完璧とは程遠いですが、私たちのニーズには十分でした。
ピトンなしの3Dブレンドマップによる、LOD0(岩のシェーダー内で描画)からLOD1(ディファードデカールを使用して描画)への遷移
