using UnityEngine; using System.Collections; using System.Collections.Generic; // You can execute this in the editor as long as you don't instantiate the material //[ExecuteInEditMode] public class Smear : MonoBehaviour { Queue m_recentPositions = new Queue(); public int FramesBufferSize = 0; public Renderer Renderer = null; private Material m_instancedMaterial; private Material InstancedMaterial { get { return m_instancedMaterial; } set { m_instancedMaterial = value; } } private void Start() { // Instantiate the material so every object has a unique smear effect InstancedMaterial = Renderer.material; // Use this instead if you want to affect all objects at the same time or if you want to run in the editor //InstancedMaterial = Renderer.sharedMaterial; } private void LateUpdate() { // Feed the previous position in the queue to the shader if ( m_recentPositions.Count > FramesBufferSize ) InstancedMaterial.SetVector( "_PrevPosition", m_recentPositions.Dequeue() ); // Feed the current anchor position to the shader InstancedMaterial.SetVector( "_Position", transform.position ); m_recentPositions.Enqueue( transform.position ); } }