UEFN × Verse
そもそも、わたしはゲームというジャンル自体があまりわからない。色々調べていたところ、最近「タイクーン」というジャンルのゲームが流行っているという情報にたどり着いた。「タイクーンって何ぞや?」——UEFNでタイクーン型ゲームを作ろうと思い立った日は、そこからのスタートだった。
まず最初にした選択が「作り始める前に仕組みを理解する」だった。
タイクーンというゲームジャンルは、見た目よりずっと多くのデバイスが複雑に絡み合っている。公式ドキュメントを読み、既存のタイクーンマップを分解し、コミュニティの情報を照合しながら、そのサイクルを整理した。
結果として見えてきた骨格はシンプルだった。「素材を集め → 一定数貯まったら建設ボタンを押せるようになり → エリアが解放される」。これがタイクーンの基本ループ。
ただ、このループを実装しようとしたとき、ひとつの壁にぶつかった。UEFNには「素材の数を数えてUIに表示する」標準デバイスが存在しないのだ。
UEFN × Verseを触っていると、ある根本的な構造の違いに気づく瞬間がある。
木材(Wood)はマップ上に置かれたプロップ(prop)として扱われる。プレイヤーが攻撃して破壊するとイベントが発生し、Verseのコードがその信号を拾うことができる。一方、コインやV-Bucksといったアイテムはフォートナイトのインベントリシステムに管理されていて、Verseから直接読み書きすることはできない。
これは最初は不思議に見えるが、理屈は明快だ。プロップはUEFNが管理する「ゲームの世界」の住人で、アイテムはフォートナイト本体が管理する「経済システム」の住人なのだ。
この境界を理解してから、設計の方針が一気に定まった。木材カウンターはVerseで作れる。コイン管理はデバイスに任せる。それぞれの世界のルールに従えばいい。
方針が決まれば実装は速い。木材のプロップに prop_manipulator_device を紐付け、プレイヤーが攻撃するたびに発火する DamagedEvent を購読する。
UIはシンプルに。アイコン画像を中心に置いて、その右上に素材名、右下にカウント数を重ねて表示する。Verseの overlay ウィジェットを使えば、複数の要素をひとつのキャンバス上に積み重ねることができる。
消費ボタン(建設トリガー)は conditional_button_device のActivatedEventを購読し、ストックが足りるときだけカウントを減らす。基本的な仕組みはこれだけだ。
@editable ResourceIcon : texture と書いたところでエラーが出た。Verseのtexture型は初期値なしでは宣言できない構造になっている。false(未設定)とした。UIを描画する際に if(Icon := ResourceIcon?) でアンラップし、アイコンが設定されていないときはUIを作らない、という設計にした。コードを「動かす」のではなく「設計として正しく」書けた瞬間だった。
color_block や overlay を検索しても見つからなかった。Wood専用のカウンターが動くようになったとき、ふと思った。「同じロジックで石や金属のカウンターも作れるんじゃないか?」と。
そのとき採った設計方針が、このデバイスの核心になった。@editable を徹底的に使って、すべての設定値をUEFNのエディタから変更できるようにする、というものだ。
素材の種類(Wood / Stone / Metal)を変えたいなら ResourceName を変える。アイコン画像を変えたいなら ResourceIcon に別の画像を指定する。UIの表示位置を変えたいなら UIBasePosition を動かす。
コードは1行も変えない。エディタの設定を変えるだけで、別の素材のカウンターができあがる。
消費ボタンは複数対応にした。「ボタンが1個しか置けない」という制限は、タイクーンの設計を大きく縛る。for ループで配列を一括購読することで、エディタから好きな数のボタンを登録できるようにした。
「1個だけ動く」ではなく「何個でも動く」にする。この差が、後の拡張性を決める。
デバイスの汎用化が完成したとき、もうひとつの気づきが来た。
そのとおりだった。ResourceCounter_device を Wood 用・Stone 用・Metal 用として3つ配置し、それぞれの UIBasePosition を少しずつずらすだけで、フォートナイト標準UIを完全に置き換えたカスタムインベントリが出来上がる。
1日の目標は「タイクーンのリソースカウンターを作る」だった。でもセッションの終わりには、再利用可能なインベントリシステムのコンポーネントが手元にあった。
プログラミングの面白さって、こういう「思ってたより遠くまで来てた」という感覚だと思う。
以前はChatGPTでVerseを書いていた。コードを貼り付けて、エラーが出たら貼り直して、修正案をコピーして、またUEFNに戻って……このループを1つのコードで20〜30回繰り返すことも普通にあった。
Claude Codeはファイルを直接読み書きするため、このループが劇的に短くなった。エラーが出たらそのファイルを直接確認して即修正する。UEFNとエディタを往復する回数が減ると、思考の流れが切れにくくなる。
ツールが変わると、作れるものの「深さ」が変わる。
Wood専用だったカウンターが、セッションの終わりには木・石・金属どれにでも使える汎用デバイスになっていた。鍵になったのは @editable の徹底活用——コードを変えずに「素材テンプレート」として使い回せる設計にしたこと。そしてそのデバイスを並べるだけで カスタムインベントリシステム が完成することに気づいたとき、「タイクーンを学ぶ」という出発点から想像していたより遥かに遠くに来ていた。
Verseが触れるのは「プロップの世界」だけ、という境界を理解したこともまた大きかった。何をVerseで書くべきか、何はデバイスに任せるか——この判断軸が手に入ったことで、これからの設計がもっと速く、もっと意図的になる。