109 lines
3.6 KiB
C#
109 lines
3.6 KiB
C#
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<Renderer>().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);
|
|
}
|
|
}
|
|
} |