You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			136 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			136 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
| using System;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace AllIn1VfxToolkit
 | |
| {
 | |
|     public class AllIn1VfxScrollShaderTexture : MonoBehaviour
 | |
|     {
 | |
|         [SerializeField] private string texturePropertyName = "_MainTex";
 | |
|         [SerializeField] private Vector2 scrollSpeed = Vector2.zero;
 | |
|         
 | |
|         [Space, Header("True changes tex offset, false to change tex scale")] [SerializeField]
 | |
|         private bool textureOffset = true;
 | |
|         
 | |
|         [Header("There are 3 modifiers, just pick 1")]
 | |
|         [Space, SerializeField] private bool backAndForth;
 | |
|         [SerializeField] private Vector2 maxValue = Vector2.one;
 | |
|         private Vector2 iniValue = Vector2.zero;
 | |
|         private bool goingUpX, goingUpY;
 | |
| 
 | |
|         [Space, SerializeField] private bool applyModulo;
 | |
|         [SerializeField] private Vector2 modulo = Vector2.one;
 | |
|         
 | |
|         [Space, SerializeField] private bool stopAtValue;
 | |
|         [SerializeField] private Vector2 stopValue = Vector2.zero;
 | |
| 
 | |
|         [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 Vector2 currValue = Vector2.zero;
 | |
| 
 | |
|         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 AllIn1VfxScrollShaderTexture component");
 | |
|             else
 | |
|             {
 | |
|                 if (mat.HasProperty(texturePropertyName)) propertyShaderID = Shader.PropertyToID(texturePropertyName);
 | |
|                 else DestroyComponentAndLogError(gameObject.name + "'s Material doesn't have a " + texturePropertyName + " texture property");
 | |
| 
 | |
|                 if(textureOffset) currValue = mat.GetTextureOffset(texturePropertyName);
 | |
|                 else currValue = mat.GetTextureScale(texturePropertyName);
 | |
|                 if(backAndForth || stopAtValue)
 | |
|                 {
 | |
|                     iniValue = currValue;
 | |
|                     goingUpX = iniValue.x < maxValue.x;
 | |
|                     if(!goingUpX && scrollSpeed.x > 0) scrollSpeed *= -1f;
 | |
|                     if(goingUpX && scrollSpeed.x < 0) scrollSpeed *= -1f;
 | |
|                     
 | |
|                     goingUpY = iniValue.y < maxValue.y;
 | |
|                     if(!goingUpY && scrollSpeed.y > 0) scrollSpeed *= -1f;
 | |
|                     if(goingUpY && scrollSpeed.y < 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(goingUpX && currValue.x >= maxValue.x) FlipGoingUp(true);
 | |
|                 else if(!goingUpX && currValue.x <= iniValue.x) FlipGoingUp(true);
 | |
|                 
 | |
|                 if(goingUpY && currValue.y >= maxValue.y) FlipGoingUp(false);
 | |
|                 else if(!goingUpY && currValue.y <= iniValue.y) FlipGoingUp(false);
 | |
|             }
 | |
| 
 | |
|             if(applyModulo)
 | |
|             {
 | |
|                 currValue.x %= modulo.x;
 | |
|                 currValue.y %= modulo.y;
 | |
|             }
 | |
| 
 | |
|             if(stopAtValue)
 | |
|             {
 | |
|                 if(goingUpX && currValue.x >= stopValue.x) scrollSpeed.x = 0f;
 | |
|                 else if(!goingUpX && currValue.x <= stopValue.x) scrollSpeed.x = 0f;
 | |
|                 
 | |
|                 if(goingUpY && currValue.y >= stopValue.y) scrollSpeed.y = 0f;
 | |
|                 else if(!goingUpY && currValue.y <= stopValue.y) scrollSpeed.y = 0f;
 | |
|             }
 | |
|             
 | |
|             if(textureOffset) mat.SetTextureOffset(propertyShaderID, currValue);
 | |
|             else mat.SetTextureScale(propertyShaderID, currValue);
 | |
|         }
 | |
| 
 | |
|         private void FlipGoingUp(bool isXComponent)
 | |
|         {
 | |
|             if(isXComponent)
 | |
|             {
 | |
|                 goingUpX = !goingUpX;
 | |
|                 scrollSpeed.x *= -1f;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 goingUpY = !goingUpY;
 | |
|                 scrollSpeed.y *= -1f;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void DestroyComponentAndLogError(string logError)
 | |
|         {
 | |
|             Debug.LogError(logError);
 | |
|             Destroy(this);
 | |
|         }
 | |
| 
 | |
|         private void OnDisable()
 | |
|         {
 | |
|             if(restoreMaterialOnDisable) mat.CopyPropertiesFromMaterial(originalMat);
 | |
|         }
 | |
|     }
 | |
| } |