Initial commit
This commit is contained in:
168
Assets/Scripts/CarPatrol.cs
Normal file
168
Assets/Scripts/CarPatrol.cs
Normal file
@@ -0,0 +1,168 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
public class CarPatrol : MonoBehaviour
|
||||
{
|
||||
[Header("Waypoints")]
|
||||
[SerializeField] private Transform[] waypoints;
|
||||
|
||||
[Header("Movement")]
|
||||
[SerializeField] private float patrolSpeed = 5f;
|
||||
[SerializeField] private float chaseSpeed = 12f;
|
||||
[SerializeField] private float acceleration = 3f;
|
||||
[SerializeField] private float rotationSpeed = 6f;
|
||||
|
||||
[Header("Detection")]
|
||||
[SerializeField] private float detectionDistance = 20f;
|
||||
|
||||
[Header("Siren Reference")]
|
||||
[SerializeField] private PoliceSiren siren;
|
||||
|
||||
private Transform _player;
|
||||
private int _currentWaypointIndex;
|
||||
private float _currentSpeed;
|
||||
private bool _isChasing;
|
||||
|
||||
void Start()
|
||||
{
|
||||
_player = GameObject.FindGameObjectWithTag("Player")?.transform;
|
||||
|
||||
_currentSpeed = patrolSpeed;
|
||||
|
||||
if (siren != null)
|
||||
siren.isSirenOn = false;
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (_player == null || waypoints.Length == 0) return;
|
||||
|
||||
DetectPlayer();
|
||||
|
||||
if (_isChasing)
|
||||
ChasePlayer();
|
||||
else
|
||||
Patrol();
|
||||
}
|
||||
|
||||
private void Patrol()
|
||||
{
|
||||
_currentSpeed = patrolSpeed;
|
||||
|
||||
Vector3 target = waypoints[_currentWaypointIndex].position;
|
||||
|
||||
MoveTowards(target);
|
||||
RotateTowards(target);
|
||||
|
||||
if (Vector3.Distance(transform.position, target) < 0.5f)
|
||||
{
|
||||
_currentWaypointIndex++;
|
||||
if (_currentWaypointIndex >= waypoints.Length)
|
||||
_currentWaypointIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private void ChasePlayer()
|
||||
{
|
||||
_currentSpeed = Mathf.MoveTowards(
|
||||
_currentSpeed,
|
||||
chaseSpeed,
|
||||
acceleration * Time.deltaTime
|
||||
);
|
||||
|
||||
MoveTowards(_player.position);
|
||||
RotateTowards(_player.position);
|
||||
}
|
||||
|
||||
private void DetectPlayer()
|
||||
{
|
||||
if (_player == null) return;
|
||||
|
||||
Vector3 toPlayer = _player.position - transform.position;
|
||||
|
||||
float distance = toPlayer.magnitude;
|
||||
if (distance > detectionDistance)
|
||||
{
|
||||
StopChase();
|
||||
return;
|
||||
}
|
||||
|
||||
Vector3 direction = toPlayer.normalized;
|
||||
float dot = Vector3.Dot(transform.forward, direction);
|
||||
if (dot < 0.5f)
|
||||
{
|
||||
StopChase();
|
||||
return;
|
||||
}
|
||||
|
||||
float lateralDistance = Vector3.Cross(transform.forward, toPlayer).magnitude;
|
||||
|
||||
if (lateralDistance > 2f)
|
||||
{
|
||||
StopChase();
|
||||
return;
|
||||
}
|
||||
|
||||
StartChase();
|
||||
}
|
||||
|
||||
private void StartChase()
|
||||
{
|
||||
if (_isChasing) return;
|
||||
|
||||
_isChasing = true;
|
||||
|
||||
if (siren != null)
|
||||
siren.isSirenOn = true;
|
||||
}
|
||||
|
||||
private void StopChase()
|
||||
{
|
||||
if (!_isChasing) return;
|
||||
|
||||
_isChasing = false;
|
||||
_currentSpeed = patrolSpeed;
|
||||
|
||||
if (siren != null)
|
||||
siren.isSirenOn = false;
|
||||
}
|
||||
|
||||
private void MoveTowards(Vector3 target)
|
||||
{
|
||||
Vector3 targetPos = new Vector3(target.x, transform.position.y, target.z);
|
||||
Vector3 direction = (targetPos - transform.position).normalized;
|
||||
|
||||
transform.position += direction * _currentSpeed * Time.deltaTime;
|
||||
}
|
||||
|
||||
private void RotateTowards(Vector3 target)
|
||||
{
|
||||
Vector3 direction = new Vector3(
|
||||
target.x - transform.position.x,
|
||||
0f,
|
||||
target.z - transform.position.z
|
||||
);
|
||||
|
||||
if (direction == Vector3.zero) return;
|
||||
|
||||
Quaternion targetRotation = Quaternion.LookRotation(direction);
|
||||
|
||||
transform.rotation = Quaternion.Slerp(
|
||||
transform.rotation,
|
||||
targetRotation,
|
||||
rotationSpeed * Time.deltaTime
|
||||
);
|
||||
}
|
||||
|
||||
private void OnCollisionEnter(Collision collision)
|
||||
{
|
||||
|
||||
if (collision.gameObject.CompareTag("Player"))
|
||||
{
|
||||
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user