using UnityEngine; using System.Collections; [RequireComponent(typeof(Renderer))] public class MirrorReflection : MonoBehaviour { public Camera mirrorCamera; // Η κάμερα του καθρέφτη public Camera mainCamera; // Η κύρια κάμερα του παίκτη private Transform mirrorTransform; // Ρυθμίσεις FOV public float minFOV = 50f; public float maxFOV = 120f; public float minDistance = 1f; public float maxDistance = 10f; // Ρύθμιση έντασης της πλευρικής μετατόπισης public float lateralEffectStrength = 0.5f; // Μικρότερη τιμή σημαίνει λιγότερη κίνηση public MeshRenderer mirrorRenderer; private Material mirrorMaterial; private Coroutine fadeCoroutine; void Start() { mirrorTransform = transform; if (mainCamera == null) { mainCamera = Camera.main; } // Παίρνουμε το Material του καθρέφτη if (mirrorRenderer != null) { mirrorMaterial = mirrorRenderer.material; } // Αρχικά, απενεργοποιούμε την κάμερα του καθρέφτη if (mirrorCamera != null) { mirrorCamera.gameObject.SetActive(false); } } void LateUpdate() { if (mirrorCamera == null || mainCamera == null) return; // Υπολογισμός απόστασης παίκτη-καθρέφτη float distance = Vector3.Distance(mainCamera.transform.position, mirrorTransform.position); float newFOV = Mathf.Lerp(minFOV, maxFOV, Mathf.InverseLerp(minDistance, maxDistance, distance)); mirrorCamera.fieldOfView = newFOV; // Υπολογισμός θέσης κάμερας του καθρέφτη με βάση τη θέση της mainCamera Vector3 mirrorNormal = mirrorTransform.forward; Vector3 cameraToMirror = mainCamera.transform.position - mirrorTransform.position; // Υπολογίζουμε τη θέση του παίκτη σε σχέση με τον καθρέφτη (δεξιά/αριστερά) Vector3 rightVector = mirrorTransform.right; // Δεξιά κατεύθυνση του καθρέφτη float lateralOffset = Vector3.Dot(cameraToMirror, rightVector); // Αντιστρέφουμε την κατεύθυνση της μετατόπισης float adjustedLateralOffset = -lateralOffset * lateralEffectStrength * Mathf.Clamp(distance / maxDistance, 0.2f, 1f); // Δημιουργία νέας κατεύθυνσης της mirrorCamera με βάση το αναστραμμένο lateralOffset Vector3 newLookAtPosition = mirrorTransform.position - (rightVector * adjustedLateralOffset); mirrorCamera.transform.LookAt(newLookAtPosition); } private void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Player")) { if (mirrorCamera != null) { mirrorCamera.gameObject.SetActive(true); // Ενεργοποίηση της κάμερας print("pUSSAY"); } // Ξεκινάμε το fade-in animation if (fadeCoroutine != null) StopCoroutine(fadeCoroutine); fadeCoroutine = StartCoroutine(FadeMirror(0f, 1f, 1f)); // Από 0 σε 1 σε 1 δευτερόλεπτο } } private void OnTriggerExit(Collider other) { if (other.gameObject.CompareTag("Player")) { if (mirrorCamera != null) { mirrorCamera.gameObject.SetActive(false); // Απενεργοποίηση της κάμερας } // Ξεκινάμε το fade-out animation if (fadeCoroutine != null) StopCoroutine(fadeCoroutine); fadeCoroutine = StartCoroutine(FadeMirror(1f, 0f, 1f)); // Από 1 σε 0 σε 1 δευτερόλεπτο } } IEnumerator FadeMirror(float startAlpha, float targetAlpha, float duration) { if (mirrorMaterial == null) yield break; float time = 0f; Color color = mirrorMaterial.color; while (time < duration) { time += Time.deltaTime; float alpha = Mathf.Lerp(startAlpha, targetAlpha, time / duration); mirrorMaterial.color = new Color(color.r, color.g, color.b, alpha); yield return null; } // Βεβαιωνόμαστε ότι το alpha είναι ακριβώς στο targetAlpha mirrorMaterial.color = new Color(color.r, color.g, color.b, targetAlpha); } }