using UnityEngine; // 敵のコントローラー 攻撃対象を追跡し、攻撃する public class EnemyController : MonoBehaviour { [SerializeField] private CharacterAttack characterAttack; [SerializeField] private float searchRadius = 30f; [SerializeField] private float moveSpeed = 3f; [SerializeField] private float attackDistance = 1.5f; [SerializeField] private float attackInterval = 1.0f; [SerializeField] private float rotateSpeed = 10f; private AttackTarget _target; private float _lastAttackTime = -999f; private void Update() { if (_target == null) _target = FindNearestTarget(); if (_target == null) return; if (characterAttack.IsAttacking) return; var toTarget = _target.transform.position - transform.position; toTarget.y = 0f; if (toTarget.magnitude <= attackDistance) { TryAttack(); return; } var direction = toTarget.normalized; transform.position += direction * moveSpeed * Time.deltaTime; var targetRotation = Quaternion.LookRotation(direction); transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, rotateSpeed * Time.deltaTime); } private void TryAttack() { if (Time.time < _lastAttackTime + attackInterval) return; characterAttack.Attack(); _lastAttackTime = Time.time; } private AttackTarget FindNearestTarget() { var targets = FindObjectsByType(FindObjectsSortMode.None); AttackTarget nearest = null; var nearestDistance = searchRadius; foreach (var target in targets) { var distance = Vector3.Distance( transform.position, target.transform.position); if (distance >= nearestDistance) continue; nearest = target; nearestDistance = distance; } return nearest; } }