最初はデモ用プレハブとスターターシーンを使って作業することを強くお勧めします。デモパーツからビルドするの手順を一読してください。
カスタマイズ
デモパーツをシンプルにリミックスできたら、次は独自のPowerUpやHazardなどを追加する準備が整いました。既存のシステムと連携する新しいプレハブの作り方について、以下を読み進めてください。
カスタムチェックポイントの作成
以下は、提供しているチェックポイントプレハブの階層構造です:
Trigger の要件

このプレハブにある「Trigger」オブジェクトは、チェックポイント、パワーアップ、ハザード、リスポーナーなど、プレイヤーを検知するほぼすべてのオブジェクトで見られる共通のパターンを使用しています。ここでは最初のプレハブについて詳しく解説しますが、それ以降のオブジェクトについては省略可能です。
チェックポイントには、CourseTriggerレイヤー上にisTriggerをオンにしたColliderが必要です。また、OnPlayerDataEnterイベントを実行するためのUdonBehaviourも必要となります。

このUdonBehaviourには、以下の変数を設定する必要があります。
- fxPrefabには、楽しいエフェクトが設定されたプレハブを参照させる必要があります。また、UdonプログラムDestroyAfterXSecondsなどを使用して、一定時間経過後に自身が破棄されるようにしてください。
- programには、このプレハブ内の別のオブジェクトにある、Checkpointプログラムが設定されたUdonBehaviourを参照させてください。
- eventNameには、上記のUdonBehaviour上に存在するイベントを設定する必要があります。
- deactivateOnTriggerは、プレイヤーがコースを完了するまで1回しか有効化されないようにするため、
Checkpoint用にチェックを入れておく必要があります。 - sendPlayerDataは、
StartGateとして使用されるCheckpointでのみ必要となります。
このプログラムの仕組みについて詳しく知りたい場合は、こちらの完全なドキュメントを参照してください:OnPlayerDataEnter
Checkpointプログラムの要件
ここまでの設定はすべて、プレイヤーを検知してFXオブジェクトを生成し、real(実際の)プログラム上でイベントを実行するためのものです。今回のケースでは、「UdonProgram」という名前のオブジェクト上にある「Checkpoint」というプログラムがそれに該当します。コライダー上のプログラムは、別のオブジェクトの「Trigger」イベントを実行しようとします。
必要な作業は、「Checkpoint」プログラムを適用したUdonBehaviourを持つオブジェクトを用意するだけです。このプログラムのすべての変数は、配置時に自動的に設定されるか、ワールド内で誰かがその Trigger に触れるとリアルタイムで設定されます。
スタート/ゴールプログラムの要件
スタートゲートまたはゴールゲートとして使用するチェックポイントを作成する場合、プログラムの設定が少し異なります。Trigger コライダーは同じものを使用し、プログラムも同じ「Checkpoint」を使用しますが、以下の変更を行う必要があります:
次の場合:StartGate:
- eventName を「StartRace」に設定します。
- sendPlayerData がオンになっていることを確認してください。
次の場合:FinishGate:
- eventName を「FinishRace」に設定します。
カスタマイズ!
上述の通りに Trigger Collider と Checkpoint Program を設定すれば、ワールドで使用可能なチェックポイントプレハブが完成します。誰かがチェックポイントの Trigger に触れると、Trigger Collider が配置されている GameObject が inactive(無効)に設定される点に注意してください。チェックポイント全体を非表示にしたい場合は、コライダーを一番上の親オブジェクトに配置します。デモ用のプレハブのように特定の部分だけを非表示にしたい場合は、それらのパーツを Trigger Collider を持つオブジェクトの子として配置してください。
プレイヤーがコースを完走するか、メニューから Respawn を実行すると、Course は Reset されます。このメソッドが呼び出されると、Course プログラムはすべてのチェックポイントから Trigger Collider を検索します。そして、最初のチェックポイント(Start Gate)を除く、Trigger Collider を持つすべての GameObject を inactive(無効)に設定します。プレハブに他のコライダーを追加している場合は、そのコライダーの isTrigger がオンになっていると、それらの GameObject も inactive に設定されてしまうため注意してください。
Checkpoint Prefabs リストに追加します
Utilityウィンドウには「Checkpoint Prefabs」が一覧表示されており、シーンへ簡単に追加できます。新しいカスタムプレハブをこのリストにドラッグ&ドロップして置き換えるか、あるいは先にリストの「Size」を変更して新しい空のスロットを作成し、そこにプレハブを追加することも可能です。
カスタムPowerUpの作成
PowerUpも同様の仕組みであるため、まずは前述の「カスタムCheckpointの作成」を読み、Trigger Colliderシステムがどのように動作するかを理解してください。Trigger Colliderのセットアップが完了したら、PowerUpプログラムの作成に進めます。
PowerUpプログラムの要件

