ゲームワールドを盛り上げる「観戦」ギミックの解説──デスゲームジャム準大賞『Chicken or Dead』振り返り

Creators Guideでは、2025年1〜2月にclusterユーザー・みずホコリさんの主催で開催されたワールド制作コンテスト「デスゲームジャム」にまつわる記事を掲載していきます(記事はこちらから)。
今回の記事では、準大賞を受賞したLinxさんが受賞ワールドのゲームデザインやギミックについて解説しています。実際の経験から導き出された、clusterのようなプラットフォームの特徴を活かしたゲームワールドのデザインは参考になります。(編)

こんにちは、Linxです。今回は2025年1月にclusterにて行われたユーザー主催のワールド制作コンテスト『デスゲームジャム』でのワールド制作で考えていたことの振り返りと実装した一部のギミックの解説をしていこうと思います。

「デスゲームジャム」とは、2025年1月10日~20日の10日間に、clusterでデスゲームをテーマにしたゲームワールドを作ろうという趣旨の企画です。
詳細は主催のみずホコリさんによる下記の記事をご覧ください。

私自身がclusterでドライブワールドレースゲーム等を作ったり、LinxCarSystemというclusterで使える車のアセットを配布したりと車を使った活動に力を入れていることもあり、今回は”カジュアルなデスゲーム”としては定番のチキンレースをテーマとして制作することにしました。
その結果作られたゲームワールドが『Chicken or Dead』です。

ルールは簡単で、タイミングをはかってブレーキをかけ、崖際ギリギリを狙って車を止めるゲームです。崖から落ちたら大爆発してアウト。

制作にあたっては、「シンプル」なゲームデザインを意識しました。

clusterではスマホ・PCデスクトップ・VRと3通りの操作入力方法があるためどんなデバイスを使っても遊べることが重要になります。
また今回はデスゲームということで攻略ややりこみの深さではなく、参加と観戦のハードルを下げてエンタメとして楽しみやすくするために極力シンプルな操作とルールにすることを意識しました。
その結果、ワンボタンで遊べる究極の簡単操作ゲームになりました。

シンプルではあるものの、スタートからは自動でアクセル全開になるので、当然ブレーキ開始から止まるまでには時間がかかり、崖から落ちないような距離を見極めてボタンを押す必要があります。操作は簡単なものの慣れが必要なゲームになっています。

また、2人対戦が基本ですが、1人でもCPUと対戦できるので練習や記録狙いで遊ぶこともできます。
モチーフの選び方や、簡単だけど多様な遊び方ができるデザインがよくマッチしたこともあり、「デスゲームジャム」では光栄なことに準大賞をいただきました。

観戦席からゲームの状況が一目でわかる

もうひとつ、意識的にゲームデザインしたのは「観戦」要素です。
デスゲームジャムのレギュレーションとして、「2人以上の対戦ゲームで勝敗がつくこと」「観戦スペースを作ること」がありました。

ゲームワールドは、スペース内にいる人数が不定という特徴があります。以前は基本的に「全員が遊べる」ゲームにしなければならないと思ってワールド制作を行ってきたので、二人対戦専用みたいなゲームは避けてきました。

ですが、2023年に制作したブラックジャックが遊べるゲームワールド「カジノ『バニー×バニー』」が人気となり(2025年3月現在は入室数13万)、そこで遊ぶ人たちを観察するうちに、全員強制参加よりも、ゲームに参加しない人も楽しめるような仕組みを中心にしてゲームだけがあるワールドではなく「ゲームコミュニケーションスペース」を設計した方がclusterというプラットフォームの性質と相性がいいことに気づきました。
そこで今回はあえて参加人数を1~2人として、観戦する人がゲームの状況を把握しやすいような仕組みを作りました。

そのかわり1戦あたりのプレイ時間が30秒程度とかなり短く、参加希望者が多い場合でも交代で遊びやすくなっています。
以下では、観戦しやすい状況をつくるために実装したギミックについて解説します。

ワールド各所には上画像のような観戦用のUIが配置されており、ゲームの状況がすぐにわかるようになっています。

内容としては以下のようになっています。

  • サムネイル写真
  • プレイヤー名
  • 記録
  • 勝敗
  • 落下したかどうか

順に実装方法を軽く解説していきます。

運転席に座った人の顔をサムネイル画像にする

まず、サムネイル画像に関してはRenderTextureを利用して撮影します。

基本的な使い方は上記記事を参考にしてください。

プレイヤーの顔の位置を撮影したいのでカメラの位置合わせをしたいのですが、今回はゲームシステム上、車に乗る必要があるので、車の運転席にあわせてカメラを設置しました。

今回は使いませんでしたが、座る必要のないゲームの場合はスクリプトで
PlayerHandle.getHumanoidBonePosition(HumanoidBone.Head)
を利用することでプレイヤーの頭の座標を取得できます。

また、RenderTextureは比較的重い処理なので、アバター以外を写さないようにCullingMaskでレイヤー設定を行うことで軽量にしています。

車が走り出すとアバターの髪などが大きく動いてしまうので、ゲーム開始直前にSet Game Object Active Gimmickでカメラを停止しています。

プレイヤーの表示名を取得して表示、記録を表示

次に、プレイヤー名と記録です。
こちらはTextViewコンポーネントを使用しています。プレイヤー名はPlayerHandle.userDisplayNameで取得できるのでそれを最終的にTextViewで出力しています。

//座った人の名前を送信するサンプル
const GameManager =  $.worldItemReference("GameManager");

$.onRide((isGetOn, player) => {
  $.state.playerName = player.userDisplayName;
  if(isGetOn){
    GameManager.send("setName",$.state.playerName);
  }
});
const name = $.subNode("PlayerName");

$.onReceive((messageType, arg, sender) => {
    switch (messageType) {
        case "setName":
          name.setText(arg);
          break;
    }
});

記録の方は、車の速度がほぼ0になった時の崖からの距離(Z座標のみ)を記録しています。
最後に勝敗と落下したかどうかですが、これはAnimatorとSet Animator Value Gimmickを使っています。
こちらは2025年2月現在ベータ機能ですが、スクリプトを中心に制作しているのであればSubNode.getUnityComponentからsetBool等でAnimatorをスクリプトから直接制御することも可能です。

「デスゲーム」というテーマでゲームを作る機会があったことで、ゲームとしての面白さだけではなくエンタメとしての面白さがclusterのゲームワールドでは重要になってくるという気づきがありました。

また、スクリプトの進化によって扱える情報が増えたことで、プレイヤーの名前など観戦に必要な情報が扱えるようになってきたことはゲームを作る上では大きな進歩になりました。
今後のゲーム制作にも今回の気づきを活かしていきたいと思います。

記事をシェアしてワールド制作を盛り上げよう!

Cluster Creators Guide|バーチャル空間での創作を学ぶならをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む