Initial commit

This commit is contained in:
2026-02-18 00:08:49 +02:00
commit 5105b6b060
1270 changed files with 513010 additions and 0 deletions

168
Assets/Scripts/CarPatrol.cs Normal file
View 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);
}
}
}