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