プレイヤーのスクリプトです。
ファイル名とクラス名を同じにしてください。
この場合はPlayerMovement
PlayerMovement.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float moveSpeed = 5f;
public float rotateSpeed = 180f; // 1秒間に回転する角度
public float gridSize = 1f;
private bool isActing = false;
void Update()
{
if (isActing) return;
// --- 移動 (W/Sキー) ---a
float vertical = Input.GetAxisRaw("Vertical");
if (vertical != 0)
{
Vector3 direction = transform.forward * vertical;
if (!Physics.Raycast(transform.position + Vector3.up * 0.5f, direction, gridSize))
{
StartCoroutine(MovePlayer(transform.position + direction * gridSize));
}
}
// --- 左右回転 (A/Dキー) ---
float horizontal = Input.GetAxisRaw("Horizontal");
if (horizontal != 0)
{
// Aキーなら-90度、Dキーなら+90度
float angle = horizontal > 0 ? 90f : -90f;
StartCoroutine(RotatePlayer(angle));
}
}
IEnumerator MovePlayer(Vector3 targetPos)
{
isActing = true;
while (Vector3.Distance(transform.position, targetPos) > 0.01f)
{
transform.position = Vector3.MoveTowards(transform.position, targetPos, moveSpeed * Time.deltaTime);
yield return null;
}
transform.position = targetPos;
isActing = false;
}
IEnumerator RotatePlayer(float angle)
{
isActing = true;
Quaternion startRotation = transform.rotation;
Quaternion targetRotation = transform.rotation * Quaternion.Euler(0, angle, 0);
float t = 0;
while (t < 1f)
{
t += Time.deltaTime * (rotateSpeed / 90f); // 90度回転の速度に合わせる
transform.rotation = Quaternion.Slerp(startRotation, targetRotation, t);
yield return null;
}
transform.rotation = targetRotation;
isActing = false;
}
}
