using System; using UnityEngine; namespace AllIn1VfxToolkit { public class AllIn1VfxScrollShaderProperty : MonoBehaviour { [SerializeField] private string numericPropertyName = "_HsvShift"; [SerializeField] private float scrollSpeed; [Header("There are 3 modifiers, just pick 1")] [Space, SerializeField] private bool backAndForth; [SerializeField] private float maxValue = 1f; private float iniValue; private bool goingUp; [Space, SerializeField] private bool applyModulo; [SerializeField] private float modulo = 360f; [Space, SerializeField] private bool stopAtValue; [SerializeField] private float stopValue; [Space, SerializeField, Header("If missing uses an instance of the currently used Material")] private Material mat; private Material originalMat; private bool restoreMaterialOnDisable = false; private int propertyShaderID; private float currValue; private void Start() { //Get material if missing if(mat == null) mat = GetComponent().material; else { originalMat = new Material(mat); restoreMaterialOnDisable = true; } //Show error message if material or numericPropertyName property error //Otherwise cache shader property ID if (mat == null) DestroyComponentAndLogError(gameObject.name + " has no valid Material, deleting AllIn1VfxScrollShaderProperty component"); else { if (mat.HasProperty(numericPropertyName)) propertyShaderID = Shader.PropertyToID(numericPropertyName); else DestroyComponentAndLogError(gameObject.name + "'s Material doesn't have a " + numericPropertyName + " property"); currValue = mat.GetFloat(propertyShaderID); if(backAndForth || stopAtValue) { iniValue = currValue; goingUp = iniValue < maxValue; if(!goingUp && scrollSpeed > 0) scrollSpeed *= -1f; if(goingUp && scrollSpeed < 0) scrollSpeed *= -1f; } } } private bool isValid = true; private void Update() { if(mat == null) { if(isValid) { Debug.LogError("The object " + gameObject.name + " has no Material and you are trying to access it. Please take a look"); isValid = false; } return; } currValue += scrollSpeed * Time.deltaTime; if(backAndForth) { if(goingUp && currValue >= maxValue) FlipGoingUp(); else if(!goingUp && currValue <= iniValue) FlipGoingUp(); } if (applyModulo) currValue %= modulo; if(stopAtValue) { if(goingUp && currValue >= stopValue) scrollSpeed = 0f; else if(!goingUp && currValue <= stopValue) scrollSpeed = 0f; } mat.SetFloat(propertyShaderID, currValue); } private void FlipGoingUp() { goingUp = !goingUp; scrollSpeed *= -1f; } private void DestroyComponentAndLogError(string logError) { Debug.LogError(logError); Destroy(this); } private void OnDisable() { if(restoreMaterialOnDisable) mat.CopyPropertiesFromMaterial(originalMat); } } }