70 lines
2.7 KiB
C#
70 lines
2.7 KiB
C#
using UnityEngine;
|
||
using System.Collections.Generic;
|
||
|
||
public class StatueDetection : MonoBehaviour
|
||
{
|
||
public List<Transform> statues; // Λίστα με όλα τα αγάλματα
|
||
[SerializeField] private float viewRadius = 10f; // Πόσο μακριά μπορεί να δει ο παίκτης
|
||
[SerializeField] private float viewAngle = 90f; // Γωνία οπτικού πεδίου του παίκτη
|
||
|
||
private void Update()
|
||
{
|
||
CheckStatuesInView();
|
||
}
|
||
|
||
// Έλεγχος αν κάποιο άγαλμα είναι εντός οπτικού πεδίου
|
||
public bool CheckStatuesInView()
|
||
{
|
||
foreach (Transform statue in statues)
|
||
{
|
||
if (IsLookingAtStatue(statue))
|
||
{
|
||
Debug.Log($"Looking at statue: {statue.name}");
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
// Μέθοδος για να ελέγξουμε αν ο παίκτης κοιτάζει συγκεκριμένο άγαλμα
|
||
private bool IsLookingAtStatue(Transform statue)
|
||
{
|
||
// Υπολογισμός κατεύθυνσης από τον παίκτη προς το άγαλμα
|
||
Vector3 dirToStatue = (statue.position - transform.position).normalized;
|
||
|
||
// Υπολογισμός απόστασης προς το άγαλμα
|
||
float distToStatue = Vector3.Distance(transform.position, statue.position);
|
||
|
||
// Έλεγχος αν το άγαλμα είναι εντός του radius και της γωνίας θέασης
|
||
if (distToStatue <= viewRadius && Vector3.Angle(transform.forward, dirToStatue) < viewAngle / 2)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
// Για debugging - σχεδιάζουμε το οπτικό πεδίο
|
||
private void OnDrawGizmos()
|
||
{
|
||
Gizmos.color = Color.blue;
|
||
|
||
// Σχεδίαση σφαίρας που αντιπροσωπεύει το radius
|
||
Gizmos.DrawWireSphere(transform.position, viewRadius);
|
||
|
||
// Σχεδίαση γραμμών που αντιπροσωπεύουν τη γωνία θέασης
|
||
Vector3 viewAngleA = DirFromAngle(-viewAngle / 2);
|
||
Vector3 viewAngleB = DirFromAngle(viewAngle / 2);
|
||
|
||
Gizmos.DrawLine(transform.position, transform.position + viewAngleA * viewRadius);
|
||
Gizmos.DrawLine(transform.position, transform.position + viewAngleB * viewRadius);
|
||
}
|
||
|
||
// Βοηθητική συνάρτηση για υπολογισμό κατεύθυνσης
|
||
public Vector3 DirFromAngle(float angleInDegrees)
|
||
{
|
||
angleInDegrees += transform.eulerAngles.y;
|
||
return new Vector3(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), 0, Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));
|
||
}
|
||
} |