Unityで立体迷路を作る③|Rayを可視化する・プレイヤーの動きをアニメーション化する

Unity立体迷路 壁を判定させるRayを可視化させた画像 ゲームの作り方
Rayを可視化させて壁を判定

🔍本記事では Rigidbody や CharacterController を使わずに C# スクリプトだけでプレイヤーを移動させる方法 をさらに発展させます。
Debug.DrawRay() を使って Rayを可視化して壁検出の問題を特定しやすくする方法 と、コルーチンを活用して プレイヤーの前進や回転をアニメーション化する方法 を解説します。

✅前回の記事はこちら👇

Rayを可視化するスクリプト

まずは Update() を以下のように変更します。

void Update()
{
 Vector3 rayOrigin = transform.position + Vector3.up * 0.5f;
 Vector3 rayDirection = transform.forward;

 // シーンビューで確認用のレイを表示(緑色、長さcheckDistance)
 Debug.DrawRay(rayOrigin, rayDirection * checkDistance, Color.green);

 // 壁チェック
 bool isBlocked = Physics.Raycast(rayOrigin, rayDirection, checkDistance, wallLayer);

 if (moveButton != null)
  moveButton.SetActive(!isBlocked);
}

シーンビューで確認する

ゲームプレイ中に シーンビュー を開くと、Player から緑色の Ray が出ているのを確認できます。
※ シーンビューで Ray が見えない場合は、右上の Gizmos ボタン を ON にしてください。これが OFF だと Debug.DrawRay は表示されません。

Unity シーンビューの「Gizmos」ボタンの場所を示す画像

✅ Rayが壁に当たっていない → 前に進める状態

Unity立体迷路 Rayを可視化させた画像(Rayが壁に当たってない状態)

✅ Rayが壁に当たっている → 前に進めない状態

Unity立体迷路 Rayを可視化させた画像(Rayが壁に当たっている状態)

壁を正しく検出できない場合は checkDistance の値を調整 してください。

Unity立体迷路 プレイヤーインスペクターのCheck Distanceの場所を示す画像

プレイヤーの動きをアニメーション化する

次に、プレイヤーの動きを なめらかにアニメーション化 します。
移動や回転を一瞬で切り替えるのではなく、コルーチンを使って補間することで自然な動きになります。

変数の追加

 public float moveDuration = 0.3f; //移動速度
 public float rotationDuration = 0.3f; //回転速度

 private bool isMoving = false; //移動中かどうか
 private bool isRotating = false; //回転中かどうか

前進の処理を変更

public void MoveForward()
{
 if (isMoving || isRotating) return;

 Vector3 startPos = transform.position;
 Vector3 targetPos = startPos + transform.forward * moveDistance;

 // 壁チェック
 if (!Physics.Raycast(startPos + Vector3.up * 0.5f, transform.forward,  checkDistance,wallLayer))
 {
  StartCoroutine(MoveTo(targetPos));
 }
}

IEnumerator MoveTo(Vector3 targetPos)
{
 isMoving = true;

 Vector3 startPos = transform.position;
 float elapsed = 0f;

 while (elapsed < moveDuration)
  {
  transform.position = Vector3.Lerp(startPos, targetPos, elapsed /     moveDuration);
  elapsed += Time.deltaTime;
 yield return null;
 }

transform.position = targetPos;
isMoving = false;
}

左右回転の処理を変更

public void RotateLeft()
{
 if (!isMoving && !isRotating)
  StartCoroutine(Rotate(Vector3.up, -90f));
}

public void RotateRight()
{
 if (!isMoving && !isRotating)
  StartCoroutine(Rotate(Vector3.up, 90f));
}

IEnumerator Rotate(Vector3 axis, float angle)
{
 isRotating = true;

  Quaternion startRot = transform.rotation;
  Quaternion endRot = startRot * Quaternion.Euler(axis * angle);
  float elapsed = 0f;

 while (elapsed < rotationDuration)
 {
  transform.rotation = Quaternion.Slerp(startRot, endRot, elapsed / rotationDuration);
  elapsed += Time.deltaTime;
  yield return null;
 }

 transform.rotation = endRot;
 isRotating = false;
 }

動作確認チェック

  • ✅ Playモードで移動・回転がなめらかにアニメーションするか
  • ✅ 移動・回転中にボタンが押せないようになっているか

まとめ

今回は以下の内容を解説しました。

  • Debug.DrawRay() を使った Rayの可視化
  • コルーチンを使った 移動と回転のアニメーション化

次回は、階段の判定を追加してプレイヤーを上下に移動させるスクリプト を紹介します。

コメント

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