using UnityEngine; using System.Collections; public class FadeInOutShaderFloat : MonoBehaviour { public string PropertyName = "_CutOut"; public float MaxFloat = 1; public float StartDelay = 0; public float FadeInSpeed = 0; public float FadeOutDelay = 0; public float FadeOutSpeed = 0; public bool FadeOutAfterCollision; public bool UseHideStatus; private Material OwnMaterial; private Material mat; private float oldFloat, currentFloat; private bool canStart, canStartFadeOut, fadeInComplited, fadeOutComplited, previousFrameVisibleStatus; private bool isCollisionEnter; private bool isStartDelay, isIn, isOut; private EffectSettings effectSettings; private bool isInitialized; #region Non-public methods private void GetEffectSettingsComponent(Transform tr) { var parent = tr.parent; if (parent!=null) { effectSettings = parent.GetComponentInChildren(); if (effectSettings==null) GetEffectSettingsComponent(parent.transform); } } private void Start() { GetEffectSettingsComponent(transform); if (effectSettings!=null) effectSettings.CollisionEnter += prefabSettings_CollisionEnter; InitMaterial(); } public void UpdateMaterial(Material instanceMaterial) { mat = instanceMaterial; InitMaterial(); } private void InitMaterial() { if (isInitialized) return; if (GetComponent() != null) mat = GetComponent().material; else { var lineRenderer = GetComponent(); if (lineRenderer != null) mat = lineRenderer.material; else { var projector = GetComponent(); if (projector != null) { if (!projector.material.name.EndsWith("(Instance)")) projector.material = new Material(projector.material) {name = projector.material.name + " (Instance)"}; mat = projector.material; } } } if (mat == null) return; isStartDelay = StartDelay > 0.001f; isIn = FadeInSpeed > 0.001f; isOut = FadeOutSpeed > 0.001f; InitDefaultVariables(); isInitialized = true; } private void InitDefaultVariables() { fadeInComplited = false; fadeOutComplited = false; canStartFadeOut = false; canStart = false; isCollisionEnter = false; oldFloat = 0; currentFloat = MaxFloat; if (isIn) currentFloat = 0; mat.SetFloat(PropertyName, currentFloat); if (isStartDelay) Invoke("SetupStartDelay", StartDelay); else canStart = true; if (!isIn) { if (!FadeOutAfterCollision) Invoke("SetupFadeOutDelay", FadeOutDelay); oldFloat = MaxFloat; } } private void prefabSettings_CollisionEnter(object sender, CollisionInfo e) { isCollisionEnter = true; if (!isIn && FadeOutAfterCollision) Invoke("SetupFadeOutDelay", FadeOutDelay); } void OnEnable() { if (isInitialized) InitDefaultVariables(); } private void SetupStartDelay() { canStart = true; } private void SetupFadeOutDelay() { canStartFadeOut = true; } private void Update() { if (!canStart) return; if (effectSettings != null && UseHideStatus) { if (!effectSettings.IsVisible && fadeInComplited) fadeInComplited = false; if (effectSettings.IsVisible && fadeOutComplited) fadeOutComplited = false; } if (UseHideStatus) { if (isIn) { if (effectSettings!=null && effectSettings.IsVisible && !fadeInComplited) FadeIn(); } if (isOut) { if (effectSettings!=null && !effectSettings.IsVisible && !fadeOutComplited) FadeOut(); } } else if (!FadeOutAfterCollision) { if (isIn) { if (!fadeInComplited) FadeIn(); } if (isOut && canStartFadeOut) { if (!fadeOutComplited) FadeOut(); } } else { if (isIn) { if (!fadeInComplited) FadeIn(); } if (isOut && isCollisionEnter && canStartFadeOut && !fadeOutComplited) FadeOut(); } } private void FadeIn() { currentFloat = oldFloat + Time.deltaTime / FadeInSpeed * MaxFloat; if (currentFloat >= MaxFloat) { fadeInComplited = true; currentFloat = MaxFloat; Invoke("SetupFadeOutDelay", FadeOutDelay); } mat.SetFloat(PropertyName, currentFloat); oldFloat = currentFloat; } private void FadeOut() { currentFloat = oldFloat - Time.deltaTime / FadeOutSpeed * MaxFloat; if (currentFloat <= 0) { currentFloat = 0; fadeOutComplited = true; } mat.SetFloat(PropertyName, currentFloat); oldFloat = currentFloat; } #endregion }