Files
HauntedBloodlines/Assets/Scripts/Effects/MirrorReflection.cs
2025-05-29 22:31:40 +03:00

122 lines
4.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}