Unityで立体迷路を作る④|階段を判定してプレイヤーを上下移動させる方法

Unity立体迷路 Rayを使って前方の階段を判定する画像 ゲームの作り方
Rayを使って前方の階段を判定

🔍本記事では Rigidbody や CharacterController を使わずに C# スクリプトだけでプレイヤーを移動させる方法 をさらに発展させます。

今回は 階段を検出して、プレイヤーを自動的に上下移動させる仕組み を実装します。

✅前回の記事はこちら👇

Stairレイヤーを追加する

まずは階段オブジェクトを検出できるように新しいレイヤーを作成します。

  • Unity上部メニューから 「編集 > プロジェクト設定」 を開く
  • 「タグとレイヤー」 を選択
  • User Layer の空き枠に新しく Stair を追加
Unity立体迷路 タグとレイヤーにStairレイヤーを追加している画像

階段オブジェクトの設定

作成したレイヤーを階段に反映します。

  • 階段オブジェクトをすべて選択
  • インスペクターから レイヤーを「Stair」に変更
  • 「Mesh Collider」 を追加して判定を可能にする
Unity立体迷路 階段オブジェクトのレイヤーをStairに設定する画像

スクリプトの変更

追加する機能

  • Rayを使って前方に階段があるかを検出
  • Rayをデバッグ表示してシーンビューで確認
  • 上り階段 → 前に2マス+上に1マス移動
  • 下り階段 → 前に2マス+下に1マス移動

変更点

レイヤーの追加宣言

public LayerMask stairLayer;

Update() の修正

void Update()
{
 Vector3 rayOrigin = transform.position + Vector3.up * 0.5f;
 Vector3 forward = transform.forward;
 // 壁と階段を検出するレイを可視化
 Debug.DrawRay(rayOrigin, forward * checkDistance, Color.green);

 // 壁チェック
 bool isWall = Physics.Raycast(rayOrigin, forward, checkDistance, wallLayer);
 bool isMovingNow = isMoving || isRotating;

 // 上り階段チェック
 bool isStairUp = Physics.Raycast(rayOrigin, forward, checkDistance, stairLayer);

 // 下り階段チェック
 Vector3 downRayOrigin = rayOrigin + forward * checkDistance;
 Debug.DrawRay(downRayOrigin, Vector3.down * checkDistance, Color.red);
 bool isStairDown = Physics.Raycast(downRayOrigin, Vector3.down, checkDistance, stairLayer);

 // 移動ボタンの制御
 if (moveButton != null)
moveButton.SetActive(!isWall && !isMovingNow && (isStairUp || isStairDown || true));}

MoveForward()の修正

public void MoveForward()
{
 if (isMoving || isRotating) return;
 Vector3 rayOrigin = transform.position + Vector3.up * 0.5f;
 Vector3 forward = transform.forward;

 // 壁チェック
 if (Physics.Raycast(rayOrigin, forward, checkDistance, wallLayer))
return;

 // 階段チェック
 bool isStairUp = Physics.Raycast(rayOrigin, forward, checkDistance, stairLayer);
 Vector3 downRayOrigin = rayOrigin + forward * checkDistance;
 bool isStairDown = Physics.Raycast(downRayOrigin, Vector3.down, checkDistance, stairLayer);

 Vector3 startPos = transform.position;
 Vector3 targetPos;

 if (isStairUp)
 {
 // 上り階段
  targetPos = startPos + forward * moveDistance * 2 + Vector3.up * moveDistance;
 }
 else if (isStairDown)
 {
  // 下り階段
  targetPos = startPos + forward * moveDistance * 2 + Vector3.down * moveDistance;
 }
 else
 {
 // 通常の前進
 targetPos = startPos + forward * moveDistance;
 }

 StartCoroutine(MoveTo(targetPos));
}

動作確認チェック

  • Play(実行)して挙動を確認
  • プレイヤーの高さやRayの位置が階段とズレていないかチェック

確認ポイント

  • 前方に上り階段 → 緑のRayが階段に当たる
  • 前方下に下り階段 → 赤のRayが階段に当たる
Unity立体迷路 Rayを使って前方の登り階段を判定している画像
Unity立体迷路 Rayを使って前方の下り階段を判定している画像

まとめ

本記事では、Rayを使って階段を検出し、プレイヤーを上下移動させる方法 を解説しました。

次回は、複数フロアの追加・プレイ時間の表示・ポーズやリスタート機能の実装 を紹介していきます。

コメント

タイトルとURLをコピーしました