57 lines
2.8 KiB
C#
57 lines
2.8 KiB
C#
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);
|
||
}
|
||
}
|