🔍本記事では Rigidbody や CharacterController を使わずに C# スクリプトだけでプレイヤーを移動させる方法 をさらに発展させます。
今回は 階段を検出して、プレイヤーを自動的に上下移動させる仕組み を実装します。
✅前回の記事はこちら👇
Stairレイヤーを追加する
まずは階段オブジェクトを検出できるように新しいレイヤーを作成します。
- Unity上部メニューから 「編集 > プロジェクト設定」 を開く
- 「タグとレイヤー」 を選択
User Layerの空き枠に新しく 「Stair」 を追加

階段オブジェクトの設定
作成したレイヤーを階段に反映します。
- 階段オブジェクトをすべて選択
- インスペクターから レイヤーを「Stair」に変更
- 「Mesh Collider」 を追加して判定を可能にする

スクリプトの変更
追加する機能
- 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が階段に当たる


まとめ
本記事では、Rayを使って階段を検出し、プレイヤーを上下移動させる方法 を解説しました。
次回は、複数フロアの追加・プレイ時間の表示・ポーズやリスタート機能の実装 を紹介していきます。




コメント