🔍本記事では 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 は表示されません。

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

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

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

プレイヤーの動きをアニメーション化する
次に、プレイヤーの動きを なめらかにアニメーション化 します。
移動や回転を一瞬で切り替えるのではなく、コルーチンを使って補間することで自然な動きになります。
変数の追加
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の可視化- コルーチンを使った 移動と回転のアニメーション化
次回は、階段の判定を追加してプレイヤーを上下に移動させるスクリプト を紹介します。




コメント