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

57 lines
2.8 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 UnityEngine.Rendering.HighDefinition;
public class LightRevealController : MonoBehaviour
{
public Transform spotLightPosition; // Το Spot Light της σκηνής
public DecalProjector decalProjector; // Το υλικό που έχει το Shader
public Transform objectToReveal; // Το αντικείμενο που έχει το υλικό
public float maxDistance = 5f; // Μέγιστη απόσταση όπου το εφέ είναι ενεργό
public float fadeSpeed = 2f; // Ταχύτητα μετάβασης του Fade
public float minThreshold = 0.5f; // Ελάχιστο όριο για την εμφάνιση
public float maxThreshold = 0.9f; // Μέγιστο όριο για την πλήρη εμφάνιση
private Material objectMaterial; // Υλικό του DecalProjector
void Start()
{
if (decalProjector != null)
{
// Δημιουργία αντιγράφου του υλικού του DecalProjector
objectMaterial = new Material(decalProjector.material);
// Εφαρμογή του νέου υλικού στον DecalProjector
decalProjector.material = objectMaterial;
}
spotLightPosition = PlayerFlashlightAccessable.GetInstance().FlashlightSpotLightPosition;
}
void Update()
{
if (spotLightPosition == null || decalProjector == null || objectToReveal == null || objectMaterial == null)
return;
// Υπολογισμός απόστασης φωτός-αντικειμένου
float distance = Vector3.Distance(spotLightPosition.transform.position, objectToReveal.position);
// Υπολογισμός κατεύθυνσης φωτός προς το αντικείμενο
Vector3 lightDirection = (objectToReveal.position - spotLightPosition.transform.position).normalized;
// Υπολογισμός γωνίας μεταξύ του Spot Light και της επιφάνειας
float dotProduct = Vector3.Dot(spotLightPosition.transform.forward, lightDirection);
// Εφαρμογή Min/Max Threshold για τον έλεγχο της εμφάνισης
float angleFactor = Mathf.InverseLerp(minThreshold, maxThreshold, dotProduct);
angleFactor = Mathf.Clamp01(angleFactor); // Περιορίζουμε το range σε [0,1]
// Υπολογισμός του νέου fade value βάσει απόστασης και γωνίας
float newFade = Mathf.Lerp(7f, 0f, angleFactor * (1 - distance / maxDistance));
// Σταδιακή αλλαγή της τιμής fade
float currentFade = objectMaterial.GetFloat("_Fade");
float updatedFade = Mathf.Lerp(currentFade, newFade, Time.deltaTime * fadeSpeed);
objectMaterial.SetFloat("_Fade", updatedFade);
}
}