122 lines
4.6 KiB
C#
122 lines
4.6 KiB
C#
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);
|
||
}
|
||
}
|