- まず、Trigger Colliderが設定されており、それがこのUdonBehaviourの「Trigger」を呼び出すようになっていることを確認してください。
- playerModsManagerはそのままで問題ありません。UtilityウィンドウからPowerUpを作成した際、または「Refresh」を押した際に自動的に注入されます。
- speedChange または jumpChange のいずれかは、0以外の値を設定する必要があります。正の値を指定すると、Utility Window の Power Ups セクションでデフォルトとして設定した MoveSpeed または Jump Impulse に値が加算されます。負の値を指定すると、値が減算されます。これらを組み合わせることも可能です。高くジャンプできる代わりに移動速度が非常に遅くなるような PowerUp も問題なく作成できます。
- effectDuration は0より大きい値(負の数は不可)に設定してください。これは PowerUp の効果が持続する時間です。プレイヤーの HUD に変更内容を示すメッセージが表示され、ここで設定した速度でフェードアウトします。
PowerUps Prefabs リストに追加します。
Utility Window には、シーンへ簡単に追加できるように「PowerUp Prefabs」のリストが表示されています。新しいカスタムプレハブをこのリストにドラッグ&ドロップして入れ替えるか、最初にリストの「Size」を変更して新しい空の枠を追加し、そこにプレハブを追加することができます。
カスタム Hazard の作成
Hazard は、前述の Checkpoints の項目で解説した Trigger Collider の設定を使用します。そのため、まずはそちらの内容に目を通しておいてください。
作業の出発点となる2種類のハザード(RespawnハザードとSpawnedハザード)を作成しました。
Respawnハザード
これはデモコースで最も一般的なハザードです。Trigger Colliderを使用して、プレイヤーを最後のチェックポイントにリスポーンさせます。RespawnOnCourseプログラムが設定された別のオブジェクトの「Trigger」イベントを実行するように、Trigger Colliderを設定する必要があります。

UtilityWindowを更新すると、course変数が RespawnOnCourse プログラムに自動的に設定されます。
Spawnedハザード
このハザードは2つのパーツで構成されています。これは基本システムを拡張して機能を追加する例として提供している、最もカスタマイズされた単一目的のハザードです。
HazardSpawnerプログラム

このプログラムは、delay秒ごとにprefabをスポーンさせます。このプログラムはplayerModsManagerへの参照を保持しており、Utility Windowが更新された際に参照が注入されます。ハザードをスポーンさせると、新しいオブジェクト上で UdonBehaviour を探し、そのplayerModsManager変数を保持している参照に設定します。これは、スポーンされたハザードがプレイヤーの速度を低下させるために必要です。
SpawnedHazardプログラム

このプレハブには、「Trigger」という子オブジェクトにTrigger Colliderが設定されており、これがSpawnedHazardプログラム上の「HitPlayer」イベントを実行します。
- lifeDurationは、スポーン後にこのプレハブが存在し続ける時間を制御します。これにより、近くにプレイヤーがいない場合にハザードが永久に残ってしまうことを防ぎます。
- playerModsManager は HazardSpawner プログラムによって設定されます。
- speedChange は一般的な PowerUp と同様に機能します。「x」の値はプレイヤーのデフォルト速度に適用する変化量で、「y」の値は効果の持続時間です。このプレハブのデフォルト設定である (-3, 3) は、プレイヤーが触れた際に、そのプレイヤーの速度を3秒間だけ3減らします。
これらのプレハブはUtility Windowを通じて作成・管理されるものではないため、シーンに配置した後に「Unpack」することが重要です。そうしないと、自動インジェクションが正しく適用されない可能性があります。
その他のカスタマイズ
他にも試せる設定がいくつかあります:
スコアフィールド
スコアフィールドの見た目や表示するスコア数を変更したい場合は、「ScoreField」プレハブを複製し、Utility Windowの「Score Manager」セクションにある「Score Object Prefab」スロットに新しいプレハブをドラッグ&ドロップしてください。そして「Number of Scores to Show」を設定すれば、スコアを表示するUIが再生成されます。
HUD
HUDアイテムの見た目やレイアウトは、「HUD」オブジェクトのヒエラルキーを確認することで変更できます。
ミニマップ
ミニマップのカメラアングルや滑らかさ(smoothing amount)などを変更したい場合は、「MinimapCameraSystem/VCam-Follow」配下にあるCinemachineVirtualCameraを確認してください。そのFollowおよびLookAt変数は実行時に設定されるため、エディタ上でテストしたい場合は、Capsuleを配置してそれらの変数のターゲットに設定し、コース上で動かしてみることでミニマップ上の見た目を確認できます。
高度な設定
Projectペインで作成した新しいCourseアセットをクリックすると、その生データを確認できます。デフォルトのUdonプログラムなど、at your own riskで変更可能なさまざまな項目にアクセスできます。「Variable to Scene Object Lookup」セクションを変更することも可能です。

UtilityWindowがRefresh()を実行して適切なオブジェクトをUdonBehaviourに注入する際、この箇所を参照します。左側が変数名で、右側が正しいComponentを見つけるためのシーン内のオブジェクト名です。現在、システムは以下のComponent型の検索と注入をサポートしています。
GameObjectUdonBehaviourCinemachineVirtualCamera
つまり、courseという名前のパブリック変数を持つ新しいUdonプログラムを作成すれば、CourseManager UdonBehaviourが自動的に注入されます。ここには独自の項目を追加したり、必要に応じて型を追加したりすることも可能です。ObstacleCourseEditorWindowクラスのInjectVariableReferencesメソッドを修正し、if文のチェインに型を追加するだけです。優れた汎用Componentハンドラーを作成した場合は、gitリポジトリへプルリクエストを送ってください!
最終更新: