VRoidで作成したキャラクターが特定のオブジェクトに触れた際に、ゲームクリアの文字を表示する手順を解説します。
移動できるキャラクターと3D Colliderが用意できていることを前提に、接触判定とUI表示を追加します。VRoidモデルの読み込み・移動処理は別途必要です。掲載画像は旧作例で、今回のコードをUnityでコンパイル・再現した画面ではありません。所要時間は環境によって異なります。
ゴールオブジェクトの作成
- Hierarchy上で右クリックし、「3D Object」→「Sphere」から球体を作成して適当な大きさに調整します。
- Projectウィンドウで右クリックし、「Create」→「Material」を選択してマテリアルを作成します。
- まず現在の描画パイプラインに対応する通常のマテリアルで試します。旧画像の「Particles → Alpha Blend」は半透明の見た目の例で、接触判定に必須の設定ではありません。URP・HDRPで同じシェーダーを探す必要はありません。

作成したMaterialを球体にドラッグ&ドロップすると、見た目が反映されます。

ゴールオブジェクトの設定

- 作成したオブジェクトを選択し、Sphere Colliderの「Is Trigger」にチェックを入れます。
- Inspectorの「Add Component」から「Rigidbody」を検索して追加します。
- Rigidbodyの「Use Gravity」をOFF、「Is Kinematic」をONにします。固定ゴールが物理力で動かない構成です。
キャラの設定

- 接触するColliderのあるGameObject、またはそのColliderが属するRigidbodyのGameObjectのTagを「Player」にします。タグは子へ自動継承されません。下のコードはこの2箇所を判定します。
- キャラクターが床と衝突するためのCapsule ColliderはIs TriggerをOFFのままにします。ゴール側がTriggerなので、両方をTriggerにする必要はありません。既存の移動用RigidbodyやCharacterControllerを不用意に重複追加しないでください。
テキストの表示

- Canvas内にUIテキストを作ります。旧画像はUI → Textですが、現在の環境ではTextMeshProのUIテキストでも構いません。このコードはGameObjectの表示を切り替えるため、文字コンポーネントの型には依存しません。
- 作成したオブジェクトの名前を「GoalText」にし、テキストの内容へ「Clear!」を入力します。Canvasは有効にし、GoalTextをゴールとは別の階層へ置いてください。
- Width、Height、Font Size、Colorなどを変更し、文字の位置と見た目を調整します。

コードの追加
キャラクターが球体に触れたら文字が表示されるスクリプトをアタッチします。

- 球体オブジェクトを選択し、「Add Component」から「New script」を選択します。
- 名前を「GameController」と入力し、「Create and Add」をクリックして追加します。
- 追加されたGameControllerスクリプトをダブルクリックしてエディタを開きます。

ファイル名をGameController.csとして以下のコードを保存します。既存プロジェクトに同名クラスがある場合は、ファイル名とクラス名を一緒に変えます。コードと公式APIの照合を行った実装例で、コンパイル・実機動作は未検証です。
using UnityEngine;
public class GameController : MonoBehaviour
{
public GameObject GoalText;
private bool cleared;
void Awake()
{
if (GoalText == null)
{
Debug.LogWarning("Goal TextにUIを割り当ててください。", this);
enabled = false;
return;
}
GoalText.SetActive(false);
}
private void OnTriggerEnter(Collider other)
{
if (!isActiveAndEnabled || cleared || GoalText == null) return;
Rigidbody body = other.attachedRigidbody;
bool isPlayer = other.CompareTag("Player")
|| (body != null && body.CompareTag("Player"));
if (!isPlayer) return;
cleared = true;
GoalText.SetActive(true);
}
}Sphereを選択し、InspectorのGameControllerコンポーネントにあるGoal Text欄へ、作成したGoalTextをドラッグ&ドロップで割り当てます。

ゲームプレイテスト

再生直後はGoalTextが非表示になり、Playerがゴールへ入ったときだけ「Clear!」が表示されることを確認します。Player以外では表示されないこと、複数のColliderや再接触で処理が重複しないことも試します。表示後に消す機能やゲーム進行の停止は含めていません。
Windowsの既定ショートカットでカメラの位置を合わせる際は、Sceneビューで視点を決めた後にカメラを選択し、Ctrl+Shift+Fを押すとSceneビューの視点をカメラに反映できます。
Unityのほかの記事は、まとめからご覧いただけます。

旧版コードはGitHubのMOTOKI-LLC/cg-method-codeにもありますが、今回の修正コードとの同期は確認していません。このページのコードを基準にしてください。
Unityの基礎と学習の記事は、ほかにもあります。




まとめ
- ゴールにIs TriggerをONにした3D Colliderと、Is KinematicをONにしたRigidbodyを設定
- 接触するキャラのColliderまたは所属RigidbodyのGameObjectにPlayerタグを設定
- OnTriggerEnterでタグを判定してテキストを表示
参考:https://digilab.tech/unityコライダーでゴールを作成する/
2026年10月24日に公式APIのOnTriggerEnter、attachedRigidbody、SetActiveを照合しました。反応しない場合はConsole、参照、3D Colliderとレイヤー間の衝突設定を確認してください。文字だけ出ない場合はCanvasと親の有効状態も確認します。Collider2Dはこのコードの対象外です。
よくある質問:キャラが触れるとゲームクリアの文字を表示する
この記事では、何をする方法を紹介していますか?
VRoidで作成したキャラクターが特定のオブジェクトに触れた際に、「Clear!」などのゲームクリアの文字を表示する手順です。移動できるキャラクターと3D Colliderが用意できていることを前提に、接触判定とUI表示を追加します。VRoidモデルの読み込み・移動処理は別途必要です。掲載画像は旧作例で、今回のコードをUnityでコンパイル・再現した画面ではありません。所要時間は環境によって異なります。
ゴールになるオブジェクトは、どう作りますか?
3D Object → Sphereで球体を作ります。半透明は必須ではありません。現在の描画パイプラインに対応するマテリアルを使い、接触判定を先に確認します。
ゴールオブジェクトには、どんな設定が必要ですか?
オブジェクトを選択し、ColliderのIs Triggerにチェックを入れます。Add ComponentからRigidbodyを検索して追加し、Rigidbodyの「Use Gravity」をOFF、「Is Kinematic」をONにします。固定ゴールが物理力で動かない構成です。
キャラクター側には、どんな設定が必要ですか?
接触するColliderのあるGameObject、またはそのColliderが属するRigidbodyのGameObjectのTagを「Player」にします。タグは子へ自動継承されません。掲載コードはこの2箇所を判定します。床との衝突に使うキャラ側ColliderはIs TriggerをOFFに保ちます。
表示する文字は、どう作りますか?
有効なCanvasの下にUIテキストを作り、名前をGoalText、内容をClear!にします。TextMeshProでもGameObjectの表示切替は同じです。ゴールと別階層へ置き、位置・文字サイズ・色を確認します。
コードは、どこに付けますか?
ゴールのオブジェクトを選択し、Add Componentから「New script」を選んで、名前を「GameController」と入力して作成します。キャラクターが触れたら文字が表示される仕組みで、記事のまとめでは、OnTriggerEnterでタグを判定してテキストを表示すると説明しています。
動作確認は、どうしますか?
最初は非表示、Player接触で表示、Player以外は無反応になることを確認します。失敗時はConsole、Goal Text参照、3D Collider、Trigger、Rigidbody、タグ、レイヤー間の衝突設定、Canvasと親の有効状態を順に確認します。今回は実行・画面確認をしていません。
コードはどこで確認できますか?メニュー名が違うときは?
修正コードはこの記事に掲載しています。GitHubにある旧版との同期は未確認です。メニュー名や配置が異なる場合は、使用版の公式マニュアルで確認してください。
