最初はデモ用のPrefabやStarter Sceneを使って作業することを強く推奨します。デモパーツからビルドするの手順を一読してください。
カスタマイズ
デモパーツを少し調整できたところで、いよいよ独自の PowerUps や Hazards などを追加する準備が整いました。既存のシステムと連動する新しいプレハブを作成する方法について、以下で詳しく説明します。
カスタムチェックポイントの作成
以下は、提供している Checkpoint プレハブの階層構造です。

トリガーの要件

このプレハブにある「Trigger」オブジェクトは、チェックポイント、パワーアップ、ハザード、リスポーナーなど、プレイヤーを検知するほぼすべてのオブジェクトで共通して使われるパターンを使用しています。この最初のプレハブについては詳細に解説しますが、以降のプレハブでは説明を省略します。
チェックポイントには、CourseTrigger レイヤーに isTrigger をオンにした Collider が必要です。また、OnPlayerDataEnter プログラムを持つ UdonBehaviour が必要です。

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

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

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

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

このプレハブは "Trigger" 子オブジェクトに TriggerCollider を持っており、これが 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」オブジェクトの階層を確認してください。
ミニマップ
ミニマップのカメラアングルやスムージング量などを変更したい場合は、"MinimapCameraSystem/VCam-Follow" の下にある CinemachineVirtualCamera を確認してください。その Follow および LookAt 変数は実行時に設定されるため、エディター上でテストを行う場合は、Capsule を配置してそれら2つの変数のターゲットに設定し、コース上で動かしてみることでミニマップ上の見え方を確認できます。
上級者向け情報
Projectウィンドウで作成した新しい Course Asset をクリックすると、その生のデータを確認できます。そこで、デフォルトの Udon Programs など、自己責任で変更可能なあらゆる要素にアクセスできます。また、「Variable to Scene Object Lookup」セクションを変更することも可能です。

ここは、UtilityWindow が Refresh() を実行して適切なオブジェクトを UdonBehaviours に注入する際に参照される場所です。左側が変数名で、右側が正しい Component が配置されているシーン内のオブジェクト名です。現在、このシステムでは以下の Component 型の検索と注入をサポートしています。
- GameObject
- UdonBehaviour
- CinemachineVirtualCamera
そのため、「course」という名前の public 変数を持つ新しい Udon Program を作成すれば、自動的に CourseManager UdonBehaviour が注入されます。ここに独自の項目を追加したり、必要に応じて型を追加したりすることも可能です。その場合は、ObstacleCourseEditorWindow クラスの InjectVariableReferences メソッドを修正し、if 文のチェーンに追加の型を記述してください。もし汎用的な Component ハンドラーをうまく作成できた場合は、ぜひ git リポジトリに Pull Request を送ってください!
最終更新: